diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/DwarfWriter.cpp | 100 | ||||
| -rw-r--r-- | llvm/lib/Target/TargetAsmInfo.cpp | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86TargetAsmInfo.cpp | 2 | 
3 files changed, 49 insertions, 54 deletions
| diff --git a/llvm/lib/CodeGen/DwarfWriter.cpp b/llvm/lib/CodeGen/DwarfWriter.cpp index 9e806fadcde..5063d63f06b 100644 --- a/llvm/lib/CodeGen/DwarfWriter.cpp +++ b/llvm/lib/CodeGen/DwarfWriter.cpp @@ -2796,7 +2796,7 @@ private:    /// shouldEmitFrameModule - Per-module flag to indicate if frame moves     /// should be emitted.    bool shouldEmitMovesModule; -   +    /// EmitCommonEHFrame - Emit the common eh unwind frame.    ///    void EmitCommonEHFrame(const Function *Personality, unsigned Index) { @@ -2813,7 +2813,7 @@ private:      // Define base labels.      EmitLabel("eh_frame_common", Index); -     +      // Define the eh frame length.      EmitDifference("eh_frame_common_end", Index,                     "eh_frame_common_begin", Index, true); @@ -2825,50 +2825,49 @@ private:      Asm->EOL("CIE Identifier Tag");      Asm->EmitInt8(DW_CIE_VERSION);      Asm->EOL("CIE Version"); -     +      // The personality presence indicates that language specific information      // will show up in the eh frame.      Asm->EmitString(Personality ? "zPLR" : "zR");      Asm->EOL("CIE Augmentation"); -     +      // Round out reader.      Asm->EmitULEB128Bytes(1);      Asm->EOL("CIE Code Alignment Factor");      Asm->EmitSLEB128Bytes(stackGrowth); -    Asm->EOL("CIE Data Alignment Factor");    +    Asm->EOL("CIE Data Alignment Factor");      Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), true)); -    Asm->EOL("CIE RA Column"); -     +    Asm->EOL("CIE Return Address Column"); +      // If there is a personality, we need to indicate the functions location.      if (Personality) {        Asm->EmitULEB128Bytes(7);        Asm->EOL("Augmentation Size"); -      if (TAI->getNeedsIndirectEncoding()) +      if (TAI->getNeedsIndirectEncoding()) {          Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4 | DW_EH_PE_indirect); -      else +        Asm->EOL("Personality (pcrel sdata4 indirect)"); +      } else {          Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4); +        Asm->EOL("Personality (pcrel sdata4)"); +      } -      Asm->EOL("Personality (pcrel sdata4 indirect)"); -       -      PrintRelDirective(TAI->getShortenEHDataOn64Bit()); +      PrintRelDirective(true);        O << TAI->getPersonalityPrefix();        Asm->EmitExternalGlobal((const GlobalVariable *)(Personality));        O << TAI->getPersonalitySuffix(); -      if (!TAI->getShortenEHDataOn64Bit()) { -        O << "-" << TAI->getPCSymbol(); -      } +      O << "-" << TAI->getPCSymbol();        Asm->EOL("Personality"); -      Asm->EmitULEB128Bytes(DW_EH_PE_pcrel); -      Asm->EOL("LSDA Encoding (pcrel)"); -      Asm->EmitULEB128Bytes(DW_EH_PE_pcrel); -      Asm->EOL("FDE Encoding (pcrel)"); +      Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4); +      Asm->EOL("LSDA Encoding (pcrel sdata4)"); +      Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4); +      Asm->EOL("FDE Encoding (pcrel sdata4)");     } else {        Asm->EmitULEB128Bytes(1);        Asm->EOL("Augmentation Size"); -      Asm->EmitULEB128Bytes(DW_EH_PE_pcrel); -      Asm->EOL("FDE Encoding (pcrel)"); +      Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4); +      Asm->EOL("FDE Encoding (pcrel sdata4)");      }      // Indicate locations of general callee saved registers in frame. @@ -2882,10 +2881,10 @@ private:      Asm->EmitAlignment(TD->getPointerSize() == sizeof(int32_t) ? 2 : 3,                          0, 0, false);      EmitLabel("eh_frame_common_end", Index); -     +      Asm->EOL();    } -   +    /// EmitEHFrame - Emit function exception frame information.    ///    void EmitEHFrame(const FunctionEHFrameInfo &EHFrameInfo) { @@ -2940,31 +2939,28 @@ private:                          true, true, false);        Asm->EOL("FDE CIE offset"); -      EmitReference("eh_func_begin", EHFrameInfo.Number, true); +      EmitReference("eh_func_begin", EHFrameInfo.Number, true, true);        Asm->EOL("FDE initial location");        EmitDifference("eh_func_end", EHFrameInfo.Number, -                     "eh_func_begin", EHFrameInfo.Number); +                     "eh_func_begin", EHFrameInfo.Number, true);        Asm->EOL("FDE address range"); -       +        // If there is a personality and landing pads then point to the language        // specific data area in the exception table.        if (EHFrameInfo.PersonalityIndex) { -        Asm->EmitULEB128Bytes(TAI->getShortenEHDataOn64Bit() ? 8 : 4); +        Asm->EmitULEB128Bytes(4);          Asm->EOL("Augmentation size"); -         -        if (EHFrameInfo.hasLandingPads) { -          EmitReference("exception", EHFrameInfo.Number, true); -        } else if (TD->getPointerSize() == 8) { -          Asm->EmitInt64((int)0); -        } else { + +        if (EHFrameInfo.hasLandingPads) +          EmitReference("exception", EHFrameInfo.Number, true, true); +        else            Asm->EmitInt32((int)0); -        }          Asm->EOL("Language Specific Data Area");        } else {          Asm->EmitULEB128Bytes(0);          Asm->EOL("Augmentation size");        } -       +        // Indicate locations of function specific  callee saved registers in        // frame.        EmitFrameMoves("eh_func_begin", EHFrameInfo.Number, EHFrameInfo.Moves, true); @@ -3267,13 +3263,20 @@ private:      }      // Final tallies. -    unsigned SizeSites = CallSites.size() * (sizeof(int32_t) + // Site start. -                                             sizeof(int32_t) + // Site length. -                                             sizeof(int32_t)); // Landing pad. + +    // Call sites. +    const unsigned SiteStartSize  = sizeof(int32_t); // DW_EH_PE_udata4 +    const unsigned SiteLengthSize = sizeof(int32_t); // DW_EH_PE_udata4 +    const unsigned LandingPadSize = sizeof(int32_t); // DW_EH_PE_udata4 +    unsigned SizeSites = CallSites.size() * (SiteStartSize + +                                             SiteLengthSize + +                                             LandingPadSize);      for (unsigned i = 0, e = CallSites.size(); i < e; ++i)        SizeSites += Asm->SizeULEB128(CallSites[i].Action); -    unsigned SizeTypes = TypeInfos.size() * TD->getPointerSize(); +    // Type infos. +    const unsigned TypeInfoSize = TD->getPointerSize(); // DW_EH_PE_absptr +    unsigned SizeTypes = TypeInfos.size() * TypeInfoSize;      unsigned TypeOffset = sizeof(int8_t) + // Call site format                            Asm->SizeULEB128(SizeSites) + // Call-site table length @@ -3323,27 +3326,22 @@ private:        }        EmitSectionOffset(BeginTag, "eh_func_begin", BeginNumber, SubprogramCount, -                        TAI->getShortenEHDataOn64Bit(), true); +                        true, true);        Asm->EOL("Region start");        if (!S.EndLabel) {          EmitDifference("eh_func_end", SubprogramCount, BeginTag, BeginNumber, -                       TAI->getShortenEHDataOn64Bit()); +                       true);        } else { -        EmitDifference("label", S.EndLabel, BeginTag, BeginNumber,  -                       TAI->getShortenEHDataOn64Bit()); +        EmitDifference("label", S.EndLabel, BeginTag, BeginNumber, true);        }        Asm->EOL("Region length"); -      if (!S.PadLabel) { -        if (TD->getPointerSize() == sizeof(int32_t) || TAI->getShortenEHDataOn64Bit()) -          Asm->EmitInt32(0); -        else -          Asm->EmitInt64(0); -      } else { +      if (!S.PadLabel) +        Asm->EmitInt32(0); +      else          EmitSectionOffset("label", "eh_func_begin", S.PadLabel, SubprogramCount, -                          TAI->getShortenEHDataOn64Bit(), true); -      } +                          true, true);        Asm->EOL("Landing pad");        Asm->EmitULEB128Bytes(S.Action); diff --git a/llvm/lib/Target/TargetAsmInfo.cpp b/llvm/lib/Target/TargetAsmInfo.cpp index c2504cc5802..5fa5abec8e9 100644 --- a/llvm/lib/Target/TargetAsmInfo.cpp +++ b/llvm/lib/Target/TargetAsmInfo.cpp @@ -90,7 +90,6 @@ TargetAsmInfo::TargetAsmInfo() :    DwarfRequiresFrameSection(true),    GlobalEHDirective(0),    SupportsWeakOmittedEHFrame(true), -  ShortenEHDataOn64Bit(false),    DwarfSectionOffsetDirective(0),    DwarfAbbrevSection(".debug_abbrev"),    DwarfInfoSection(".debug_info"), diff --git a/llvm/lib/Target/X86/X86TargetAsmInfo.cpp b/llvm/lib/Target/X86/X86TargetAsmInfo.cpp index 513e8f0e6ce..7e90cd9b3e7 100644 --- a/llvm/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/llvm/lib/Target/X86/X86TargetAsmInfo.cpp @@ -120,8 +120,6 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {      GlobalEHDirective = "\t.globl\t";      SupportsWeakOmittedEHFrame = false;      AbsoluteEHSectionOffsets = false; -    if (Subtarget->is64Bit()) -      ShortenEHDataOn64Bit = true;      DwarfEHFrameSection =      ".section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support";      DwarfExceptionSection = ".section __DATA,__gcc_except_tab"; | 

