forked from OSchip/llvm-project
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:
parent
557890126a
commit
94aa62e48a
|
@ -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;
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
@ -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: ]
|
||||
|
|
Loading…
Reference in New Issue