Add EmitInstToFragment to the generic object streamer.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 2 Dec 2010 05:44:06 +0000 (05:44 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 2 Dec 2010 05:44:06 +0000 (05:44 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120690 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCObjectStreamer.h
lib/MC/MCELFStreamer.cpp
lib/MC/MCMachOStreamer.cpp
lib/MC/MCObjectStreamer.cpp

index 9197ed3fc6ba4849c5c8315853571dc10b04f22a..f5ee41aed104b422825f04cc24f1fd41c80d90e9 100644 (file)
@@ -33,7 +33,6 @@ class MCObjectStreamer : public MCStreamer {
   MCAssembler *Assembler;
   MCSectionData *CurSectionData;
 
-  virtual void EmitInstToFragment(const MCInst &Inst) = 0;
   virtual void EmitInstToData(const MCInst &Inst) = 0;
 
 protected:
@@ -67,6 +66,7 @@ public:
   virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol);
   virtual void SwitchSection(const MCSection *Section);
   virtual void EmitInstruction(const MCInst &Inst);
+  virtual void EmitInstToFragment(const MCInst &Inst);
   virtual void Finish();
 
   /// @}
index 9dfc16e20984a4525d7df43f01d97e4aafa0764b..f7cb3edb0db18e6dcf03394c18b2182cefa0325e 100644 (file)
@@ -459,23 +459,11 @@ void  MCELFStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) {
 }
 
 void MCELFStreamer::EmitInstToFragment(const MCInst &Inst) {
-  MCInstFragment *IF = new MCInstFragment(Inst, getCurrentSectionData());
+  this->MCObjectStreamer::EmitInstToFragment(Inst);
+  MCInstFragment &F = *cast<MCInstFragment>(getCurrentFragment());
 
-  // Add the fixups and data.
-  //
-  // FIXME: Revisit this design decision when relaxation is done, we may be
-  // able to get away with not storing any extra data in the MCInst.
-  SmallVector<MCFixup, 4> Fixups;
-  SmallString<256> Code;
-  raw_svector_ostream VecOS(Code);
-  getAssembler().getEmitter().EncodeInstruction(Inst, VecOS, Fixups);
-  VecOS.flush();
-
-  for (unsigned i = 0, e = Fixups.size(); i != e; ++i)
-    fixSymbolsInTLSFixups(Fixups[i].getValue());
-
-  IF->getCode() = Code;
-  IF->getFixups() = Fixups;
+  for (unsigned i = 0, e = F.getFixups().size(); i != e; ++i)
+    fixSymbolsInTLSFixups(F.getFixups()[i].getValue());
 }
 
 void MCELFStreamer::EmitInstToData(const MCInst &Inst) {
index 682454398d44a8991fda3e412566a63506220cbc..4da4ed8ac78442aa31fcdd1acf3b62e2c1e3c439 100644 (file)
@@ -31,7 +31,6 @@ namespace {
 
 class MCMachOStreamer : public MCObjectStreamer {
 private:
-  virtual void EmitInstToFragment(const MCInst &Inst);
   virtual void EmitInstToData(const MCInst &Inst);
 
 public:
@@ -341,23 +340,6 @@ void MCMachOStreamer::EmitValueToOffset(const MCExpr *Offset,
   new MCOrgFragment(*Offset, Value, getCurrentSectionData());
 }
 
-void MCMachOStreamer::EmitInstToFragment(const MCInst &Inst) {
-  MCInstFragment *IF = new MCInstFragment(Inst, getCurrentSectionData());
-
-  // Add the fixups and data.
-  //
-  // FIXME: Revisit this design decision when relaxation is done, we may be
-  // able to get away with not storing any extra data in the MCInst.
-  SmallVector<MCFixup, 4> Fixups;
-  SmallString<256> Code;
-  raw_svector_ostream VecOS(Code);
-  getAssembler().getEmitter().EncodeInstruction(Inst, VecOS, Fixups);
-  VecOS.flush();
-
-  IF->getCode() = Code;
-  IF->getFixups() = Fixups;
-}
-
 void MCMachOStreamer::EmitInstToData(const MCInst &Inst) {
   MCDataFragment *DF = getOrCreateDataFragment();
 
index 111bc1be065c9a1873813d6dc9cdebb4939f1351..a8ea1a423da11c00cb3e1c0033bd132808232393 100644 (file)
@@ -172,6 +172,13 @@ void MCObjectStreamer::EmitInstruction(const MCInst &Inst) {
   EmitInstToFragment(Inst);
 }
 
+void MCObjectStreamer::EmitInstToFragment(const MCInst &Inst) {
+  MCInstFragment *IF = new MCInstFragment(Inst, getCurrentSectionData());
+
+  raw_svector_ostream VecOS(IF->getCode());
+  getAssembler().getEmitter().EncodeInstruction(Inst, VecOS, IF->getFixups());
+}
+
 void MCObjectStreamer::Finish() {
   getAssembler().Finish();
 }