[lld] r330457 - [LLD/PDB] Emit first section contribution for DBI Module Descriptor.

Reid Kleckner via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 20 11:33:07 PDT 2018


This caused an ASan test to fail:
http://lab.llvm.org:8011/builders/sanitizer-windows/builds/27612/steps/run%20check-asan/logs/stdio

$ "C:/b/slave/sanitizer-windows/build/./bin/clang.exe" "-fsanitize=address"
"-mno-omit-leaf-frame-pointer" "-fno-omit-frame-pointer"
"-fno-optimize-sibling-calls" "-gline-tables-only" "-gcodeview"
"-gcolumn-info" "-fms-compatibility-version=19.00.24215.1" "-O2"
"C:\b\slave\sanitizer-windows\llvm\projects\compiler-rt\test\asan\TestCases\Windows\fuse-lld.cc"
"-o"
"C:\b\slave\sanitizer-windows\build\projects\compiler-rt\test\asan\I386WindowsConfig\TestCases\Windows\Output\fuse-lld.cc.tmp.exe"
"-g" "-gcodeview" "-fuse-ld=lld" "-Wl,-debug"
# command stderr:
Assertion failed: !Chunks.empty(), file
C:\b\slave\sanitizer-windows\llvm\tools\lld\COFF\PDB.cpp, line 821

PTAL

