diff options
Diffstat (limited to 'tools/driver/cc1as_main.cpp')
| -rw-r--r-- | tools/driver/cc1as_main.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/tools/driver/cc1as_main.cpp b/tools/driver/cc1as_main.cpp index 2d17be99e2d5..263751346b80 100644 --- a/tools/driver/cc1as_main.cpp +++ b/tools/driver/cc1as_main.cpp @@ -77,6 +77,9 @@ struct AssemblerInvocation { /// be a list of strings starting with '+' or '-'. std::vector<std::string> Features; + /// The list of symbol definitions. + std::vector<std::string> SymbolDefs; + /// @} /// @name Language Options /// @{ @@ -252,6 +255,7 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, Opts.RelocationModel = Args.getLastArgValue(OPT_mrelocation_model, "pic"); Opts.IncrementalLinkerCompatible = Args.hasArg(OPT_mincremental_linker_compatible); + Opts.SymbolDefs = Args.getAllArgValues(OPT_defsym); return Success; } @@ -379,7 +383,8 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts, MCAsmBackend *MAB = nullptr; if (Opts.ShowEncoding) { CE = TheTarget->createMCCodeEmitter(*MCII, *MRI, Ctx); - MAB = TheTarget->createMCAsmBackend(*MRI, Opts.Triple, Opts.CPU); + MCTargetOptions Options; + MAB = TheTarget->createMCAsmBackend(*MRI, Opts.Triple, Opts.CPU, Options); } auto FOut = llvm::make_unique<formatted_raw_ostream>(*Out); Str.reset(TheTarget->createAsmStreamer( @@ -396,8 +401,9 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts, } MCCodeEmitter *CE = TheTarget->createMCCodeEmitter(*MCII, *MRI, Ctx); + MCTargetOptions Options; MCAsmBackend *MAB = TheTarget->createMCAsmBackend(*MRI, Opts.Triple, - Opts.CPU); + Opts.CPU, Options); Triple T(Opts.Triple); Str.reset(TheTarget->createMCObjectStreamer( T, Ctx, *MAB, *Out, CE, *STI, Opts.RelaxAll, @@ -418,6 +424,17 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts, if (!TAP) Failed = Diags.Report(diag::err_target_unknown_triple) << Opts.Triple; + // Set values for symbols, if any. + for (auto &S : Opts.SymbolDefs) { + auto Pair = StringRef(S).split('='); + auto Sym = Pair.first; + auto Val = Pair.second; + int64_t Value; + // We have already error checked this in the driver. + Val.getAsInteger(0, Value); + Ctx.setSymbolValue(Parser->getStreamer(), Sym, Value); + } + if (!Failed) { Parser->setTargetParser(*TAP.get()); Failed = Parser->Run(Opts.NoInitialTextSection); |
