forked from OSchip/llvm-project
Support -fdebug-prefix-map for assembler source (pass to cc1as). This
is useful to omit the debug compilation dir when compiling assembly files with -g. Part of PR38050. Patch by Siddhartha Bagaria! Differential Revision: https://reviews.llvm.org/D48989 llvm-svn: 336685
This commit is contained in:
parent
509a1e7a9b
commit
9b292b4585
|
@ -1741,7 +1741,8 @@ def fsplit_dwarf_inlining: Flag <["-"], "fsplit-dwarf-inlining">, Group<f_Group>
|
|||
def fno_split_dwarf_inlining: Flag<["-"], "fno-split-dwarf-inlining">, Group<f_Group>,
|
||||
Flags<[CC1Option]>;
|
||||
def fdebug_prefix_map_EQ
|
||||
: Joined<["-"], "fdebug-prefix-map=">, Group<f_Group>, Flags<[CC1Option]>,
|
||||
: Joined<["-"], "fdebug-prefix-map=">, Group<f_Group>,
|
||||
Flags<[CC1Option,CC1AsOption]>,
|
||||
HelpText<"remap file source paths in debug info">;
|
||||
def g_Flag : Flag<["-"], "g">, Group<g_Group>,
|
||||
HelpText<"Generate source-level debug information">;
|
||||
|
|
|
@ -600,6 +600,18 @@ static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
|
|||
}
|
||||
}
|
||||
|
||||
/// Add a CC1 and CC1AS option to specify the debug file path prefix map.
|
||||
static void addDebugPrefixMapArg(const Driver &D, const ArgList &Args, ArgStringList &CmdArgs) {
|
||||
for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
|
||||
StringRef Map = A->getValue();
|
||||
if (Map.find('=') == StringRef::npos)
|
||||
D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
|
||||
else
|
||||
CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
|
||||
A->claim();
|
||||
}
|
||||
}
|
||||
|
||||
/// Vectorize at all optimization levels greater than 1 except for -Oz.
|
||||
/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
|
||||
static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
|
||||
|
@ -3800,14 +3812,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
// Add in -fdebug-compilation-dir if necessary.
|
||||
addDebugCompDirArg(Args, CmdArgs);
|
||||
|
||||
for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
|
||||
StringRef Map = A->getValue();
|
||||
if (Map.find('=') == StringRef::npos)
|
||||
D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
|
||||
else
|
||||
CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
|
||||
A->claim();
|
||||
}
|
||||
addDebugPrefixMapArg(D, Args, CmdArgs);
|
||||
|
||||
if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
|
||||
options::OPT_ftemplate_depth_EQ)) {
|
||||
|
@ -5352,6 +5357,8 @@ void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
// Add the -fdebug-compilation-dir flag if needed.
|
||||
addDebugCompDirArg(Args, CmdArgs);
|
||||
|
||||
addDebugPrefixMapArg(getToolChain().getDriver(), Args, CmdArgs);
|
||||
|
||||
// Set the AT_producer to the clang version when using the integrated
|
||||
// assembler on assembly source files.
|
||||
CmdArgs.push_back("-dwarf-debug-producer");
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
// RUN: %clang -### -g -fdebug-prefix-map=old=new %s 2>&1 | FileCheck %s
|
||||
|
||||
// CHECK: cc1as
|
||||
// CHECK-SAME: -fdebug-prefix-map=old=new
|
||||
|
||||
// More tests for this flag in debug-prefix-map.c.
|
|
@ -94,6 +94,7 @@ struct AssemblerInvocation {
|
|||
std::string DwarfDebugFlags;
|
||||
std::string DwarfDebugProducer;
|
||||
std::string DebugCompilationDir;
|
||||
std::map<const std::string, const std::string> DebugPrefixMap;
|
||||
llvm::DebugCompressionType CompressDebugSections =
|
||||
llvm::DebugCompressionType::None;
|
||||
std::string MainFileName;
|
||||
|
@ -233,6 +234,9 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
|
|||
Opts.DebugCompilationDir = Args.getLastArgValue(OPT_fdebug_compilation_dir);
|
||||
Opts.MainFileName = Args.getLastArgValue(OPT_main_file_name);
|
||||
|
||||
for (const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ))
|
||||
Opts.DebugPrefixMap.insert(StringRef(Arg).split('='));
|
||||
|
||||
// Frontend Options
|
||||
if (Args.hasArg(OPT_INPUT)) {
|
||||
bool First = true;
|
||||
|
@ -377,6 +381,9 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts,
|
|||
Ctx.setDwarfDebugProducer(StringRef(Opts.DwarfDebugProducer));
|
||||
if (!Opts.DebugCompilationDir.empty())
|
||||
Ctx.setCompilationDir(Opts.DebugCompilationDir);
|
||||
if (!Opts.DebugPrefixMap.empty())
|
||||
for (const auto &KV : Opts.DebugPrefixMap)
|
||||
Ctx.addDebugPrefixMapEntry(KV.first, KV.second);
|
||||
if (!Opts.MainFileName.empty())
|
||||
Ctx.setMainFileName(StringRef(Opts.MainFileName));
|
||||
Ctx.setDwarfVersion(Opts.DwarfVersion);
|
||||
|
|
Loading…
Reference in New Issue