From: Chris Lattner Date: Tue, 13 Dec 2005 06:32:50 +0000 (+0000) Subject: Use the shared asmprinter code for printing special llvm globals X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d1239b7c69e3c8f36d21c30d5df923cfeb96583e;p=oota-llvm.git Use the shared asmprinter code for printing special llvm globals git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24695 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp index 2fbf9ec8054..3fa73a60614 100644 --- a/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -198,14 +198,14 @@ namespace { AlignmentIsInBytes = false; // Alignment is by power of 2. ConstantPoolSection = "\t.const\t"; LCOMMDirective = "\t.lcomm\t"; + StaticCtorsSection = ".mod_init_func"; + StaticDtorsSection = ".mod_term_func"; } virtual const char *getPassName() const { return "Darwin PPC Assembly Printer"; } - void EmitXXStructorList(Constant *List); - bool runOnMachineFunction(MachineFunction &F); bool doInitialization(Module &M); bool doFinalization(Module &M); @@ -415,21 +415,6 @@ bool DarwinAsmPrinter::doInitialization(Module &M) { return false; } -/// EmitXXStructorList - Emit the ctor or dtor list. On darwin, this just -/// prints out the function pointers. -void DarwinAsmPrinter::EmitXXStructorList(Constant *List) { - // Should be an array of '{ int, void ()* }' structs. The first value is the - // init priority, which we ignore. - if (!isa(List)) return; - ConstantArray *InitList = cast(List); - for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) - if (ConstantStruct *CS = dyn_cast(InitList->getOperand(i))){ - if (CS->getNumOperands() != 2) return; // Not array of 2-element structs. - // Emit the function pointer. - EmitGlobalConstant(CS->getOperand(1)); - } -} - bool DarwinAsmPrinter::doFinalization(Module &M) { const TargetData &TD = TM.getTargetData(); @@ -438,22 +423,9 @@ bool DarwinAsmPrinter::doFinalization(Module &M) { I != E; ++I) { if (!I->hasInitializer()) continue; // External global require no code - // Check to see if this is a special global used by LLVM. - if (I->hasAppendingLinkage()) { - if (I->getName() == "llvm.used") - continue; // No need to emit this at all. - if (I->getName() == "llvm.global_ctors") { - SwitchSection(".mod_init_func", 0); - EmitAlignment(2, 0); - EmitXXStructorList(I->getInitializer()); - continue; - } else if (I->getName() == "llvm.global_dtors") { - SwitchSection(".mod_term_func", 0); - EmitAlignment(2, 0); - EmitXXStructorList(I->getInitializer()); - continue; - } - } + // Check to see if this is a special global used by LLVM, if so, emit it. + if (I->hasAppendingLinkage() && EmitSpecialLLVMGlobal(I)) + continue; O << '\n'; std::string name = Mang->getValueName(I); diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp index 13c136f3481..f3505fb9124 100644 --- a/lib/Target/X86/X86AsmPrinter.cpp +++ b/lib/Target/X86/X86AsmPrinter.cpp @@ -58,6 +58,8 @@ bool X86SharedAsmPrinter::doInitialization(Module &M) { COMMDirectiveTakesAlignment = false; HasDotTypeDotSizeDirective = false; forDarwin = true; + StaticCtorsSection = ".mod_init_func"; + StaticDtorsSection = ".mod_term_func"; break; case X86Subtarget::isCygwin: GlobalPrefix = "_"; @@ -74,21 +76,6 @@ bool X86SharedAsmPrinter::doInitialization(Module &M) { return AsmPrinter::doInitialization(M); } -/// EmitXXStructorList - Emit the ctor or dtor list. On darwin, this just -/// prints out the function pointers. -void X86SharedAsmPrinter::EmitXXStructorList(Constant *List) { - // Should be an array of '{ int, void ()* }' structs. The first value is the - // init priority, which we ignore. - if (!isa(List)) return; - ConstantArray *InitList = cast(List); - for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) - if (ConstantStruct *CS = dyn_cast(InitList->getOperand(i))){ - if (CS->getNumOperands() != 2) return; // Not array of 2-element structs. - // Emit the function pointer. - EmitGlobalConstant(CS->getOperand(1)); - } -} - bool X86SharedAsmPrinter::doFinalization(Module &M) { const TargetData &TD = TM.getTargetData(); @@ -97,28 +84,9 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) { E = M.global_end(); I != E; ++I) { if (!I->hasInitializer()) continue; // External global require no code - // Check to see if this is a special global used by LLVM. - if (I->hasAppendingLinkage()) { - if (I->getName() == "llvm.used") - continue; // No need to emit this at all. - if (I->getName() == "llvm.global_ctors") { - if (forDarwin) - SwitchSection(".mod_init_func", 0); - else - SwitchSection(".ctors,\"aw\",@progbits", 0); - EmitAlignment(2, 0); - EmitXXStructorList(I->getInitializer()); - continue; - } else if (I->getName() == "llvm.global_dtors") { - if (forDarwin) - SwitchSection(".mod_term_func", 0); - else - SwitchSection(".dtors,\"aw\",@progbits", 0); - EmitAlignment(2, 0); - EmitXXStructorList(I->getInitializer()); - continue; - } - } + // Check to see if this is a special global used by LLVM, if so, emit it. + if (I->hasAppendingLinkage() && EmitSpecialLLVMGlobal(I)) + continue; O << "\n\n"; std::string name = Mang->getValueName(I); diff --git a/lib/Target/X86/X86AsmPrinter.h b/lib/Target/X86/X86AsmPrinter.h index a2e5f2f76e2..3267d4ec647 100755 --- a/lib/Target/X86/X86AsmPrinter.h +++ b/lib/Target/X86/X86AsmPrinter.h @@ -33,7 +33,6 @@ struct X86SharedAsmPrinter : public AsmPrinter { bool doInitialization(Module &M); bool doFinalization(Module &M); - void EmitXXStructorList(Constant *List); bool forDarwin; // FIXME: eliminate.