From: Mandeep Singh Grang Date: Thu, 1 Dec 2016 18:42:04 +0000 (+0000) Subject: [llvm] Implement support for -defsym assembler option X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=017b7af32a889e809151deb053bb14cf085326a1;p=llvm [llvm] Implement support for -defsym assembler option Summary: Changes to llvm-mc to move common logic to separate function. Related clang patch: https://reviews.llvm.org/D26213 Reviewers: rafael, t.p.northover, colinl, echristo, rengolin Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D26214 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288396 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h index e637afb9871..4c1367343db 100644 --- a/include/llvm/MC/MCContext.h +++ b/include/llvm/MC/MCContext.h @@ -302,6 +302,9 @@ namespace llvm { /// Get the symbol for \p Name, or null. MCSymbol *lookupSymbol(const Twine &Name) const; + /// Set value for a symbol. + int setSymbolValue(MCStreamer &Streamer, std::string &I); + /// getSymbols - Get a reference for the symbol table for clients that /// want to, for example, iterate over all symbols. 'const' because we /// still want any modifications to the table itself to use the MCContext diff --git a/lib/MC/MCContext.cpp b/lib/MC/MCContext.cpp index 7932fe441e3..77fe015eefe 100644 --- a/lib/MC/MCContext.cpp +++ b/lib/MC/MCContext.cpp @@ -260,6 +260,22 @@ MCSymbol *MCContext::lookupSymbol(const Twine &Name) const { return Symbols.lookup(NameRef); } +int MCContext::setSymbolValue(MCStreamer &Streamer, std::string &I) { + auto Pair = StringRef(I).split('='); + if (Pair.second.empty()) { + errs() << "error: defsym must be of the form: sym=value: " << I << "\n"; + return 1; + } + int64_t Value; + if (Pair.second.getAsInteger(0, Value)) { + errs() << "error: Value is not an integer: " << Pair.second << "\n"; + return 1; + } + auto Symbol = getOrCreateSymbol(Pair.first); + Streamer.EmitAssignment(Symbol, MCConstantExpr::create(Value, *this)); + return 0; +} + //===----------------------------------------------------------------------===// // Section Management //===----------------------------------------------------------------------===// diff --git a/tools/llvm-mc/llvm-mc.cpp b/tools/llvm-mc/llvm-mc.cpp index 452777b05c5..8a904a8ad7c 100644 --- a/tools/llvm-mc/llvm-mc.cpp +++ b/tools/llvm-mc/llvm-mc.cpp @@ -393,23 +393,10 @@ static int AsLexInput(SourceMgr &SrcMgr, MCAsmInfo &MAI, return Error; } -static int fillCommandLineSymbols(MCAsmParser &Parser){ - for(auto &I: DefineSymbol){ - auto Pair = StringRef(I).split('='); - if(Pair.second.empty()){ - errs() << "error: defsym must be of the form: sym=value: " << I; +static int fillCommandLineSymbols(MCAsmParser &Parser) { + for (auto &I: DefineSymbol) + if (Parser.getContext().setSymbolValue(Parser.getStreamer(), I)) return 1; - } - int64_t Value; - if(Pair.second.getAsInteger(0, Value)){ - errs() << "error: Value is not an integer: " << Pair.second; - return 1; - } - auto &Context = Parser.getContext(); - auto Symbol = Context.getOrCreateSymbol(Pair.first); - Parser.getStreamer().EmitAssignment(Symbol, - MCConstantExpr::create(Value, Context)); - } return 0; }