Use error() instead of fatal() to report an invalid address range.
authorRui Ueyama <ruiu@google.com>
Wed, 26 Dec 2018 19:15:04 +0000 (19:15 +0000)
committerRui Ueyama <ruiu@google.com>
Wed, 26 Dec 2018 19:15:04 +0000 (19:15 +0000)
In this patch we also use toString() to stringize a section.

llvm-svn: 350070

lld/ELF/SyntheticSections.cpp
lld/test/ELF/gdb-index-invalid-ranges.s

index d84d947..f459c1b 100644 (file)
@@ -2408,15 +2408,17 @@ static std::vector<GdbIndexSection::CuEntry> readCuList(DWARFContext &Dwarf) {
   return Ret;
 }
 
-static Expected<std::vector<GdbIndexSection::AddressEntry>>
+static std::vector<GdbIndexSection::AddressEntry>
 readAddressAreas(DWARFContext &Dwarf, InputSection *Sec) {
   std::vector<GdbIndexSection::AddressEntry> Ret;
 
   uint32_t CuIdx = 0;
   for (std::unique_ptr<DWARFUnit> &Cu : Dwarf.compile_units()) {
     Expected<DWARFAddressRangesVector> Ranges = Cu->collectAddressRanges();
-    if (!Ranges)
-      return Ranges.takeError();
+    if (!Ranges) {
+      error(toString(Sec) + ": " + toString(Ranges.takeError()));
+      return {};
+    }
 
     ArrayRef<InputSectionBase *> Sections = Sec->File->getSections();
     for (DWARFAddressRange &R : *Ranges) {
@@ -2433,7 +2435,7 @@ readAddressAreas(DWARFContext &Dwarf, InputSection *Sec) {
     ++CuIdx;
   }
 
-  return std::move(Ret);
+  return Ret;
 }
 
 template <class ELFT>
@@ -2565,17 +2567,7 @@ template <class ELFT> GdbIndexSection *GdbIndexSection::create() {
 
     Chunks[I].Sec = Sections[I];
     Chunks[I].CompilationUnits = readCuList(Dwarf);
-    Expected<std::vector<GdbIndexSection::AddressEntry>> AddressAreas =
-        readAddressAreas(Dwarf, Sections[I]);
-    if (!AddressAreas) {
-      std::string Msg = File->getName();
-      Msg += ": ";
-      if (!File->ArchiveName.empty())
-        Msg += "in archive " + File->ArchiveName + ": ";
-      Msg += toString(AddressAreas.takeError());
-      fatal(Msg);
-    }
-    Chunks[I].AddressAreas = *AddressAreas;
+    Chunks[I].AddressAreas = readAddressAreas(Dwarf, Sections[I]);
     NameAttrs[I] = readPubNamesAndTypes<ELFT>(
         static_cast<const LLDDwarfObj<ELFT> &>(Dwarf.getDWARFObj()),
         Chunks[I].CompilationUnits);
index 05165a2..1aac98d 100644 (file)
@@ -5,8 +5,8 @@
 # RUN: llvm-ar rc %t.a %t.o
 # RUN: not ld.lld --gdb-index -e main %t2.o %t.a -o %t 2>&1 | FileCheck --check-prefix=ARCHIVE %s
 
-# CHECK: ld.lld: error: {{.*}}gdb-index-invalid-ranges.s.tmp.o: decoding address ranges: invalid range list entry at offset 0x10
-# ARCHIVE: ld.lld: error: gdb-index-invalid-ranges.s.tmp.o: in archive {{.*}}gdb-index-invalid-ranges.s.tmp.a: decoding address ranges: invalid range list entry at offset 0x10
+# CHECK: ld.lld: error: {{.*}}gdb-index-invalid-ranges.s.tmp.o:(.debug_info): decoding address ranges: invalid range list entry at offset 0x10
+# ARCHIVE: ld.lld: error: {{.*}}gdb-index-invalid-ranges.s.tmp.a(gdb-index-invalid-ranges.s.tmp.o):(.debug_info): decoding address ranges: invalid range list entry at offset 0x10
 
 .section .text.foo1,"ax",@progbits
 .globl f1