Skip to content

Commit

Permalink
COFF: Implement /pdbaltpath flag.
Browse files Browse the repository at this point in the history
I needed to revert r330223 because we were embedding an absolute PDB
path in the .rdata section, which ended up being laid out before the
.idata section and affecting its RVAs. This flag will let us control
the embedded path.

Differential Revision: https://reviews.llvm.org/D45747

llvm-svn: 330232
  • Loading branch information
pcc committed Apr 17, 2018
1 parent 5578901 commit 94aa62e
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 21 deletions.
1 change: 1 addition & 0 deletions lld/COFF/Config.h
Expand Up @@ -100,6 +100,7 @@ struct Configuration {
bool ShowTiming = false;
unsigned DebugTypes = static_cast<unsigned>(DebugType::None);
std::vector<std::string> NatvisFiles;
llvm::SmallString<128> PDBAltPath;
llvm::SmallString<128> PDBPath;
std::vector<llvm::StringRef> Argv;

Expand Down
19 changes: 15 additions & 4 deletions lld/COFF/Driver.cpp
Expand Up @@ -936,6 +936,8 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) {
if (ShouldCreatePDB) {
if (auto *Arg = Args.getLastArg(OPT_pdb))
Config->PDBPath = Arg->getValue();
if (auto *Arg = Args.getLastArg(OPT_pdbaltpath))
Config->PDBAltPath = Arg->getValue();
if (Args.hasArg(OPT_natvis))
Config->NatvisFiles = Args.getAllArgValues(OPT_natvis);
}
Expand Down Expand Up @@ -1301,10 +1303,19 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) {
getOutputPath((*Args.filtered(OPT_INPUT).begin())->getValue());
}

// Put the PDB next to the image if no /pdb flag was passed.
if (ShouldCreatePDB && Config->PDBPath.empty()) {
Config->PDBPath = Config->OutputFile;
sys::path::replace_extension(Config->PDBPath, ".pdb");
if (ShouldCreatePDB) {
// Put the PDB next to the image if no /pdb flag was passed.
if (Config->PDBPath.empty()) {
Config->PDBPath = Config->OutputFile;
sys::path::replace_extension(Config->PDBPath, ".pdb");
}

// The embedded PDB path should be the absolute path to the PDB if no
// /pdbaltpath flag was passed.
if (Config->PDBAltPath.empty()) {
Config->PDBAltPath = Config->PDBPath;
sys::fs::make_absolute(Config->PDBAltPath);
}
}

// Set default image base if /base is not given.
Expand Down
15 changes: 4 additions & 11 deletions lld/COFF/Writer.cpp
Expand Up @@ -121,14 +121,8 @@ class DebugDirectoryChunk : public Chunk {

class CVDebugRecordChunk : public Chunk {
public:
CVDebugRecordChunk() {
PDBAbsPath = Config->PDBPath;
if (!PDBAbsPath.empty())
llvm::sys::fs::make_absolute(PDBAbsPath);
}

size_t getSize() const override {
return sizeof(codeview::DebugInfo) + PDBAbsPath.size() + 1;
return sizeof(codeview::DebugInfo) + Config->PDBAltPath.size() + 1;
}

void writeTo(uint8_t *B) const override {
Expand All @@ -138,12 +132,11 @@ class CVDebugRecordChunk : public Chunk {

// variable sized field (PDB Path)
char *P = reinterpret_cast<char *>(B + OutputSectionOff + sizeof(*BuildId));
if (!PDBAbsPath.empty())
memcpy(P, PDBAbsPath.data(), PDBAbsPath.size());
P[PDBAbsPath.size()] = '\0';
if (!Config->PDBAltPath.empty())
memcpy(P, Config->PDBAltPath.data(), Config->PDBAltPath.size());
P[Config->PDBAltPath.size()] = '\0';
}

SmallString<128> PDBAbsPath;
mutable codeview::DebugInfo *BuildId = nullptr;
};

Expand Down
12 changes: 6 additions & 6 deletions lld/test/COFF/rsds.test
@@ -1,16 +1,16 @@
# RUN: yaml2obj %s > %t.obj

# RUN: rm -f %t.dll %t.pdb
# RUN: lld-link /debug /dll /out:%t.dll /entry:DllMain %t.obj
# RUN: lld-link /debug /pdbaltpath:test1.pdb /dll /out:%t.dll /entry:DllMain %t.obj
# RUN: llvm-readobj -coff-debug-directory %t.dll > %t.1.txt
# RUN: lld-link /debug /dll /out:%t.dll /entry:DllMain %t.obj
# RUN: lld-link /debug /pdbaltpath:test2.pdb /dll /out:%t.dll /entry:DllMain %t.obj
# RUN: llvm-readobj -coff-debug-directory %t.dll > %t.2.txt
# RUN: cat %t.1.txt %t.2.txt | FileCheck %s

# RUN: rm -f %t.dll %t.pdb
# RUN: lld-link /debug /pdb:%t.pdb /dll /out:%t.dll /entry:DllMain %t.obj
# RUN: lld-link /debug /pdb:%t1.pdb /dll /out:%t.dll /entry:DllMain %t.obj
# RUN: llvm-readobj -coff-debug-directory %t.dll > %t.3.txt
# RUN: lld-link /debug /pdb:%t.pdb /dll /out:%t.dll /entry:DllMain %t.obj
# RUN: lld-link /debug /pdb:%t2.pdb /dll /out:%t.dll /entry:DllMain %t.obj
# RUN: llvm-readobj -coff-debug-directory %t.dll > %t.4.txt
# RUN: cat %t.3.txt %t.4.txt | FileCheck %s

Expand All @@ -29,7 +29,7 @@
# CHECK: PDBSignature: 0x53445352
# CHECK: PDBGUID: [[GUID:\(([A-Za-z0-9]{2} ?){16}\)]]
# CHECK: PDBAge: 1
# CHECK: PDBFileName: {{.*}}.pdb
# CHECK: PDBFileName: {{.*}}1.pdb
# CHECK: }
# CHECK: }
# CHECK: ]
Expand All @@ -48,7 +48,7 @@
# CHECK: PDBSignature: 0x53445352
# CHECK: PDBGUID: [[GUID]]
# CHECK: PDBAge: 2
# CHECK: PDBFileName: {{.*}}.pdb
# CHECK: PDBFileName: {{.*}}2.pdb
# CHECK: }
# CHECK: }
# CHECK: ]
Expand Down

0 comments on commit 94aa62e

Please sign in to comment.