On Fri, Apr 20, 2018 at 11:03 AM Zachary Turner via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: zturner
> Date: Fri Apr 20 11:00:46 2018
> New Revision: 330457
>
> URL: http://llvm.org/viewvc/llvm-project?rev=330457&view=rev
> Log:
> [LLD/PDB] Emit first section contribution for DBI Module Descriptor.
>
> Part of the DBI stream is a list of variable length structures
> describing each module that contributes to the final executable.
>
> One member of this structure is a section contribution entry that
> describes the first section contribution in the output file for
> the given module.
>
> We have been leaving this structure unpopulated until now, so with
> this patch it is now filled out correctly.
>
> Differential Revision: https://reviews.llvm.org/D45832
>
> Modified:
>     lld/trunk/COFF/PDB.cpp
>     lld/trunk/test/COFF/pdb.test
>
> Modified: lld/trunk/COFF/PDB.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/PDB.cpp?rev=330457&r1=330456&r2=330457&view=diff
>
> ==============================================================================
> --- lld/trunk/COFF/PDB.cpp (original)
> +++ lld/trunk/COFF/PDB.cpp Fri Apr 20 11:00:46 2018
> @@ -125,9 +125,6 @@ public:
>    void addSections(ArrayRef<OutputSection *> OutputSections,
>                     ArrayRef<uint8_t> SectionTable);
>
> -  void addSectionContrib(pdb::DbiModuleDescriptorBuilder &LinkerModule,
> -                         OutputSection *OS, Chunk *C);
> -
>    /// Write the PDB to disk.
>    void commit();
>
> @@ -780,6 +777,32 @@ static ArrayRef<uint8_t> relocateDebugCh
>                             ".debug$S");
>  }
>
> +static pdb::SectionContrib createSectionContrib(const Chunk *C, uint32_t
> Modi) {
> +  OutputSection *OS = C->getOutputSection();
> +  pdb::SectionContrib SC;
> +  memset(&SC, 0, sizeof(SC));
> +  SC.ISect = OS->SectionIndex;
> +  SC.Off = C->getRVA() - OS->getRVA();
> +  SC.Size = C->getSize();
> +  if (auto *SecChunk = dyn_cast<SectionChunk>(C)) {
> +    SC.Characteristics = SecChunk->Header->Characteristics;
> +    SC.Imod = SecChunk->File->ModuleDBI->getModuleIndex();
> +    ArrayRef<uint8_t> Contents = SecChunk->getContents();
> +    JamCRC CRC(0);
> +    ArrayRef<char> CharContents = makeArrayRef(
> +        reinterpret_cast<const char *>(Contents.data()), Contents.size());
> +    CRC.update(CharContents);
> +    SC.DataCrc = CRC.getCRC();
> +  } else {
> +    SC.Characteristics = OS->Header.Characteristics;
> +    // FIXME: When we start creating DBI for import libraries, use those
> here.
> +    SC.Imod = Modi;
> +  }
> +  SC.RelocCrc = 0; // FIXME
> +
> +  return SC;
> +}
> +
>  void PDBLinker::addObjFile(ObjFile *File) {
>    // Add a module descriptor for every object file. We need to put an
> absolute
>    // path to the object into the PDB. If this is a plain object, we make
> its
> @@ -794,6 +817,18 @@ void PDBLinker::addObjFile(ObjFile *File
>    File->ModuleDBI =
> &ExitOnErr(Builder.getDbiBuilder().addModuleInfo(Name));
>    File->ModuleDBI->setObjFileName(Path);
>
> +  auto Chunks = File->getChunks();
> +  assert(!Chunks.empty());
> +  uint32_t Modi = File->ModuleDBI->getModuleIndex();
> +  for (Chunk *C : Chunks) {
> +    auto *SecChunk = dyn_cast<SectionChunk>(C);
> +    if (!SecChunk || !SecChunk->isLive())
> +      continue;
> +    pdb::SectionContrib SC = createSectionContrib(SecChunk, Modi);
> +    File->ModuleDBI->setFirstSectionContrib(SC);
> +    break;
> +  }
> +
>    // Before we can process symbol substreams from .debug$S, we need to
> process
>    // type information, file checksums, and the string table.  Add type
> info to
>    // the PDB first, so that we can get the map from object file type and
> item
> @@ -1110,31 +1145,6 @@ void PDBLinker::initialize(const llvm::c
>    DbiBuilder.setBuildNumber(14, 11);
>  }
>
> -void PDBLinker::addSectionContrib(pdb::DbiModuleDescriptorBuilder
> &LinkerModule,
> -                                  OutputSection *OS, Chunk *C) {
> -  pdb::SectionContrib SC;
> -  memset(&SC, 0, sizeof(SC));
> -  SC.ISect = OS->SectionIndex;
> -  SC.Off = C->getRVA() - OS->getRVA();
> -  SC.Size = C->getSize();
> -  if (auto *SecChunk = dyn_cast<SectionChunk>(C)) {
> -    SC.Characteristics = SecChunk->Header->Characteristics;
> -    SC.Imod = SecChunk->File->ModuleDBI->getModuleIndex();
> -    ArrayRef<uint8_t> Contents = SecChunk->getContents();
> -    JamCRC CRC(0);
> -    ArrayRef<char> CharContents = makeArrayRef(
> -        reinterpret_cast<const char *>(Contents.data()), Contents.size());
> -    CRC.update(CharContents);
> -    SC.DataCrc = CRC.getCRC();
> -  } else {
> -    SC.Characteristics = OS->Header.Characteristics;
> -    // FIXME: When we start creating DBI for import libraries, use those
> here.
> -    SC.Imod = LinkerModule.getModuleIndex();
> -  }
> -  SC.RelocCrc = 0; // FIXME
> -  Builder.getDbiBuilder().addSectionContrib(SC);
> -}
> -
>  void PDBLinker::addSections(ArrayRef<OutputSection *> OutputSections,
>                              ArrayRef<uint8_t> SectionTable) {
>    // It's not entirely clear what this is, but the * Linker * module uses
> it.
> @@ -1150,8 +1160,11 @@ void PDBLinker::addSections(ArrayRef<Out
>    // Add section contributions. They must be ordered by ascending RVA.
>    for (OutputSection *OS : OutputSections) {
>      addLinkerModuleSectionSymbol(LinkerModule, *OS, Alloc);
> -    for (Chunk *C : OS->getChunks())
> -      addSectionContrib(LinkerModule, OS, C);
> +    for (Chunk *C : OS->getChunks()) {
> +      pdb::SectionContrib SC =
> +          createSectionContrib(C, LinkerModule.getModuleIndex());
> +      Builder.getDbiBuilder().addSectionContrib(SC);
> +    }
>    }
>
>    // Add Section Map stream.
>
> Modified: lld/trunk/test/COFF/pdb.test
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/pdb.test?rev=330457&r1=330456&r2=330457&view=diff
>
> ==============================================================================
> --- lld/trunk/test/COFF/pdb.test (original)
> +++ lld/trunk/test/COFF/pdb.test Fri Apr 20 11:00:46 2018
> @@ -120,14 +120,16 @@
>  RAW:                               Modules
>  RAW-NEXT: ============================================================
>  RAW-NEXT:   Mod 0000 | `{{.*}}pdb.test.tmp1.obj`:
> -RAW-NEXT:              SC[???]  | mod = 0, 0000:0000, size = 0, data crc
> = 0, reloc crc = 0
> -RAW-NEXT:                         none
> +RAW-NEXT:              SC[.text]  | mod = 0, 0001:0000, size = 14, data
> crc = 1682752513, reloc crc = 0
> +RAW-NEXT:                           IMAGE_SCN_CNT_CODE |
> IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_MEM_EXECUTE |
> +RAW-NEXT:                           IMAGE_SCN_MEM_READ
>  RAW-NEXT:              Obj: `{{.*}}pdb.test.tmp1.obj`:
>  RAW-NEXT:              debug stream: 11, # files: 1, has ec info: false
>  RAW-NEXT:              pdb file ni: 0 ``, src file ni: 0 ``
>  RAW-NEXT:   Mod 0001 | `{{.*}}pdb.test.tmp2.obj`:
> -RAW-NEXT:              SC[???]  | mod = 1, 0000:0000, size = 0, data crc
> = 0, reloc crc = 0
> -RAW-NEXT:                         none
> +RAW-NEXT:              SC[.text]  | mod = 1, 0001:0016, size = 6, data
> crc = 2139436471, reloc crc = 0
> +RAW-NEXT:                           IMAGE_SCN_CNT_CODE |
> IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_MEM_EXECUTE |
> +RAW-NEXT:                           IMAGE_SCN_MEM_READ
>  RAW-NEXT:              Obj: `{{.*}}pdb.test.tmp2.obj`:
>  RAW-NEXT:              debug stream: 12, # files: 1, has ec info: false
>  RAW-NEXT:              pdb file ni: 0 ``, src file ni: 0 ``
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180420/28fd5e02/attachment.html>


More information about the llvm-commits mailing list