[lld] r275608 - ELF: Include filenames in error messages.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 15 13:38:29 PDT 2016


Author: ruiu
Date: Fri Jul 15 15:38:28 2016
New Revision: 275608

URL: http://llvm.org/viewvc/llvm-project?rev=275608&view=rev
Log:
ELF: Include filenames in error messages.

Modified:
    lld/trunk/ELF/InputFiles.cpp
    lld/trunk/ELF/InputFiles.h
    lld/trunk/test/ELF/writable-merge.s

Modified: lld/trunk/ELF/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=275608&r1=275607&r2=275608&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.cpp (original)
+++ lld/trunk/ELF/InputFiles.cpp Fri Jul 15 15:38:28 2016
@@ -29,7 +29,7 @@ using namespace lld;
 using namespace lld::elf;
 
 // Returns "(internal)", "foo.a(bar.o)" or "baz.o".
-std::string elf::getFilename(InputFile *F) {
+std::string elf::getFilename(const InputFile *F) {
   if (!F)
     return "(internal)";
   if (!F->ArchiveName.empty())
@@ -67,7 +67,7 @@ typename ELFT::SymRange ELFFileBase<ELFT
   uint32_t NumSymbols = std::distance(Syms.begin(), Syms.end());
   uint32_t FirstNonLocal = Symtab->sh_info;
   if (FirstNonLocal > NumSymbols)
-    fatal("invalid sh_info in symbol table");
+    fatal(getFilename(this) + ": invalid sh_info in symbol table");
 
   if (OnlyGlobals)
     return makeArrayRef(Syms.begin() + FirstNonLocal, Syms.end());
@@ -151,13 +151,12 @@ elf::ObjectFile<ELFT>::getShtGroupEntrie
   ArrayRef<Elf_Word> Entries =
       check(Obj.template getSectionContentsAsArray<Elf_Word>(&Sec));
   if (Entries.empty() || Entries[0] != GRP_COMDAT)
-    fatal("unsupported SHT_GROUP format");
+    fatal(getFilename(this) + ": unsupported SHT_GROUP format");
   return Entries.slice(1);
 }
 
-template <class ELFT> static bool shouldMerge(const typename ELFT::Shdr &Sec) {
-  typedef typename ELFT::uint uintX_t;
-
+template <class ELFT>
+bool elf::ObjectFile<ELFT>::shouldMerge(const Elf_Shdr &Sec) {
   // We don't merge sections if -O0 (default is -O1). This makes sometimes
   // the linker significantly faster, although the output will be bigger.
   if (Config->Optimize == 0)
@@ -167,10 +166,11 @@ template <class ELFT> static bool should
   if (!(Flags & SHF_MERGE))
     return false;
   if (Flags & SHF_WRITE)
-    fatal("writable SHF_MERGE sections are not supported");
+    fatal(getFilename(this) + ": writable SHF_MERGE section is not supported");
   uintX_t EntSize = Sec.sh_entsize;
   if (!EntSize || Sec.sh_size % EntSize)
-    fatal("SHF_MERGE section size must be a multiple of sh_entsize");
+    fatal(getFilename(this) +
+          ": SHF_MERGE section size must be a multiple of sh_entsize");
 
   // Don't try to merge if the alignment is larger than the sh_entsize and this
   // is not SHF_STRINGS.
@@ -203,7 +203,8 @@ void elf::ObjectFile<ELFT>::initializeSe
         continue;
       for (uint32_t SecIndex : getShtGroupEntries(Sec)) {
         if (SecIndex >= Size)
-          fatal("invalid section index in group");
+          fatal(getFilename(this) + ": invalid section index in group: " +
+                Twine(SecIndex));
         Sections[SecIndex] = &InputSection<ELFT>::Discarded;
       }
       break;
@@ -237,11 +238,14 @@ void elf::ObjectFile<ELFT>::initializeSe
       }
       if (auto *S = dyn_cast<EhInputSection<ELFT>>(Target)) {
         if (S->RelocSection)
-          fatal("multiple relocation sections to .eh_frame are not supported");
+          fatal(
+              getFilename(this) +
+              ": multiple relocation sections to .eh_frame are not supported");
         S->RelocSection = &Sec;
         break;
       }
-      fatal("relocations pointing to SHF_MERGE are not supported");
+      fatal(getFilename(this) +
+            ": relocations pointing to SHF_MERGE are not supported");
     }
     case SHT_ARM_ATTRIBUTES:
       // FIXME: ARM meta-data section. At present attributes are ignored,
@@ -259,7 +263,8 @@ InputSectionBase<ELFT> *
 elf::ObjectFile<ELFT>::getRelocTarget(const Elf_Shdr &Sec) {
   uint32_t Idx = Sec.sh_info;
   if (Idx >= Sections.size())
-    fatal("invalid relocated section index");
+    fatal(getFilename(this) + ": invalid relocated section index: " +
+          Twine(Idx));
   InputSectionBase<ELFT> *Target = Sections[Idx];
 
   // Strictly speaking, a relocation section must be included in the
@@ -269,7 +274,7 @@ elf::ObjectFile<ELFT>::getRelocTarget(co
     return nullptr;
 
   if (!Target)
-    fatal("unsupported relocation reference");
+    fatal(getFilename(this) + ": unsupported relocation reference");
   return Target;
 }
 
@@ -312,7 +317,7 @@ elf::ObjectFile<ELFT>::createInputSectio
   if (Name == ".eh_frame" && !Config->Relocatable)
     return new (EHAlloc.Allocate()) EhInputSection<ELFT>(this, &Sec);
 
-  if (shouldMerge<ELFT>(Sec))
+  if (shouldMerge(Sec))
     return new (MAlloc.Allocate()) MergeInputSection<ELFT>(this, &Sec);
   return new (IAlloc.Allocate()) InputSection<ELFT>(this, &Sec);
 }
@@ -333,7 +338,7 @@ elf::ObjectFile<ELFT>::getSection(const
   if (Index == 0)
     return nullptr;
   if (Index >= Sections.size() || !Sections[Index])
-    fatal("invalid section index");
+    fatal(getFilename(this) + ": invalid section index: " + Twine(Index));
   InputSectionBase<ELFT> *S = Sections[Index];
   if (S == &InputSectionBase<ELFT>::Discarded)
     return S;
@@ -342,7 +347,7 @@ elf::ObjectFile<ELFT>::getSection(const
 
 template <class ELFT>
 SymbolBody *elf::ObjectFile<ELFT>::createSymbolBody(const Elf_Sym *Sym) {
-  unsigned char Binding = Sym->getBinding();
+  int Binding = Sym->getBinding();
   InputSectionBase<ELFT> *Sec = getSection(*Sym);
   if (Binding == STB_LOCAL) {
     if (Sym->st_shndx == SHN_UNDEF)
@@ -373,7 +378,7 @@ SymbolBody *elf::ObjectFile<ELFT>::creat
 
   switch (Binding) {
   default:
-    fatal("unexpected binding");
+    fatal(getFilename(this) + ": unexpected binding: " + Twine(Binding));
   case STB_GLOBAL:
   case STB_WEAK:
   case STB_GNU_UNIQUE:
@@ -471,7 +476,7 @@ template <class ELFT> void SharedFile<EL
     if (Dyn.d_tag == DT_SONAME) {
       uintX_t Val = Dyn.getVal();
       if (Val >= this->StringTable.size())
-        fatal("invalid DT_SONAME entry");
+        fatal(getFilename(this) + ": invalid DT_SONAME entry");
       SoName = StringRef(this->StringTable.data() + Val);
       return;
     }
@@ -581,7 +586,9 @@ static uint8_t getMachineKind(MemoryBuff
   case Triple::x86_64:
     return EM_X86_64;
   default:
-    fatal("could not infer e_machine from bitcode target triple " + TripleStr);
+    fatal(MB.getBufferIdentifier() +
+          ": could not infer e_machine from bitcode target triple " +
+          TripleStr);
   }
 }
 

Modified: lld/trunk/ELF/InputFiles.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.h?rev=275608&r1=275607&r2=275608&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.h (original)
+++ lld/trunk/ELF/InputFiles.h Fri Jul 15 15:38:28 2016
@@ -69,7 +69,7 @@ private:
 };
 
 // Returns "(internal)", "foo.a(bar.o)" or "baz.o".
-std::string getFilename(InputFile *F);
+std::string getFilename(const InputFile *F);
 
 template <typename ELFT> class ELFFileBase : public InputFile {
 public:
@@ -162,6 +162,7 @@ private:
   InputSectionBase<ELFT> *getRelocTarget(const Elf_Shdr &Sec);
   InputSectionBase<ELFT> *createInputSection(const Elf_Shdr &Sec);
 
+  bool shouldMerge(const Elf_Shdr &Sec);
   SymbolBody *createSymbolBody(const Elf_Sym *Sym);
 
   // List of all sections defined by this file.

Modified: lld/trunk/test/ELF/writable-merge.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/writable-merge.s?rev=275608&r1=275607&r2=275608&view=diff
==============================================================================
--- lld/trunk/test/ELF/writable-merge.s (original)
+++ lld/trunk/test/ELF/writable-merge.s Fri Jul 15 15:38:28 2016
@@ -1,6 +1,6 @@
 // REQUIRES: x86
 // RUN: llvm-mc %s -o %t.o -filetype=obj -triple=x86_64-pc-linux
 // RUN: not ld.lld %t.o -o %t 2>&1 | FileCheck %s
-// CHECK: writable SHF_MERGE sections are not supported
+// CHECK: writable SHF_MERGE section is not supported
 
-        .section	.foo,"awM", at progbits,4
+.section .foo,"awM", at progbits,4




More information about the llvm-commits mailing list