[PATCH] D40954: [ELF] - Teach LLD to hint about -fdebug-types-section.
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 19 15:23:28 PDT 2018
Most callers want just the location, so maybe leave a getErrorLocation
inline helper that returns getErrorPlace(Loc).Loc?
With that the implementation is fine, but is someone really hitting this
issue?
Cheers,
Rafael
George Rimar via Phabricator via llvm-commits
<llvm-commits at lists.llvm.org> writes:
> grimar updated this revision to Diff 138528.
> grimar edited reviewers, added: espindola; removed: rafael.
> grimar added a comment.
> Herald added a subscriber: arichardson.
>
> - Reimplemented.
>
>
> https://reviews.llvm.org/D40954
>
> Files:
> ELF/Arch/AArch64.cpp
> ELF/Arch/AMDGPU.cpp
> ELF/Arch/ARM.cpp
> ELF/Arch/AVR.cpp
> ELF/Arch/Mips.cpp
> ELF/Arch/PPC.cpp
> ELF/Arch/PPC64.cpp
> ELF/Arch/SPARCV9.cpp
> ELF/Arch/X86.cpp
> ELF/Arch/X86_64.cpp
> ELF/Target.cpp
> ELF/Target.h
> test/ELF/x86-64-reloc-debug-overflow.s
>
> Index: test/ELF/x86-64-reloc-debug-overflow.s
> ===================================================================
> --- test/ELF/x86-64-reloc-debug-overflow.s
> +++ test/ELF/x86-64-reloc-debug-overflow.s
> @@ -0,0 +1,12 @@
> +# REQUIRES: x86
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %S/Inputs/x86-64-reloc-error.s -o %tabs
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t
> +# RUN: not ld.lld -shared %tabs %t -o %t2 2>&1 | FileCheck %s
> +
> +# CHECK: (.debug_info+0x1): relocation R_X86_64_32 out of range: 68719476736 is not in [0, 4294967295]; consider recompiling with -fdebug-types-section to reduce size of debug sections
> +
> +# CHECK: (.debug_info+0x8): relocation R_X86_64_32S out of range: -281474976710656 is not in [-2147483648, 2147483647]; consider recompiling with -fdebug-types-section to reduce size of debug sections
> +
> +.section .debug_info,"", at progbits
> + movl $big, %edx
> + movq $foo - 0x1000000000000, %rdx
> Index: ELF/Target.h
> ===================================================================
> --- ELF/Target.h
> +++ ELF/Target.h
> @@ -139,7 +139,13 @@
> TargetInfo *getX86_64TargetInfo();
> template <class ELFT> TargetInfo *getMipsTargetInfo();
>
> -std::string getErrorLocation(const uint8_t *Loc);
> +struct ErrorPlace {
> + InputSectionBase *IS;
> + std::string Loc;
> +};
> +
> +// Returns input section and corresponding source string for the given location.
> +ErrorPlace getErrorPlace(const uint8_t *Loc);
>
> uint64_t getPPC64TocBase();
> uint64_t getAArch64Page(uint64_t Expr);
> @@ -151,9 +157,15 @@
>
> static inline void reportRangeError(uint8_t *Loc, RelType Type, const Twine &V,
> int64_t Min, uint64_t Max) {
> - error(getErrorLocation(Loc) + "relocation " + lld::toString(Type) +
> - " out of range: " + V + " is not in [" + Twine(Min) + ", " +
> - Twine(Max) + "]");
> + ErrorPlace ErrPlace = getErrorPlace(Loc);
> + StringRef Hint;
> + if (ErrPlace.IS && ErrPlace.IS->Name.startswith(".debug"))
> + Hint = "; consider recompiling with -fdebug-types-section to reduce size "
> + "of debug sections";
> +
> + error(ErrPlace.Loc + "relocation " + lld::toString(Type) +
> + " out of range: " + V.str() + " is not in [" + Twine(Min).str() + ", " +
> + Twine(Max).str() + "]" + Hint);
> }
>
> template <unsigned N>
> @@ -180,7 +192,7 @@
> template <unsigned N>
> static void checkAlignment(uint8_t *Loc, uint64_t V, RelType Type) {
> if ((V & (N - 1)) != 0)
> - error(getErrorLocation(Loc) + "improper alignment for relocation " +
> + error(getErrorPlace(Loc).Loc + "improper alignment for relocation " +
> lld::toString(Type) + ": 0x" + llvm::utohexstr(V) +
> " is not aligned to " + Twine(N) + " bytes");
> }
> Index: ELF/Target.cpp
> ===================================================================
> --- ELF/Target.cpp
> +++ ELF/Target.cpp
> @@ -87,29 +87,29 @@
> fatal("unknown target machine");
> }
>
> -template <class ELFT> static std::string getErrorLoc(const uint8_t *Loc) {
> +template <class ELFT> static ErrorPlace getErrPlace(const uint8_t *Loc) {
> for (InputSectionBase *D : InputSections) {
> auto *IS = dyn_cast<InputSection>(D);
> if (!IS || !IS->getParent())
> continue;
>
> uint8_t *ISLoc = IS->getParent()->Loc + IS->OutSecOff;
> if (ISLoc <= Loc && Loc < ISLoc + IS->getSize())
> - return IS->template getLocation<ELFT>(Loc - ISLoc) + ": ";
> + return {IS, IS->template getLocation<ELFT>(Loc - ISLoc) + ": "};
> }
> - return "";
> + return {};
> }
>
> -std::string elf::getErrorLocation(const uint8_t *Loc) {
> +ErrorPlace elf::getErrorPlace(const uint8_t *Loc) {
> switch (Config->EKind) {
> case ELF32LEKind:
> - return getErrorLoc<ELF32LE>(Loc);
> + return getErrPlace<ELF32LE>(Loc);
> case ELF32BEKind:
> - return getErrorLoc<ELF32BE>(Loc);
> + return getErrPlace<ELF32BE>(Loc);
> case ELF64LEKind:
> - return getErrorLoc<ELF64LE>(Loc);
> + return getErrPlace<ELF64LE>(Loc);
> case ELF64BEKind:
> - return getErrorLoc<ELF64BE>(Loc);
> + return getErrPlace<ELF64BE>(Loc);
> default:
> llvm_unreachable("unknown ELF type");
> }
> Index: ELF/Arch/X86_64.cpp
> ===================================================================
> --- ELF/Arch/X86_64.cpp
> +++ ELF/Arch/X86_64.cpp
> @@ -242,7 +242,7 @@
> memcpy(Inst, "\x48\xc7", 2);
> *RegSlot = 0xc0 | Reg;
> } else {
> - error(getErrorLocation(Loc - 3) +
> + error(getErrorPlace(Loc - 3).Loc +
> "R_X86_64_GOTTPOFF must be used in MOVQ or ADDQ instructions only");
> }
>
> @@ -320,7 +320,7 @@
> write64le(Loc, Val);
> break;
> default:
> - error(getErrorLocation(Loc) + "unrecognized reloc " + Twine(Type));
> + error(getErrorPlace(Loc).Loc + "unrecognized reloc " + Twine(Type));
> }
> }
>
> Index: ELF/Arch/X86.cpp
> ===================================================================
> --- ELF/Arch/X86.cpp
> +++ ELF/Arch/X86.cpp
> @@ -304,7 +304,7 @@
> write32le(Loc, Val);
> break;
> default:
> - error(getErrorLocation(Loc) + "unrecognized reloc " + Twine(Type));
> + error(getErrorPlace(Loc).Loc + "unrecognized reloc " + Twine(Type));
> }
> }
>
> Index: ELF/Arch/SPARCV9.cpp
> ===================================================================
> --- ELF/Arch/SPARCV9.cpp
> +++ ELF/Arch/SPARCV9.cpp
> @@ -118,7 +118,7 @@
> write64be(Loc, Val);
> break;
> default:
> - error(getErrorLocation(Loc) + "unrecognized reloc " + Twine(Type));
> + error(getErrorPlace(Loc).Loc + "unrecognized reloc " + Twine(Type));
> }
> }
>
> Index: ELF/Arch/PPC64.cpp
> ===================================================================
> --- ELF/Arch/PPC64.cpp
> +++ ELF/Arch/PPC64.cpp
> @@ -206,7 +206,7 @@
> break;
> }
> default:
> - error(getErrorLocation(Loc) + "unrecognized reloc " + Twine(Type));
> + error(getErrorPlace(Loc).Loc + "unrecognized reloc " + Twine(Type));
> }
> }
>
> Index: ELF/Arch/PPC.cpp
> ===================================================================
> --- ELF/Arch/PPC.cpp
> +++ ELF/Arch/PPC.cpp
> @@ -66,7 +66,7 @@
> write32be(Loc, read32be(Loc) | (Val & 0x3FFFFFC));
> break;
> default:
> - error(getErrorLocation(Loc) + "unrecognized reloc " + Twine(Type));
> + error(getErrorPlace(Loc).Loc + "unrecognized reloc " + Twine(Type));
> }
> }
>
> Index: ELF/Arch/Mips.cpp
> ===================================================================
> --- ELF/Arch/Mips.cpp
> +++ ELF/Arch/Mips.cpp
> @@ -463,7 +463,7 @@
> if (Type2 == R_MICROMIPS_SUB &&
> (Type3 == R_MICROMIPS_HI16 || Type3 == R_MICROMIPS_LO16))
> return std::make_pair(Type3, -Val);
> - error(getErrorLocation(Loc) + "unsupported relocations combination " +
> + error(getErrorPlace(Loc).Loc + "unsupported relocations combination " +
> Twine(Type));
> return std::make_pair(Type & 0xff, Val);
> }
> @@ -650,7 +650,7 @@
> writeShuffleValue<E>(Loc, Val, 23, 2);
> break;
> default:
> - error(getErrorLocation(Loc) + "unrecognized reloc " + Twine(Type));
> + error(getErrorPlace(Loc).Loc + "unrecognized reloc " + Twine(Type));
> }
> }
>
> Index: ELF/Arch/AVR.cpp
> ===================================================================
> --- ELF/Arch/AVR.cpp
> +++ ELF/Arch/AVR.cpp
> @@ -64,7 +64,7 @@
> break;
> }
> default:
> - error(getErrorLocation(Loc) + "unrecognized reloc " + toString(Type));
> + error(getErrorPlace(Loc).Loc + "unrecognized reloc " + toString(Type));
> }
> }
>
> Index: ELF/Arch/ARM.cpp
> ===================================================================
> --- ELF/Arch/ARM.cpp
> +++ ELF/Arch/ARM.cpp
> @@ -499,7 +499,7 @@
> (Val & 0x00ff)); // imm8
> break;
> default:
> - error(getErrorLocation(Loc) + "unrecognized reloc " + Twine(Type));
> + error(getErrorPlace(Loc).Loc + "unrecognized reloc " + Twine(Type));
> }
> }
>
> Index: ELF/Arch/AMDGPU.cpp
> ===================================================================
> --- ELF/Arch/AMDGPU.cpp
> +++ ELF/Arch/AMDGPU.cpp
> @@ -73,7 +73,7 @@
> write32le(Loc, Val >> 32);
> break;
> default:
> - error(getErrorLocation(Loc) + "unrecognized reloc " + Twine(Type));
> + error(getErrorPlace(Loc).Loc + "unrecognized reloc " + Twine(Type));
> }
> }
>
> Index: ELF/Arch/AArch64.cpp
> ===================================================================
> --- ELF/Arch/AArch64.cpp
> +++ ELF/Arch/AArch64.cpp
> @@ -337,7 +337,7 @@
> or32AArch64Imm(Loc, Val);
> break;
> default:
> - error(getErrorLocation(Loc) + "unrecognized reloc " + Twine(Type));
> + error(getErrorPlace(Loc).Loc + "unrecognized reloc " + Twine(Type));
> }
> }
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list