From: Evan Cheng Date: Tue, 7 Mar 2006 02:23:26 +0000 (+0000) Subject: - Emit subsections_via_symbols for Darwin. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d594881a28a3351395118619176dfe42410b3c44;p=oota-llvm.git - Emit subsections_via_symbols for Darwin. - Conditionalize Dwarf debugging output (Darwin only for now). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26582 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86ATTAsmPrinter.cpp b/lib/Target/X86/X86ATTAsmPrinter.cpp index e50100e7528..f1b53fd7ea3 100755 --- a/lib/Target/X86/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/X86ATTAsmPrinter.cpp @@ -27,15 +27,19 @@ using namespace x86; /// method to print assembly for each instruction. /// bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) { - // Let PassManager know we need debug information and relay - // the MachineDebugInfo address on to DwarfWriter. - DW.SetDebugInfo(&getAnalysis()); + // if (forDarwin) { + // Let PassManager know we need debug information and relay + // the MachineDebugInfo address on to DwarfWriter. + DW.SetDebugInfo(&getAnalysis()); + // } SetupMachineFunction(MF); O << "\n\n"; - // Emit pre-function debug information. - DW.BeginFunction(MF); + if (forDarwin) { + // Emit pre-function debug information. + DW.BeginFunction(MF); + } // Print out constants referenced by the function EmitConstantPool(MF.getConstantPool()); @@ -88,8 +92,10 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) { if (HasDotTypeDotSizeDirective) O << "\t.size " << CurrentFnName << ", .-" << CurrentFnName << "\n"; - // Emit post-function debug information. - DW.EndFunction(MF); + if (forDarwin) { + // Emit post-function debug information. + DW.EndFunction(MF); + } // We didn't modify anything. return false; diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp index edc2397e604..a5e7008bc0b 100644 --- a/lib/Target/X86/X86AsmPrinter.cpp +++ b/lib/Target/X86/X86AsmPrinter.cpp @@ -75,8 +75,10 @@ bool X86SharedAsmPrinter::doInitialization(Module &M) { default: break; } - // Emit initial debug information. - DW.BeginModule(M); + if (forDarwin) { + // Emit initial debug information. + DW.BeginModule(M); + } return AsmPrinter::doInitialization(M); } @@ -188,10 +190,17 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) { O << "\t.indirect_symbol " << *i << "\n"; O << "\t.long\t0\n"; } - } - // Emit initial debug information. - DW.EndModule(M); + // Emit initial debug information. + DW.EndModule(M); + + // Funny Darwin hack: This flag tells the linker that no global symbols + // contain code that falls through to other global symbols (e.g. the obvious + // implementation of multiple entry points). If this doesn't occur, the + // linker can safely perform dead code stripping. Since LLVM never generates + // code that does this, it is always safe to set. + O << "\t.subsections_via_symbols\n"; + } AsmPrinter::doFinalization(M); return false; // success diff --git a/lib/Target/X86/X86AsmPrinter.h b/lib/Target/X86/X86AsmPrinter.h index 5b27c564577..ed0fdbed27d 100755 --- a/lib/Target/X86/X86AsmPrinter.h +++ b/lib/Target/X86/X86AsmPrinter.h @@ -68,7 +68,7 @@ struct X86SharedAsmPrinter : public AsmPrinter { MachineFunctionPass::getAnalysisUsage(AU); } - bool forDarwin; // FIXME: eliminate. + bool forDarwin; // FIXME: eliminate. // Necessary for Darwin to print out the apprioriate types of linker stubs std::set FnStubs, GVStubs, LinkOnceStubs; diff --git a/lib/Target/X86/X86IntelAsmPrinter.cpp b/lib/Target/X86/X86IntelAsmPrinter.cpp index 5bc8b243723..a04dfca8545 100755 --- a/lib/Target/X86/X86IntelAsmPrinter.cpp +++ b/lib/Target/X86/X86IntelAsmPrinter.cpp @@ -26,15 +26,19 @@ using namespace x86; /// method to print assembly for each instruction. /// bool X86IntelAsmPrinter::runOnMachineFunction(MachineFunction &MF) { - // Let PassManager know we need debug information and relay - // the MachineDebugInfo address on to DwarfWriter. - DW.SetDebugInfo(&getAnalysis()); + if (forDarwin) { + // Let PassManager know we need debug information and relay + // the MachineDebugInfo address on to DwarfWriter. + DW.SetDebugInfo(&getAnalysis()); + } SetupMachineFunction(MF); O << "\n\n"; - // Emit pre-function debug information. - DW.BeginFunction(MF); + if (forDarwin) { + // Emit pre-function debug information. + DW.BeginFunction(MF); + } // Print out constants referenced by the function EmitConstantPool(MF.getConstantPool()); @@ -63,8 +67,10 @@ bool X86IntelAsmPrinter::runOnMachineFunction(MachineFunction &MF) { } } - // Emit post-function debug information. - DW.EndFunction(MF); + if (forDarwin) { + // Emit post-function debug information. + DW.EndFunction(MF); + } // We didn't modify anything. return false;