Untangle a snarl that I discovered when updating the mangler,
authorChris Lattner <sabre@nondot.org>
Fri, 17 Jul 2009 20:46:40 +0000 (20:46 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 17 Jul 2009 20:46:40 +0000 (20:46 +0000)
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

include/llvm/CodeGen/AsmPrinter.h
include/llvm/Target/TargetAsmInfo.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/CodeGen/AsmPrinter/DwarfException.cpp
lib/Target/DarwinTargetAsmInfo.cpp
lib/Target/TargetAsmInfo.cpp
lib/Target/X86/X86TargetAsmInfo.cpp

index a9b0b3b0475aa745a388b4dc5196281fa0836278..fcedef2891b8f57558c393affcee2e364f94077f 100644 (file)
@@ -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.
index 721edfde5e4c1e82ba6c3b786f583c036312a0b1..3604e9a9eed695c7b82d5fff5e6b48ee11104303 100644 (file)
@@ -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;
index 7a5d24c761e95a58c2dd6f77d3dc322c3eaae150..e352922fee7b15e6cf3801f0406779249a17ffe9 100644 (file)
@@ -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) {
index 37466ab39a2346a98ebe67a2a10fe5c4687c56e1..b17b163c65525b1f91d0099ac01cef971810d534 100644 (file)
@@ -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(),
index 7ab3967c0d1bf2bd0c006d223ce927ac402a78ee..3eb3d53595433602d744190655a4bf5711abdadf 100644 (file)
@@ -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";
index 8bc436819a001c825cfaae829d3af9b918b51bc7..5b7ddbfa4a7eaac929b0f80833f53e44d0bb4d67 100644 (file)
@@ -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;
index c33b765316f489701de514bb1e455324e6a2d7c1..9f114e69f6bf710d79fc2cd10898e7c8dc6fd451 100644 (file)
@@ -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";