forked from OSchip/llvm-project
Driver: begin threading frontend support for SymbolRewriter
Allow blessed access to the symbol rewriter from the driver. Although the symbol rewriter could be invoked through tools like opt and llc, it would not accessible from the frontend. This allows us to read the rewrite map files in the frontend rather than the backend and enable symbol rewriting for actually performing the symbol interpositioning. llvm-svn: 225504
This commit is contained in:
parent
7e87384592
commit
76a4b95ad8
|
@ -577,6 +577,13 @@ def frewrite_includes : Flag<["-"], "frewrite-includes">, Group<f_Group>,
|
|||
Flags<[CC1Option]>;
|
||||
def fno_rewrite_includes : Flag<["-"], "fno-rewrite-includes">, Group<f_Group>;
|
||||
|
||||
def frewrite_map_file : Separate<["-"], "frewrite-map-file">,
|
||||
Group<f_Group>,
|
||||
Flags<[ DriverOption, CC1Option ]>;
|
||||
def frewrite_map_file_EQ : Joined<["-"], "frewrite-map-file=">,
|
||||
Group<f_Group>,
|
||||
Flags<[DriverOption]>;
|
||||
|
||||
def ffreestanding : Flag<["-"], "ffreestanding">, Group<f_Group>, Flags<[CC1Option]>,
|
||||
HelpText<"Assert that the compilation takes place in a freestanding environment">;
|
||||
def fgnu_keywords : Flag<["-"], "fgnu-keywords">, Group<f_Group>, Flags<[CC1Option]>,
|
||||
|
|
|
@ -176,6 +176,9 @@ public:
|
|||
/// flag.
|
||||
std::shared_ptr<llvm::Regex> OptimizationRemarkAnalysisPattern;
|
||||
|
||||
/// Set of files definining the rules for the symbol rewriting.
|
||||
std::vector<std::string> RewriteMapFiles;
|
||||
|
||||
public:
|
||||
// Define accessors/mutators for code generation options of enumeration type.
|
||||
#define CODEGENOPT(Name, Bits, Default)
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include "llvm/Transforms/Instrumentation.h"
|
||||
#include "llvm/Transforms/ObjCARC.h"
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
#include "llvm/Transforms/Utils/SymbolRewriter.h"
|
||||
#include <memory>
|
||||
using namespace clang;
|
||||
using namespace llvm;
|
||||
|
@ -234,6 +235,17 @@ static TargetLibraryInfo *createTLI(llvm::Triple &TargetTriple,
|
|||
return TLI;
|
||||
}
|
||||
|
||||
static void addSymbolRewriterPass(const CodeGenOptions &Opts,
|
||||
PassManager *MPM) {
|
||||
llvm::SymbolRewriter::RewriteDescriptorList DL;
|
||||
|
||||
llvm::SymbolRewriter::RewriteMapParser MapParser;
|
||||
for (const auto &MapFile : Opts.RewriteMapFiles)
|
||||
MapParser.parse(MapFile, &DL);
|
||||
|
||||
MPM->add(createRewriteSymbolsPass(DL));
|
||||
}
|
||||
|
||||
void EmitAssemblyHelper::CreatePasses() {
|
||||
unsigned OptLevel = CodeGenOpts.OptimizationLevel;
|
||||
CodeGenOptions::InliningMethod Inlining = CodeGenOpts.getInlining();
|
||||
|
@ -346,6 +358,8 @@ void EmitAssemblyHelper::CreatePasses() {
|
|||
|
||||
// Set up the per-module pass manager.
|
||||
PassManager *MPM = getPerModulePasses();
|
||||
if (!CodeGenOpts.RewriteMapFiles.empty())
|
||||
addSymbolRewriterPass(CodeGenOpts, MPM);
|
||||
if (CodeGenOpts.VerifyModule)
|
||||
MPM->add(createDebugInfoVerifierPass());
|
||||
|
||||
|
|
|
@ -2781,6 +2781,19 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
|
||||
// LLVM Code Generator Options.
|
||||
|
||||
if (Args.hasArg(options::OPT_frewrite_map_file) ||
|
||||
Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
|
||||
for (arg_iterator
|
||||
MFI = Args.filtered_begin(options::OPT_frewrite_map_file,
|
||||
options::OPT_frewrite_map_file_EQ),
|
||||
MFE = Args.filtered_end();
|
||||
MFI != MFE; ++MFI) {
|
||||
CmdArgs.push_back("-frewrite-map-file");
|
||||
CmdArgs.push_back((*MFI)->getValue());
|
||||
(*MFI)->claim();
|
||||
}
|
||||
}
|
||||
|
||||
if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
|
||||
StringRef v = A->getValue();
|
||||
CmdArgs.push_back("-mllvm");
|
||||
|
|
|
@ -594,6 +594,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
|
|||
if (NeedLocTracking && Opts.getDebugInfo() == CodeGenOptions::NoDebugInfo)
|
||||
Opts.setDebugInfo(CodeGenOptions::LocTrackingOnly);
|
||||
|
||||
Opts.RewriteMapFiles = Args.getAllArgValues(OPT_frewrite_map_file);
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
// RUN: %clang -frewrite-map-file %S/Inputs/rewrite.map -### %s 2>&1 | FileCheck %s -check-prefix CHECK-SINGLE
|
||||
|
||||
// CHECK-SINGLE: "-frewrite-map-file" "{{.*[\\/]}}rewrite.map"
|
||||
|
||||
// RUN: %clang -frewrite-map-file %S/Inputs/rewrite-1.map -frewrite-map-file %S/Inputs/rewrite-2.map -### %s 2>&1 | FileCheck %s -check-prefix CHECK-MULTIPLE
|
||||
|
||||
// CHECK-MULTIPLE: "-frewrite-map-file" "{{.*[\\/]}}rewrite-1.map" "-frewrite-map-file" "{{.*[\\/]}}rewrite-2.map"
|
||||
|
||||
// RUN: %clang -frewrite-map-file=%S/Inputs/rewrite.map -### %s 2>&1 | FileCheck %s -check-prefix CHECK-SINGLE-EQ
|
||||
|
||||
// CHECK-SINGLE-EQ: "-frewrite-map-file" "{{.*[\\/]}}rewrite.map"
|
||||
|
||||
// RUN: %clang -frewrite-map-file=%S/Inputs/rewrite-1.map -frewrite-map-file=%S/Inputs/rewrite-2.map -### %s 2>&1 | FileCheck %s -check-prefix CHECK-MULTIPLE-EQ
|
||||
|
||||
// CHECK-MULTIPLE-EQ: "-frewrite-map-file" "{{.*[\\/]}}rewrite-1.map"
|
||||
// CHECK-MULTIPLE-EQ: "-frewrite-map-file" "{{.*[\\/]}}rewrite-2.map"
|
||||
|
||||
// RUN: %clang -frewrite-map-file %S/Inputs/rewrite-1.map -frewrite-map-file=%S/Inputs/rewrite-2.map -### %s 2>&1 | FileCheck %s -check-prefix CHECK-MIXED
|
||||
|
||||
// CHECK-MIXED: "-frewrite-map-file" "{{.*[\\/]}}rewrite-1.map" "-frewrite-map-file" "{{.*[\\/]}}rewrite-2.map"
|
||||
|
Loading…
Reference in New Issue