Add more reset methods to make all objects that the backend may use for outputting...
authorPedro Artigas <partigas@apple.com>
Fri, 14 Dec 2012 18:52:11 +0000 (18:52 +0000)
committerPedro Artigas <partigas@apple.com>
Fri, 14 Dec 2012 18:52:11 +0000 (18:52 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@170227 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCAsmBackend.h
include/llvm/MC/MCCodeEmitter.h
include/llvm/MC/MCMachObjectWriter.h
include/llvm/MC/MCObjectWriter.h
lib/MC/MCAssembler.cpp
lib/MC/MCObjectStreamer.cpp
lib/MC/MachObjectWriter.cpp

index 72ed1a317c55775daaf16f1593afaac77805fa72..48bd9d074203c40711c152d7a18eb671469e6b97 100644 (file)
@@ -41,6 +41,9 @@ protected: // Can only create subclasses.
 public:
   virtual ~MCAsmBackend();
 
+  /// lifetime management
+  virtual void reset() { }
+
   /// createObjectWriter - Create a new MCObjectWriter instance for use by the
   /// assembler backend to emit the final object file.
   virtual MCObjectWriter *createObjectWriter(raw_ostream &OS) const = 0;
index 05748909029303657c2a3cd69a4e8feed6cab274..9bfa08eb5d015bbfac7fc9f14bae31de8ed776d9 100644 (file)
@@ -29,6 +29,9 @@ protected: // Can only create subclasses.
 public:
   virtual ~MCCodeEmitter();
 
+  /// Lifetime management
+  virtual void reset() { }
+
   /// EncodeInstruction - Encode the given \p Inst to bytes on the output
   /// stream \p OS.
   virtual void EncodeInstruction(const MCInst &Inst, raw_ostream &OS,
index efaabfb9e88b242f769202c02b8f84994f30bafd..2ddde0b68a7778c797e93f49839ef438b5e90778 100644 (file)
@@ -45,6 +45,13 @@ protected:
 public:
   virtual ~MCMachObjectTargetWriter();
 
+  /// @name Lifetime Management
+  /// @{
+
+  virtual void reset() {};
+
+  /// @}
+
   /// @name Accessors
   /// @{
 
@@ -111,6 +118,13 @@ public:
     : MCObjectWriter(_OS, _IsLittleEndian), TargetObjectWriter(MOTW) {
   }
 
+  /// @name Lifetime management Methods
+  /// @{
+
+  virtual void reset();
+
+  /// @}
+
   /// @name Utility Methods
   /// @{
 
index f77b7d853db5601d0b3f62f4b544f32adfff7397..9d5c1a785eb953460f3b29797f6d88c9a5486294 100644 (file)
@@ -51,6 +51,9 @@ protected: // Can only create subclasses.
 public:
   virtual ~MCObjectWriter();
 
+  /// lifetime management
+  virtual void reset() { }
+
   bool isLittleEndian() const { return IsLittleEndian; }
 
   raw_ostream &getStream() { return OS; }
index 8ca849be17b43424175bd044be0ca9a34c706780..2558eff045507daf1e220b37dbcee47338d9bca6 100644 (file)
@@ -232,6 +232,11 @@ void MCAssembler::reset() {
   RelaxAll = false;
   NoExecStack = false;
   SubsectionsViaSymbols = false;
+
+  // reset objects owned by us
+  getBackend().reset();
+  getEmitter().reset();
+  getWriter().reset();
 }
 
 bool MCAssembler::isSymbolLinkerVisible(const MCSymbol &Symbol) const {
index 98c8bdac3ab216297d3495ca37fdd5b3975c273a..c69d76428cbcf2d3ecbb1f8f02d0b40d8d3e176e 100644 (file)
@@ -45,7 +45,8 @@ MCObjectStreamer::~MCObjectStreamer() {
 }
 
 void MCObjectStreamer::reset() {
-  Assembler->reset();
+  if (Assembler)
+    Assembler->reset();
   MCStreamer::reset();
 }
 
index cc8d2fb4771e04d8356e21f4bc7f0445a337b26d..0098bead45ceeb69735c142c4d6db8082adf596b 100644 (file)
 using namespace llvm;
 using namespace llvm::object;
 
+void MachObjectWriter::reset() {
+  Relocations.clear();
+  IndirectSymBase.clear();
+  StringTable.clear();
+  LocalSymbolData.clear();
+  ExternalSymbolData.clear();
+  UndefinedSymbolData.clear();
+  MCObjectWriter::reset();
+}
+
 bool MachObjectWriter::
 doesSymbolRequireExternRelocation(const MCSymbolData *SD) {
   // Undefined symbols are always extern.