mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[CodeView] Add full repro to LF_BUILDINFO record
This patch adds some missing information to the LF_BUILDINFO which allows for rebuilding an .OBJ without any external dependency but the .OBJ itself (other than the compiler executable). Some tools need this information to reproduce a build without any knowledge of the build system. The LF_BUILDINFO therefore stores a full path to the compiler, the PWD (which is the CWD at program startup), a relative or absolute path to the TU, and the full CC1 command line. The command line needs to be freestanding (not depend on any environment variable). In the same way, MSVC doesn't store the provided command-line, but an expanded version (somehow their equivalent of CC1) which is also freestanding. For more information see PR36198 and D43002. Differential Revision: https://reviews.llvm.org/D80833
This commit is contained in:
parent
49932069f7
commit
6d094fdfcc
@ -77,6 +77,7 @@
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/FormatVariadic.h"
|
||||
#include "llvm/Support/Path.h"
|
||||
#include "llvm/Support/Program.h"
|
||||
#include "llvm/Support/SMLoc.h"
|
||||
#include "llvm/Support/ScopedPrinter.h"
|
||||
#include "llvm/Target/TargetLoweringObjectFile.h"
|
||||
@ -831,6 +832,30 @@ static TypeIndex getStringIdTypeIdx(GlobalTypeTableBuilder &TypeTable,
|
||||
return TypeTable.writeLeafType(SIR);
|
||||
}
|
||||
|
||||
static std::string flattenCommandLine(ArrayRef<const char *> Args,
|
||||
StringRef MainFilename) {
|
||||
std::string FlatCmdLine;
|
||||
raw_string_ostream OS(FlatCmdLine);
|
||||
StringRef LastArg;
|
||||
for (StringRef Arg : Args) {
|
||||
if (Arg.empty())
|
||||
continue;
|
||||
// The command-line shall not contain the file to compile.
|
||||
if (Arg == MainFilename && LastArg != "-main-file-name")
|
||||
continue;
|
||||
// Also remove the output file.
|
||||
if (Arg == "-o" || LastArg == "-o") {
|
||||
LastArg = Arg;
|
||||
continue;
|
||||
}
|
||||
if (!LastArg.empty())
|
||||
FlatCmdLine += " ";
|
||||
llvm::sys::printArg(OS, Arg, /*Quote=*/true);
|
||||
LastArg = Arg;
|
||||
}
|
||||
return FlatCmdLine;
|
||||
}
|
||||
|
||||
void CodeViewDebug::emitBuildInfo() {
|
||||
// First, make LF_BUILDINFO. It's a sequence of strings with various bits of
|
||||
// build info. The known prefix is:
|
||||
@ -851,8 +876,14 @@ void CodeViewDebug::emitBuildInfo() {
|
||||
getStringIdTypeIdx(TypeTable, MainSourceFile->getDirectory());
|
||||
BuildInfoArgs[BuildInfoRecord::SourceFile] =
|
||||
getStringIdTypeIdx(TypeTable, MainSourceFile->getFilename());
|
||||
// FIXME: Path to compiler and command line. PDB is intentionally blank unless
|
||||
// we implement /Zi type servers.
|
||||
if (Asm->TM.Options.MCOptions.Argv0 != nullptr) {
|
||||
BuildInfoArgs[BuildInfoRecord::BuildTool] =
|
||||
getStringIdTypeIdx(TypeTable, Asm->TM.Options.MCOptions.Argv0);
|
||||
BuildInfoArgs[BuildInfoRecord::CommandLine] = getStringIdTypeIdx(
|
||||
TypeTable, flattenCommandLine(Asm->TM.Options.MCOptions.CommandLineArgs,
|
||||
MainSourceFile->getFilename()));
|
||||
}
|
||||
// FIXME: PDB is intentionally blank unless we implement /Zi type servers.
|
||||
BuildInfoRecord BIR(BuildInfoArgs);
|
||||
TypeIndex BuildInfoIndex = TypeTable.writeLeafType(BIR);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user