diff options
| -rw-r--r-- | llvm/lib/CodeGen/DwarfWriter.cpp | 28 | ||||
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp | 18 | ||||
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp | 3 | ||||
| -rw-r--r-- | llvm/lib/Target/TargetAsmInfo.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ATTAsmPrinter.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86AsmPrinter.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86TargetAsmInfo.cpp | 2 | 
7 files changed, 44 insertions, 13 deletions
diff --git a/llvm/lib/CodeGen/DwarfWriter.cpp b/llvm/lib/CodeGen/DwarfWriter.cpp index 2efb8002f62..d1f195d5567 100644 --- a/llvm/lib/CodeGen/DwarfWriter.cpp +++ b/llvm/lib/CodeGen/DwarfWriter.cpp @@ -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()));    }  }; diff --git a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp index da758877371..bac735a17b6 100644 --- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -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"); diff --git a/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp b/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp index 992b090edd5..ee1d06316ef 100644 --- a/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp +++ b/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp @@ -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"; diff --git a/llvm/lib/Target/TargetAsmInfo.cpp b/llvm/lib/Target/TargetAsmInfo.cpp index fd2e6fbbc11..9ea796b6f17 100644 --- a/llvm/lib/Target/TargetAsmInfo.cpp +++ b/llvm/lib/Target/TargetAsmInfo.cpp @@ -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"), diff --git a/llvm/lib/Target/X86/X86ATTAsmPrinter.cpp b/llvm/lib/Target/X86/X86ATTAsmPrinter.cpp index 5575ee7795a..a78a898c49f 100644 --- a/llvm/lib/Target/X86/X86ATTAsmPrinter.cpp +++ b/llvm/lib/Target/X86/X86ATTAsmPrinter.cpp @@ -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"; diff --git a/llvm/lib/Target/X86/X86AsmPrinter.cpp b/llvm/lib/Target/X86/X86AsmPrinter.cpp index 078709bb7af..31e50102864 100644 --- a/llvm/lib/Target/X86/X86AsmPrinter.cpp +++ b/llvm/lib/Target/X86/X86AsmPrinter.cpp @@ -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." + diff --git a/llvm/lib/Target/X86/X86TargetAsmInfo.cpp b/llvm/lib/Target/X86/X86TargetAsmInfo.cpp index 05cf2bfdaba..44c1432eeb5 100644 --- a/llvm/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/llvm/lib/Target/X86/X86TargetAsmInfo.cpp @@ -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";  | 

