COFF: Implement /pdbaltpath flag.

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
This commit is contained in:
Peter Collingbourne 2018-04-17 23:28:38 +00:00
parent 557890126a
commit 94aa62e48a
4 changed files with 26 additions and 21 deletions

View File

@ -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;

View File

@ -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);
}
@ -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.

View File

@ -121,14 +121,8 @@ private:
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 {
@ -138,12 +132,11 @@ public:
// 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;
};

View File

@ -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
@ -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: ]
@ -48,7 +48,7 @@
# CHECK: PDBSignature: 0x53445352
# CHECK: PDBGUID: [[GUID]]
# CHECK: PDBAge: 2
# CHECK: PDBFileName: {{.*}}.pdb
# CHECK: PDBFileName: {{.*}}2.pdb
# CHECK: }
# CHECK: }
# CHECK: ]