1
0
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:
Alexandre Ganea 2020-06-18 09:16:59 -04:00
parent 49932069f7
commit 6d094fdfcc

View File

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