[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