Fix .eh table linkage issues on Darwin. Some EH support
authorDale Johannesen <dalej@apple.com>
Tue, 20 Nov 2007 23:24:42 +0000 (23:24 +0000)
committerDale Johannesen <dalej@apple.com>
Tue, 20 Nov 2007 23:24:42 +0000 (23:24 +0000)
for Darwin PPC, but it's not fully working yet.

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

lib/CodeGen/DwarfWriter.cpp
lib/Target/PowerPC/PPCAsmPrinter.cpp
lib/Target/PowerPC/PPCTargetAsmInfo.cpp
lib/Target/TargetAsmInfo.cpp
lib/Target/X86/X86ATTAsmPrinter.cpp
lib/Target/X86/X86AsmPrinter.cpp
lib/Target/X86/X86TargetAsmInfo.cpp

index 2efb8002f6241ae9c6a6524bbf78feaa531f36e9..d1f195d55672aea08c5dd8b0aa5c6ee699a628d2 100644 (file)
@@ -2764,12 +2764,15 @@ private:
     bool hasCalls;
     bool hasLandingPads;
     std::vector<MachineMove> Moves;
+    Function::LinkageTypes linkage;
 
     FunctionEHFrameInfo(const std::string &FN, unsigned Num, unsigned P,
                         bool hC, bool hL,
-                        const std::vector<MachineMove> &M):
+                        const std::vector<MachineMove> &M,
+                        Function::LinkageTypes l):
       FnName(FN), Number(Num), PersonalityIndex(P),
-      hasCalls(hC), hasLandingPads(hL), Moves(M) { }
+      hasCalls(hC), hasLandingPads(hL), Moves(M),
+      linkage(l) { }
   };
 
   std::vector<FunctionEHFrameInfo> EHFrames;
@@ -2867,15 +2870,25 @@ private:
     Asm->SwitchToTextSection(TAI->getDwarfEHFrameSection());
 
     // Externally visible entry into the functions eh frame info.
-    if (const char *GlobalDirective = TAI->getGlobalDirective())
-      O << GlobalDirective << EHFrameInfo.FnName << "\n";
-    
+    // If the corresponding function is static, this should not be
+    // externally visible.
+    if (EHFrameInfo.linkage != Function::InternalLinkage) {
+      if (const char *GlobalEHDirective = TAI->getGlobalEHDirective())
+        O << GlobalEHDirective << EHFrameInfo.FnName << "\n";
+    }
+
     // If there are no calls then you can't unwind.
     if (!EHFrameInfo.hasCalls) { 
       O << EHFrameInfo.FnName << " = 0\n";
     } else {
       O << EHFrameInfo.FnName << ":\n";
-      
+
+      // If corresponding function is weak definition, this should be too.
+      if ((EHFrameInfo.linkage == Function::WeakLinkage || 
+           EHFrameInfo.linkage == Function::LinkOnceLinkage) &&
+          TAI->getWeakDefDirective())
+        O << TAI->getWeakDefDirective() << EHFrameInfo.FnName << "\n";
+
       // EH frame header.
       EmitDifference("eh_frame_end", EHFrameInfo.Number,
                      "eh_frame_begin", EHFrameInfo.Number, true);
@@ -3362,7 +3375,8 @@ public:
                                     MMI->getPersonalityIndex(),
                                     MF->getFrameInfo()->hasCalls(),
                                     !MMI->getLandingPads().empty(),
-                                    MMI->getFrameMoves()));
+                                    MMI->getFrameMoves(),
+                                    MF->getFunction()->getLinkage()));
   }
 };
 
