[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