[llvm-commits] [llvm] r50825 - in /llvm/trunk: include/llvm/Target/TargetAsmInfo.h lib/CodeGen/DwarfWriter.cpp lib/Target/TargetAsmInfo.cpp lib/Target/X86/X86TargetAsmInfo.cpp

Dan Gohman gohman at apple.com
Wed May 7 14:58:13 PDT 2008


Hi Duncan,

This is triggering llvm-test failures on x86-64 on Darwin.

For example, in SingleSource/Benchmarks/CoyoteBench/fftbench:

Output/fftbench.llc.s:1994:non-relocatable subtraction expression,  
"___gxx_personality_v0" minus "EH_frame1"
Output/fftbench.llc.s:1994:symbol: "___gxx_personality_v0" can't be  
undefined in a subtraction expression

fftbench.llc.s line 1994 looks like this:

         .long   ___gxx_personality_v0+4 at GOTPCREL-.

Are you able to investigate this?

Thanks,

Dan

On May 7, 2008, at 12:11 PM, Duncan Sands wrote:

> Author: baldrick
> Date: Wed May  7 14:11:09 2008
> New Revision: 50825
>
> URL: http://llvm.org/viewvc/llvm-project?rev=50825&view=rev
> Log:
> Output correct exception handling and frame info
> on x86-64 linux.  This causes no regressions on
> 32 bit linux and 32 bit ppc.  More tests pass
> on 64 bit ppc with no regressions.  I didn't
> turn on eh on 64 bit linux because the intrinsics
> needed to compile the eh runtime aren't done
> yet.  But if you turn it on and link with the
> mainline runtime then eh seems to work fine
> on x86-64 linux with this patch.  Thanks to
> Dale for testing.  The main point of the patch
> is that if you output that some object is
> encoded using 4 bytes you had better not output
> 8 bytes for it: the patch makes everything
> consistent.
>
> Modified:
>    llvm/trunk/include/llvm/Target/TargetAsmInfo.h
>    llvm/trunk/lib/CodeGen/DwarfWriter.cpp
>    llvm/trunk/lib/Target/TargetAsmInfo.cpp
>    llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp
>
> Modified: llvm/trunk/include/llvm/Target/TargetAsmInfo.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetAsmInfo.h?rev=50825&r1=50824&r2=50825&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/include/llvm/Target/TargetAsmInfo.h (original)
> +++ llvm/trunk/include/llvm/Target/TargetAsmInfo.h Wed May  7  
> 14:11:09 2008
> @@ -339,10 +339,6 @@
>     /// handle a weak_definition of constant 0 for an omitted EH  
> frame.
>     bool SupportsWeakOmittedEHFrame;  // Defaults to true.
>
> -    /// ShortenEHDataON64Bit - True if target exception table  
> format requires
> -    /// 32-bit data in certain places even when targeting 64-bits.
> -    bool ShortenEHDataOn64Bit;    // Defaults to false.
> -
>     /// DwarfSectionOffsetDirective - Special section offset  
> directive.
>     const char* DwarfSectionOffsetDirective; // Defaults to NULL
>
> @@ -635,9 +631,6 @@
>     bool getSupportsWeakOmittedEHFrame() const {
>       return SupportsWeakOmittedEHFrame;
>     }
> -    bool getShortenEHDataOn64Bit() const {
> -      return ShortenEHDataOn64Bit;
> -    }
>     const char *getDwarfSectionOffsetDirective() const {
>       return DwarfSectionOffsetDirective;
>     }
>
> Modified: llvm/trunk/lib/CodeGen/DwarfWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/DwarfWriter.cpp?rev=50825&r1=50824&r2=50825&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/CodeGen/DwarfWriter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/DwarfWriter.cpp Wed May  7 14:11:09 2008
> @@ -2796,7 +2796,7 @@
>   /// 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 @@
>
>     // 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 @@
>     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 @@
>     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 @@
>                         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 @@
>     }
>
>     // 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 @@
>       }
>
>       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);
>
> Modified: llvm/trunk/lib/Target/TargetAsmInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetAsmInfo.cpp?rev=50825&r1=50824&r2=50825&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Target/TargetAsmInfo.cpp (original)
> +++ llvm/trunk/lib/Target/TargetAsmInfo.cpp Wed May  7 14:11:09 2008
> @@ -90,7 +90,6 @@
>   DwarfRequiresFrameSection(true),
>   GlobalEHDirective(0),
>   SupportsWeakOmittedEHFrame(true),
> -  ShortenEHDataOn64Bit(false),
>   DwarfSectionOffsetDirective(0),
>   DwarfAbbrevSection(".debug_abbrev"),
>   DwarfInfoSection(".debug_info"),
>
> Modified: llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp?rev=50825&r1=50824&r2=50825&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp Wed May  7  
> 14:11:09 2008
> @@ -120,8 +120,6 @@
>     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";
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list