index da75887737163a01c8d73b056048eb7a5986f742..bac735a17b6b6ac6a031525e84a4675d950df77a 100644 (file)
@@ -322,10 +322,11 @@ namespace {
   struct VISIBILITY_HIDDEN DarwinAsmPrinter : public PPCAsmPrinter {
   
     DwarfWriter DW;
+    MachineModuleInfo *MMI;
 
     DarwinAsmPrinter(std::ostream &O, PPCTargetMachine &TM,
                      const TargetAsmInfo *T)
-      : PPCAsmPrinter(O, TM, T), DW(O, this, T) {
+      : PPCAsmPrinter(O, TM, T), DW(O, this, T), MMI(0) {
     }
 
     virtual const char *getPassName() const {
@@ -774,11 +775,13 @@ std::string DarwinAsmPrinter::getSectionForFunction(const Function &F) const {
 /// method to print assembly for each instruction.
 ///
 bool DarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
-  DW.SetModuleInfo(&getAnalysis<MachineModuleInfo>());
+  // We need this for Personality functions.
+  MMI = &getAnalysis<MachineModuleInfo>();
+  DW.SetModuleInfo(MMI);
 
   SetupMachineFunction(MF);
   O << "\n\n";
-  
+
   // Print out constants referenced by the function
   EmitConstantPool(MF.getConstantPool());
 
@@ -1054,6 +1057,15 @@ bool DarwinAsmPrinter::doFinalization(Module &M) {
 
   O << "\n";
 
+  if (ExceptionHandling && TAI->doesSupportExceptionHandling() && MMI) {
+    // Add the (possibly multiple) personalities to the set of global values.
+    const std::vector<Function *>& Personalities = MMI->getPersonalities();
+
+    for (std::vector<Function *>::const_iterator I = Personalities.begin(),
+           E = Personalities.end(); I != E; ++I)
+      if (*I) GVStubs.insert("_" + (*I)->getName());
+  }
+
   // Output stubs for external and common global variables.
   if (!GVStubs.empty()) {
     SwitchToDataSection(".non_lazy_symbol_pointer");
index 992b090edd519b61c90bdeedd67373ffa7f349d7..ee1d06316ef3d2290ee4bb5821623b540dcaf330 100644 (file)
@@ -43,7 +43,6 @@ DarwinTargetAsmInfo::DarwinTargetAsmInfo(const PPCTargetMachine &TM)
   PrivateGlobalPrefix = "L";
   ConstantPoolSection = "\t.const\t";
   JumpTableDataSection = ".const";
-  GlobalDirective = "\t.globl\t";
   CStringSection = "\t.cstring";
   FourByteConstantSection = "\t.literal4\n";
   EightByteConstantSection = "\t.literal8\n";
@@ -56,6 +55,7 @@ DarwinTargetAsmInfo::DarwinTargetAsmInfo(const PPCTargetMachine &TM)
     StaticDtorsSection = ".mod_term_func";
   }
   UsedDirective = "\t.no_dead_strip\t";
+  WeakDefDirective = "\t.weak_definition\t";
   WeakRefDirective = "\t.weak_reference\t";
   HiddenDirective = "\t.private_extern\t";
   SupportsExceptionHandling = false;
@@ -66,6 +66,7 @@ DarwinTargetAsmInfo::DarwinTargetAsmInfo(const PPCTargetMachine &TM)
   DwarfInfoSection = ".section __DWARF,__debug_info,regular,debug";
   DwarfLineSection = ".section __DWARF,__debug_line,regular,debug";
   DwarfFrameSection = ".section __DWARF,__debug_frame,regular,debug";
+  GlobalEHDirective = "\t.globl\t";
   DwarfPubNamesSection = ".section __DWARF,__debug_pubnames,regular,debug";
   DwarfPubTypesSection = ".section __DWARF,__debug_pubtypes,regular,debug";
   DwarfStrSection = ".section __DWARF,__debug_str,regular,debug";
index fd2e6fbbc11ad57339b0c3444c365cbf677d6678..9ea796b6f177e5cc37e9883e1b3e15ead97588c7 100644 (file)
@@ -75,6 +75,7 @@ TargetAsmInfo::TargetAsmInfo() :
   HasDotTypeDotSizeDirective(true),
   UsedDirective(0),
   WeakRefDirective(0),
+  WeakDefDirective(0),
   HiddenDirective("\t.hidden\t"),
   ProtectedDirective("\t.protected\t"),
   AbsoluteDebugSectionOffsets(false),
@@ -89,6 +90,7 @@ TargetAsmInfo::TargetAsmInfo() :
   DwarfInfoSection(".debug_info"),
   DwarfLineSection(".debug_line"),
   DwarfFrameSection(".debug_frame"),
+  GlobalEHDirective(0),
   DwarfPubNamesSection(".debug_pubnames"),
   DwarfPubTypesSection(".debug_pubtypes"),
   DwarfStrSection(".debug_str"),
index 5575ee7795afc23c78b1155f62ce195e14cf808b..a78a898c49f043a0f4d3413d2b5097552a9cb502 100644 (file)
@@ -124,7 +124,7 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
       // FIXME: This should be parameterized somewhere.
       EmitAlignment(4, F, 0, true, 0x90);
       O << "\t.globl\t" << CurrentFnName << "\n";
-      O << "\t.weak_definition\t" << CurrentFnName << "\n";
+      O << TAI->getWeakDefDirective() << CurrentFnName << "\n";
     } else if (Subtarget->isTargetCygMing()) {
       EmitAlignment(4, F);     // FIXME: This should be parameterized somewhere.
       O << "\t.globl\t" << CurrentFnName << "\n";
index 078709bb7af294fd15b71350cb1f6767062baffe..31e501028645caf070deaae7399c48036755b27b 100644 (file)
@@ -214,7 +214,7 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
     case GlobalValue::WeakLinkage:
       if (Subtarget->isTargetDarwin()) {
         O << "\t.globl\t" << name << "\n"
-          << "\t.weak_definition " << name << "\n";
+          << TAI->getWeakDefDirective() << name << "\n";
         SwitchToDataSection(".section __DATA,__const_coal,coalesced", I);
       } else if (Subtarget->isTargetCygMing()) {
         std::string SectionName(".section\t.data$linkonce." +
index 05cf2bfdaba6a612c84ec1e1c0f347bcf36d6110..44c1432eeb513716c9ea6628fbd072f17207296b 100644 (file)
@@ -76,6 +76,7 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
     SetDirective = "\t.set";
     PCSymbol = ".";
     UsedDirective = "\t.no_dead_strip\t";
+    WeakDefDirective = "\t.weak_definition\t";
     WeakRefDirective = "\t.weak_reference\t";
     HiddenDirective = "\t.private_extern\t";
     
@@ -92,6 +93,7 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
     DwarfInfoSection = ".section __DWARF,__debug_info,regular,debug";
     DwarfLineSection = ".section __DWARF,__debug_line,regular,debug";
     DwarfFrameSection = ".section __DWARF,__debug_frame,regular,debug";
+    GlobalEHDirective = "\t.globl\t";
     DwarfPubNamesSection = ".section __DWARF,__debug_pubnames,regular,debug";
     DwarfPubTypesSection = ".section __DWARF,__debug_pubtypes,regular,debug";
     DwarfStrSection = ".section __DWARF,__debug_str,regular,debug";