[lld] r287555 - Do plumbing work for CodeView debug info.
Jan Vesely via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 23 15:02:31 PST 2016
this commit broke build. I have attached fix, please review.
thanks,
Jan
On Mon, 2016-11-21 at 17:22 +0000, Rui Ueyama via llvm-commits wrote:
> Author: ruiu
> Date: Mon Nov 21 11:22:35 2016
> New Revision: 287555
>
> URL: http://llvm.org/viewvc/llvm-project?rev=287555&view=rev
> Log:
> Do plumbing work for CodeView debug info.
>
> Previously, we discarded .debug$ sections. This patch adds them to
> files so that PDB.cpp can access them.
>
> This patch also adds a debug option, /dumppdb, to dump debug info
> fed to createPDB so that we can verify that valid data has been passed.
>
> Added:
> lld/trunk/test/COFF/dumppdb.test
> Modified:
> lld/trunk/COFF/Config.h
> lld/trunk/COFF/Driver.cpp
> lld/trunk/COFF/InputFiles.cpp
> lld/trunk/COFF/InputFiles.h
> lld/trunk/COFF/Options.td
> lld/trunk/COFF/PDB.cpp
> lld/trunk/COFF/SymbolTable.h
>
> Modified: lld/trunk/COFF/Config.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Config.h?rev=287555&r1=287554&r2=287555&view=diff
> ==============================================================================
> --- lld/trunk/COFF/Config.h (original)
> +++ lld/trunk/COFF/Config.h Mon Nov 21 11:22:35 2016
> @@ -150,6 +150,9 @@ struct Configuration {
> bool TerminalServerAware = true;
> bool LargeAddressAware = false;
> bool HighEntropyVA = false;
> +
> + // This is for debugging.
> + bool DumpPdb = false;
> };
>
> extern Configuration *Config;
>
> Modified: lld/trunk/COFF/Driver.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=287555&r1=287554&r2=287555&view=diff
> ==============================================================================
> --- lld/trunk/COFF/Driver.cpp (original)
> +++ lld/trunk/COFF/Driver.cpp Mon Nov 21 11:22:35 2016
> @@ -528,6 +528,7 @@ void LinkerDriver::link(llvm::ArrayRef<c
> Config->TerminalServerAware = false;
> if (Args.hasArg(OPT_nosymtab))
> Config->WriteSymtab = false;
> + Config->DumpPdb = Args.hasArg(OPT_dumppdb);
>
> // Create a list of input files. Files can be given as arguments
> // for /defaultlib option.
>
> Modified: lld/trunk/COFF/InputFiles.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/InputFiles.cpp?rev=287555&r1=287554&r2=287555&view=diff
> ==============================================================================
> --- lld/trunk/COFF/InputFiles.cpp (original)
> +++ lld/trunk/COFF/InputFiles.cpp Mon Nov 21 11:22:35 2016
> @@ -150,13 +150,28 @@ void ObjectFile::initializeChunks() {
> Directives = std::string((const char *)Data.data(), Data.size());
> continue;
> }
> - // Skip non-DWARF debug info. MSVC linker converts the sections into
> - // a PDB file, but we don't support that.
> - if (Name == ".debug" || Name.startswith(".debug$"))
> - continue;
> - // We want to preserve DWARF debug sections only when /debug is on.
> +
> + // Object files may have DWARF debug info or MS CodeView debug info
> + // (or both).
> + //
> + // DWARF sections don't need any special handling from the perspective
> + // of the linker; they are just a data section containing relocations.
> + // We can just link them to complete debug info.
> + //
> + // CodeView needs a linker support. We need to interpret and debug
> + // info, and then write it to a separate .pdb file.
> +
> + // Ignore debug info unless /debug is given.
> if (!Config->Debug && Name.startswith(".debug"))
> continue;
> +
> + // CodeView sections are stored to a different vector because they are
> + // not linked in the regular manner.
> + if (Name == ".debug" || Name.startswith(".debug$")) {
> + DebugChunks.push_back(new (Alloc) SectionChunk(this, Sec));
> + continue;
> + }
> +
> if (Sec->Characteristics & llvm::COFF::IMAGE_SCN_LNK_REMOVE)
> continue;
> auto *C = new (Alloc) SectionChunk(this, Sec);
>
> Modified: lld/trunk/COFF/InputFiles.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/InputFiles.h?rev=287555&r1=287554&r2=287555&view=diff
> ==============================================================================
> --- lld/trunk/COFF/InputFiles.h (original)
> +++ lld/trunk/COFF/InputFiles.h Mon Nov 21 11:22:35 2016
> @@ -38,6 +38,7 @@ class Defined;
> class DefinedImportData;
> class DefinedImportThunk;
> class Lazy;
> +class SectionChunk;
> class SymbolBody;
> class Undefined;
>
> @@ -122,6 +123,7 @@ public:
> void parse() override;
> MachineTypes getMachineType() override;
> std::vector<Chunk *> &getChunks() { return Chunks; }
> + std::vector<SectionChunk *> &getDebugChunks() { return DebugChunks; }
> std::vector<SymbolBody *> &getSymbols() override { return SymbolBodies; }
>
> // Returns a SymbolBody object for the SymbolIndex'th symbol in the
> @@ -157,6 +159,9 @@ private:
> // chunks and non-section chunks for common symbols.
> std::vector<Chunk *> Chunks;
>
> + // CodeView debug info sections.
> + std::vector<SectionChunk *> DebugChunks;
> +
> // This vector contains the same chunks as Chunks, but they are
> // indexed such that you can get a SectionChunk by section index.
> // Nonexistent section indices are filled with null pointers.
>
> Modified: lld/trunk/COFF/Options.td
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Options.td?rev=287555&r1=287554&r2=287555&view=diff
> ==============================================================================
> --- lld/trunk/COFF/Options.td (original)
> +++ lld/trunk/COFF/Options.td Mon Nov 21 11:22:35 2016
> @@ -94,6 +94,7 @@ def help_q : Flag<["/?", "-?"], "">, Ali
> def nosymtab : F<"nosymtab">;
>
> // Flags for debugging
> +def dumppdb : Joined<["/", "-"], "dumppdb">;
> def lldmap : Joined<["/", "-"], "lldmap:">;
>
> //==============================================================================
>
> Modified: lld/trunk/COFF/PDB.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/PDB.cpp?rev=287555&r1=287554&r2=287555&view=diff
> ==============================================================================
> --- lld/trunk/COFF/PDB.cpp (original)
> +++ lld/trunk/COFF/PDB.cpp Mon Nov 21 11:22:35 2016
> @@ -9,9 +9,11 @@
>
> #include "PDB.h"
> #include "Chunks.h"
> +#include "Config.h"
> #include "Error.h"
> #include "SymbolTable.h"
> #include "Symbols.h"
> +#include "llvm/DebugInfo/CodeView/TypeDumper.h"
> #include "llvm/DebugInfo/MSF/MSFBuilder.h"
> #include "llvm/DebugInfo/MSF/MSFCommon.h"
> #include "llvm/DebugInfo/PDB/Raw/DbiStream.h"
> @@ -25,11 +27,13 @@
> #include "llvm/Object/COFF.h"
> #include "llvm/Support/Endian.h"
> #include "llvm/Support/FileOutputBuffer.h"
> +#include "llvm/Support/ScopedPrinter.h"
> #include <memory>
>
> using namespace lld;
> using namespace lld::coff;
> using namespace llvm;
> +using namespace llvm::codeview;
> using namespace llvm::support;
> using namespace llvm::support::endian;
>
> @@ -46,9 +50,35 @@ static std::vector<coff_section> getInpu
> return V;
> }
>
> +static SectionChunk *findByName(std::vector<SectionChunk *> &Sections,
> + StringRef Name) {
> + for (SectionChunk *C : Sections)
> + if (C->getSectionName() == Name)
> + return C;
> + return nullptr;
> +}
> +
> +// Dump CodeView debug info. This is for debugging.
> +static void dumpCodeView(SymbolTable *Symtab) {
> + ScopedPrinter W(outs());
> +
> + for (ObjectFile *File : Symtab->ObjectFiles) {
> + SectionChunk *C = findByName(File->getDebugChunks(), ".debug$T");
> + if (!C)
> + continue;
> +
> + CVTypeDumper TypeDumper(&W, false);
> + if (auto EC = TypeDumper.dump(C->getContents()))
> + fatal(EC, "CVTypeDumper::dump failed");
> + }
> +}
> +
> // Creates a PDB file.
> void coff::createPDB(StringRef Path, SymbolTable *Symtab,
> ArrayRef<uint8_t> SectionTable) {
> + if (Config->DumpPdb)
> + dumpCodeView(Symtab);
> +
> BumpPtrAllocator Alloc;
> pdb::PDBFileBuilder Builder(Alloc);
> ExitOnErr(Builder.initialize(4096)); // 4096 is blocksize
>
> Modified: lld/trunk/COFF/SymbolTable.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/SymbolTable.h?rev=287555&r1=287554&r2=287555&view=diff
> ==============================================================================
> --- lld/trunk/COFF/SymbolTable.h (original)
> +++ lld/trunk/COFF/SymbolTable.h Mon Nov 21 11:22:35 2016
> @@ -33,6 +33,7 @@ namespace coff {
> class Chunk;
> class Defined;
> class Lazy;
> +class SectionChunk;
> class SymbolBody;
> struct Symbol;
>
>
> Added: lld/trunk/test/COFF/dumppdb.test
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/dumppdb.test?rev=287555&view=auto
> ==============================================================================
> --- lld/trunk/test/COFF/dumppdb.test (added)
> +++ lld/trunk/test/COFF/dumppdb.test Mon Nov 21 11:22:35 2016
> @@ -0,0 +1,113 @@
> +# RUN: yaml2obj %s > %t.obj
> +# RUN: lld-link /debug /pdb:%t.pdb /dumppdb /dll /out:%t.dll /entry:main \
> +# RUN: /nodefaultlib %t.obj | FileCheck %s
> +
> +# CHECK: UnknownLeaf (0x1000) {
> +# CHECK-NEXT: TypeLeafKind: 0x0
> +# CHECK-NEXT: Kind: 0x0
> +# CHECK-NEXT: Length: 2
> +# CHECK-NEXT: }
> +
> +
> +--- !COFF
> +header:
> + Machine: IMAGE_FILE_MACHINE_AMD64
> + Characteristics: [ ]
> +sections:
> + - Name: .drectve
> + Characteristics: [ IMAGE_SCN_LNK_INFO, IMAGE_SCN_LNK_REMOVE ]
> + Alignment: 1
> + SectionData: 2020202F44454641554C544C49423A224C4942434D5422202F44454641554C544C49423A224F4C444E414D45532220
> + - Name: '.debug$S'
> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
> + Alignment: 1
> + SectionData: 04000000F1000000530000001500011100000000443A5C625C72657434322E6F626A003A003C1100600000D00013000000F259000013000000F25900004D6963726F736F667420285229204F7074696D697A696E6720436F6D70696C65720000F10000004E0000002A00471100000000000000000000000006000000000000000500000002100000000000000000006D61696E001C001210000000000000000000000000000000000000000000000042110002004F110000F2000000200000000000000000000000060000000000000001000000140000000000000001000080F4000000180000000100000010010BFC79AA614B536E3D64B110330D1E580000F30000000E00000000643A5C625C72657434322E63000000F10000000800000006004C110A100000
> + Relocations:
> + - VirtualAddress: 136
> + SymbolName: main
> + Type: IMAGE_REL_AMD64_SECREL
> + - VirtualAddress: 140
> + SymbolName: main
> + Type: IMAGE_REL_AMD64_SECTION
> + - VirtualAddress: 192
> + SymbolName: main
> + Type: IMAGE_REL_AMD64_SECREL
> + - VirtualAddress: 196
> + SymbolName: main
> + Type: IMAGE_REL_AMD64_SECTION
> + - Name: '.debug$T'
> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
> + Alignment: 1
> + SectionData: 040000000A00011201000000000000000E0008107400000000000000001000001200011600000000011000006D61696E00F3F2F10E00051600000000443A5C6200F3F2F12200051600000000433A5C767331345C56435C42494E5C616D6436345C636C2E6578650002010516000000002D5A37202D63202D4D54202D49433A5C767331345C56435C494E434C554445202D49433A5C767331345C56435C41544C4D46435C494E434C554445202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C31305C696E636C7564655C31302E302E31303135302E305C7563727422202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C4E4554465853444B5C342E365C696E636C7564655C756D22202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C382E315C696E636C7564655C73686172656422000A00041601000000051000008200051606100000202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C382E315C696E636C7564655C756D22202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C382E315C696E636C75
> 64655C77696E727422202D5443202D5800F3F2F10E0005160000000072657434322E63001600051600000000443A5C625C76633134302E70646200F11A00031605000310000004100000081000000910000007100000F2F1
> + - Name: '.text$mn'
> + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
> + Alignment: 16
> + SectionData: B82A000000C3
> +symbols:
> + - Name: '@comp.id'
> + Value: 17062386
> + SectionNumber: -1
> + SimpleType: IMAGE_SYM_TYPE_NULL
> + ComplexType: IMAGE_SYM_DTYPE_NULL
> + StorageClass: IMAGE_SYM_CLASS_STATIC
> + - Name: '@feat.00'
> + Value: 2147484048
> + SectionNumber: -1
> + SimpleType: IMAGE_SYM_TYPE_NULL
> + ComplexType: IMAGE_SYM_DTYPE_NULL
> + StorageClass: IMAGE_SYM_CLASS_STATIC
> + - Name: .drectve
> + Value: 0
> + SectionNumber: 1
> + SimpleType: IMAGE_SYM_TYPE_NULL
> + ComplexType: IMAGE_SYM_DTYPE_NULL
> + StorageClass: IMAGE_SYM_CLASS_STATIC
> + SectionDefinition:
> + Length: 47
> + NumberOfRelocations: 0
> + NumberOfLinenumbers: 0
> + CheckSum: 0
> + Number: 0
> + - Name: '.debug$S'
> + Value: 0
> + SectionNumber: 2
> + SimpleType: IMAGE_SYM_TYPE_NULL
> + ComplexType: IMAGE_SYM_DTYPE_NULL
> + StorageClass: IMAGE_SYM_CLASS_STATIC
> + SectionDefinition:
> + Length: 296
> + NumberOfRelocations: 4
> + NumberOfLinenumbers: 0
> + CheckSum: 0
> + Number: 0
> + - Name: '.debug$T'
> + Value: 0
> + SectionNumber: 3
> + SimpleType: IMAGE_SYM_TYPE_NULL
> + ComplexType: IMAGE_SYM_DTYPE_NULL
> + StorageClass: IMAGE_SYM_CLASS_STATIC
> + SectionDefinition:
> + Length: 576
> + NumberOfRelocations: 0
> + NumberOfLinenumbers: 0
> + CheckSum: 0
> + Number: 0
> + - Name: '.text$mn'
> + Value: 0
> + SectionNumber: 4
> + SimpleType: IMAGE_SYM_TYPE_NULL
> + ComplexType: IMAGE_SYM_DTYPE_NULL
> + StorageClass: IMAGE_SYM_CLASS_STATIC
> + SectionDefinition:
> + Length: 6
> + NumberOfRelocations: 0
> + NumberOfLinenumbers: 0
> + CheckSum: 2139436471
> + Number: 0
> + - Name: main
> + Value: 0
> + SectionNumber: 4
> + SimpleType: IMAGE_SYM_TYPE_NULL
> + ComplexType: IMAGE_SYM_DTYPE_FUNCTION
> + StorageClass: IMAGE_SYM_CLASS_EXTERNAL
> +...
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-COFF-Link-with-DebugInfoCodeView.patch
Type: text/x-patch
Size: 611 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161123/8f348ee1/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161123/8f348ee1/attachment.sig>
More information about the llvm-commits
mailing list