Add a new virtual EmitStartOfAsmFile method to the AsmPrinter and use this
authorBob Wilson <bob.wilson@apple.com>
Wed, 30 Sep 2009 22:06:26 +0000 (22:06 +0000)
committerBob Wilson <bob.wilson@apple.com>
Wed, 30 Sep 2009 22:06:26 +0000 (22:06 +0000)
to emit target-specific things at the beginning of the asm output.  This
fixes a problem for PPC, where the text sections are not being kept together
as expected.  The base class doInitialization code calls DW->BeginModule()
which emits a bunch of DWARF section directives.  The PPC doInitialization
code then emits all the TEXT section directives, with the intention that they
will be kept together. But as I understand it, the Darwin assembler treats
the default TEXT section as a special case and moves it to the beginning of
the file, which means that all those DWARF sections are in the middle of
the text.  With this change, the EmitStartOfAsmFile hook is called before
the DWARF section directives are emitted, so that all the PPC text section
directives come out right at the beginning of the file.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83176 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/AsmPrinter.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
lib/Target/Alpha/AsmPrinter/AlphaAsmPrinter.cpp
lib/Target/Mips/AsmPrinter/MipsAsmPrinter.cpp
lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp

index 84d0a438e54e00cec817c9a89595d42b83cbbfe8..918b5a6b4d72a3a2a092d60423a5f5dc84278922 100644 (file)
@@ -169,6 +169,10 @@ namespace llvm {
     /// call this implementation.
     bool doInitialization(Module &M);
 
+    /// EmitStartOfAsmFile - This virtual method can be overridden by targets
+    /// that want to emit something at the start of their file.
+    virtual void EmitStartOfAsmFile(Module &M) {}
+    
     /// EmitEndOfAsmFile - This virtual method can be overridden by targets that
     /// want to emit something at the end of their file.
     virtual void EmitEndOfAsmFile(Module &M) {}
index 9c6c5b5c071bb08326eeab99c6adef8759d0c5e2..14dc8981f9944b3dfbb319ec05e93feabc4b717f 100644 (file)
@@ -110,8 +110,8 @@ bool AsmPrinter::doInitialization(Module &M) {
   if (MAI->doesAllowNameToStartWithDigit())
     Mang->setSymbolsCanStartWithDigit(true);
   
-  GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
-  assert(MI && "AsmPrinter didn't require GCModuleInfo?");
+  // Allow the target to emit any magic that it wants at the start of the file.
+  EmitStartOfAsmFile(M);
 
   if (MAI->hasSingleParameterDotFile()) {
     /* Very minimal debug info. It is ignored if we emit actual
@@ -120,6 +120,8 @@ bool AsmPrinter::doInitialization(Module &M) {
     O << "\t.file\t\"" << M.getModuleIdentifier() << "\"\n";
   }
 
+  GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
+  assert(MI && "AsmPrinter didn't require GCModuleInfo?");
   for (GCModuleInfo::iterator I = MI->begin(), E = MI->end(); I != E; ++I)
     if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*I))
       MP->beginAssembly(O, *this, *MAI);
index 71497b41653d3364f0d7f3570431db7c28f7f14f..b496a810b02b614cab5845979da5b76305f55d36 100644 (file)
@@ -149,8 +149,8 @@ namespace {
 
     void printMachineInstruction(const MachineInstr *MI);
     bool runOnMachineFunction(MachineFunction &F);
-    bool doInitialization(Module &M);
     bool doFinalization(Module &M);
+    void EmitStartOfAsmFile(Module &M);
 
     /// EmitMachineConstantPoolValue - Print a machine constantpool value to
     /// the .s file.
@@ -1043,8 +1043,7 @@ void ARMAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
   O << '\n';
 }
 
-bool ARMAsmPrinter::doInitialization(Module &M) {
-
+void ARMAsmPrinter::EmitStartOfAsmFile(Module &M) {
   if (Subtarget->isTargetDarwin()) {
     Reloc::Model RelocM = TM.getRelocationModel();
     if (RelocM == Reloc::PIC_ || RelocM == Reloc::DynamicNoPIC) {
@@ -1064,8 +1063,6 @@ bool ARMAsmPrinter::doInitialization(Module &M) {
     }
   }
 
-  bool Result = AsmPrinter::doInitialization(M);
-
   // Use unified assembler syntax mode for Thumb.
   if (Subtarget->isThumb())
     O << "\t.syntax unified\n";
@@ -1102,8 +1099,6 @@ bool ARMAsmPrinter::doInitialization(Module &M) {
 
     // FIXME: Should we signal R9 usage?
   }
-
-  return Result;
 }
 
 void ARMAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
index 475477337ad7345980ef53e21cff9df2e9e29de1..0e36df3fa31161446b8eb97aa75db3e02af85dc4 100644 (file)
@@ -56,7 +56,7 @@ namespace {
     void printBaseOffsetPair(const MachineInstr *MI, int i, bool brackets=true);
     void PrintGlobalVariable(const GlobalVariable *GVar);
     bool runOnMachineFunction(MachineFunction &F);
-    bool doInitialization(Module &M);
+    void EmitStartOfAsmFile(Module &M);
 
     bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
                          unsigned AsmVariant, const char *ExtraCode);
@@ -193,14 +193,12 @@ bool AlphaAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
   return false;
 }
 
-bool AlphaAsmPrinter::doInitialization(Module &M)
-{
-  if(TM.getSubtarget<AlphaSubtarget>().hasCT())
+void AlphaAsmPrinter::EmitStartOfAsmFile(Module &M) {
+  if (TM.getSubtarget<AlphaSubtarget>().hasCT())
     O << "\t.arch ev6\n"; //This might need to be ev67, so leave this test here
   else
     O << "\t.arch ev6\n";
   O << "\t.set noat\n";
-  return AsmPrinter::doInitialization(M);
 }
 
 void AlphaAsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) {
index 49626033043ccee404ed506e30dd53514c7efe3f..fb5e5fc93bd6df9aab072013ae0c126a6a0c7f2c 100644 (file)
@@ -85,7 +85,7 @@ namespace {
     static const char *getRegisterName(unsigned RegNo);
 
     bool runOnMachineFunction(MachineFunction &F);
-    bool doInitialization(Module &M);
+    void EmitStartOfAsmFile(Module &M);
   };
 } // end of anonymous namespace
 
@@ -408,7 +408,7 @@ printFCCOperand(const MachineInstr *MI, int opNum, const char *Modifier) {
   O << Mips::MipsFCCToString((Mips::CondCode)MO.getImm()); 
 }
 
-bool MipsAsmPrinter::doInitialization(Module &M) {
+void MipsAsmPrinter::EmitStartOfAsmFile(Module &M) {
   // FIXME: Use SwitchSection.
   
   // Tell the assembler which ABI we are using
@@ -421,8 +421,6 @@ bool MipsAsmPrinter::doInitialization(Module &M) {
 
   // return to previous section
   O << "\t.previous" << '\n'; 
-
-  return AsmPrinter::doInitialization(M);
 }
 
 void MipsAsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) {
index 09f4af35a28d38c4b564a4086517d216e4c2138c..f55e6a14786444453272d981db98020f20800621 100644 (file)
@@ -381,8 +381,8 @@ namespace {
     }
 
     bool runOnMachineFunction(MachineFunction &F);
-    bool doInitialization(Module &M);
     bool doFinalization(Module &M);
+    void EmitStartOfAsmFile(Module &M);
 
     void getAnalysisUsage(AnalysisUsage &AU) const {
       AU.setPreservesAll();
@@ -862,7 +862,7 @@ bool PPCDarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
 }
 
 
-bool PPCDarwinAsmPrinter::doInitialization(Module &M) {
+void PPCDarwinAsmPrinter::EmitStartOfAsmFile(Module &M) {
   static const char *const CPUDirectives[] = {
     "",
     "ppc",
@@ -885,9 +885,6 @@ bool PPCDarwinAsmPrinter::doInitialization(Module &M) {
   assert(Directive <= PPC::DIR_64 && "Directive out of range.");
   O << "\t.machine " << CPUDirectives[Directive] << '\n';
 
-  bool Result = AsmPrinter::doInitialization(M);
-  assert(MMI);
-
   // Prime text sections so they are adjacent.  This reduces the likelihood a
   // large data or debug section causes a branch to exceed 16M limit.
   TargetLoweringObjectFileMachO &TLOFMacho = 
@@ -907,8 +904,6 @@ bool PPCDarwinAsmPrinter::doInitialization(Module &M) {
                                       16, SectionKind::getText()));
   }
   OutStreamer.SwitchSection(getObjFileLowering().getTextSection());
-
-  return Result;
 }
 
 void PPCDarwinAsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) {