diff options
author | Chris Lattner <sabre@nondot.org> | 2009-07-17 20:46:40 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-07-17 20:46:40 +0000 |
commit | e2cf37b88c089a71727b3ecd466856f0cd638813 (patch) | |
tree | 5519e3da8fc3474c49728b80a86d5c9f76f57db2 | |
parent | 092a9dda2d13918a6410db26f41c7b5aa97ff989 (diff) | |
download | external_llvm-e2cf37b88c089a71727b3ecd466856f0cd638813.zip external_llvm-e2cf37b88c089a71727b3ecd466856f0cd638813.tar.gz external_llvm-e2cf37b88c089a71727b3ecd466856f0cd638813.tar.bz2 |
Untangle a snarl that I discovered when updating the mangler,
starting in getCurrentFunctionEHName. Among other problems,
we would try to privative a "foo.eh" label, but end up emitting
the label as _Lfoo.eh instead of L_foo.eh on darwin. This is really
bad, and the linker has always tolerated these labels existing.
For now, just emit them as _foo.eh.
This patch also fixes problems with ".eh" labels on unnamed
functions and eliminates two strangely defined TargetAsmInfo
hooks.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76231 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/CodeGen/AsmPrinter.h | 6 | ||||
-rw-r--r-- | include/llvm/Target/TargetAsmInfo.h | 16 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 14 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfException.cpp | 10 | ||||
-rw-r--r-- | lib/Target/DarwinTargetAsmInfo.cpp | 5 | ||||
-rw-r--r-- | lib/Target/TargetAsmInfo.cpp | 2 | ||||
-rw-r--r-- | lib/Target/X86/X86TargetAsmInfo.cpp | 3 |
7 files changed, 23 insertions, 33 deletions
diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h index a9b0b3b..fcedef2 100644 --- a/include/llvm/CodeGen/AsmPrinter.h +++ b/include/llvm/CodeGen/AsmPrinter.h @@ -170,11 +170,9 @@ namespace llvm { /// Should be overridden if an indirect reference should be used. virtual void EmitExternalGlobal(const GlobalVariable *GV); - /// getCurrentFunctionEHName - Called to return (and cache) the - /// CurrentFnEHName. + /// getCurrentFunctionEHName - Called to return the CurrentFnEHName. /// - const std::string &getCurrentFunctionEHName(const MachineFunction *MF, - std::string &FuncEHName) const; + std::string getCurrentFunctionEHName(const MachineFunction *MF) const; protected: /// getAnalysisUsage - Record analysis usage. diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h index 721edfd..3604e9a 100644 --- a/include/llvm/Target/TargetAsmInfo.h +++ b/include/llvm/Target/TargetAsmInfo.h @@ -480,9 +480,9 @@ namespace llvm { /// encode inline subroutine information. bool DwarfUsesInlineInfoSection; // Defaults to false. - /// NonLocalEHFrameLabel - If set, the EH_frame label needs to be non-local. - /// - bool NonLocalEHFrameLabel; // Defaults to false. + /// Is_EHSymbolPrivate - If set, the "_foo.eh" is made private so that it + /// doesn't show up in the symbol table of the object file. + bool Is_EHSymbolPrivate; // Defaults to true. /// GlobalEHDirective - This is the directive used to make exception frame /// tables globally visible. @@ -714,12 +714,6 @@ namespace llvm { const char *getPrivateGlobalPrefix() const { return PrivateGlobalPrefix; } - /// EHGlobalPrefix - Prefix for EH_frame and the .eh symbols. - /// This is normally PrivateGlobalPrefix, but some targets want - /// these symbols to be visible. - virtual const char *getEHGlobalPrefix() const { - return PrivateGlobalPrefix; - } const char *getLessPrivateGlobalPrefix() const { return LessPrivateGlobalPrefix; } @@ -876,8 +870,8 @@ namespace llvm { bool doesDwarfUsesInlineInfoSection() const { return DwarfUsesInlineInfoSection; } - bool doesRequireNonLocalEHFrameLabel() const { - return NonLocalEHFrameLabel; + bool is_EHSymbolPrivate() const { + return Is_EHSymbolPrivate; } const char *getGlobalEHDirective() const { return GlobalEHDirective; diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 7a5d24c..e352922 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -264,17 +264,11 @@ bool AsmPrinter::doFinalization(Module &M) { return false; } -const std::string & -AsmPrinter::getCurrentFunctionEHName(const MachineFunction *MF, - std::string &Name) const { +std::string +AsmPrinter::getCurrentFunctionEHName(const MachineFunction *MF) const { assert(MF && "No machine function?"); - Name = MF->getFunction()->getName(); - if (Name.empty()) - Name = Mang->getMangledName(MF->getFunction()); - - // FIXME: THIS SEEMS REALLY WRONG, it will get two prefixes. - Name = Mang->makeNameProper(TAI->getEHGlobalPrefix() + Name + ".eh"); - return Name; + return Mang->getMangledName(MF->getFunction(), ".eh", + TAI->is_EHSymbolPrivate()); } void AsmPrinter::SetupMachineFunction(MachineFunction &MF) { diff --git a/lib/CodeGen/AsmPrinter/DwarfException.cpp b/lib/CodeGen/AsmPrinter/DwarfException.cpp index 37466ab..b17b163 100644 --- a/lib/CodeGen/AsmPrinter/DwarfException.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfException.cpp @@ -57,8 +57,8 @@ void DwarfException::EmitCommonEHFrame(const Function *Personality, // Begin eh frame section. Asm->SwitchToTextSection(TAI->getDwarfEHFrameSection()); - if (!TAI->doesRequireNonLocalEHFrameLabel()) - O << TAI->getEHGlobalPrefix(); + if (TAI->is_EHSymbolPrivate()) + O << TAI->getPrivateGlobalPrefix(); O << "EH_frame" << Index << ":\n"; EmitLabel("section_eh_frame", Index); @@ -194,7 +194,8 @@ void DwarfException::EmitEHFrame(const FunctionEHFrameInfo &EHFrameInfo) { EmitLabel("eh_frame_begin", EHFrameInfo.Number); - if (TAI->doesRequireNonLocalEHFrameLabel()) { + if (!TAI->is_EHSymbolPrivate()) { +// FIXME: HOW ARE THESE TWO ARMS DIFFERENT?? EH_frame vs eh_frame_common? PrintRelDirective(true, true); PrintLabelName("eh_frame_begin", EHFrameInfo.Number); @@ -690,9 +691,8 @@ void DwarfException::EndFunction() { EmitExceptionTable(); // Save EH frame information - std::string Name; EHFrames.push_back( - FunctionEHFrameInfo(getAsm()->getCurrentFunctionEHName(MF, Name), + FunctionEHFrameInfo(getAsm()->getCurrentFunctionEHName(MF), SubprogramCount, MMI->getPersonalityIndex(), MF->getFrameInfo()->hasCalls(), diff --git a/lib/Target/DarwinTargetAsmInfo.cpp b/lib/Target/DarwinTargetAsmInfo.cpp index 7ab3967..3eb3d53 100644 --- a/lib/Target/DarwinTargetAsmInfo.cpp +++ b/lib/Target/DarwinTargetAsmInfo.cpp @@ -86,6 +86,11 @@ DarwinTargetAsmInfo::DarwinTargetAsmInfo(const TargetMachine &TM) StaticDtorsSection = ".mod_term_func"; } + // _foo.eh symbols are currently always exported so that the linker knows + // about them. This may not strictly be necessary on 10.6 and later, but it + // doesn't hurt anything. + Is_EHSymbolPrivate = false; + DwarfAbbrevSection = ".section __DWARF,__debug_abbrev,regular,debug"; DwarfInfoSection = ".section __DWARF,__debug_info,regular,debug"; DwarfLineSection = ".section __DWARF,__debug_line,regular,debug"; diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index 8bc4368..5b7ddbf 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/lib/Target/TargetAsmInfo.cpp @@ -106,7 +106,7 @@ TargetAsmInfo::TargetAsmInfo(const TargetMachine &tm) SupportsExceptionHandling = false; DwarfRequiresFrameSection = true; DwarfUsesInlineInfoSection = false; - NonLocalEHFrameLabel = false; + Is_EHSymbolPrivate = true; GlobalEHDirective = 0; SupportsWeakOmittedEHFrame = true; DwarfSectionOffsetDirective = 0; diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp index c33b765..9f114e6 100644 --- a/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/lib/Target/X86/X86TargetAsmInfo.cpp @@ -64,8 +64,7 @@ X86DarwinTargetAsmInfo::X86DarwinTargetAsmInfo(const X86TargetMachine &TM): // Leopard and above support aligned common symbols. COMMDirectiveTakesAlignment = (Subtarget->getDarwinVers() >= 9); HasDotTypeDotSizeDirective = false; - NonLocalEHFrameLabel = true; - + if (is64Bit) { PersonalityPrefix = ""; PersonalitySuffix = "+4@GOTPCREL"; |