From 4514db2bfb2a93812f899955f1357733292f7b00 Mon Sep 17 00:00:00 2001 From: Colin LeMahieu Date: Sun, 7 Jun 2015 01:46:24 +0000 Subject: [PATCH] Teaching llvm-mc how to understand the defsym command line option. This allows integer-constant symbols to be defined on the command line and used during assembly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239240 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/MC/AsmParser/defsym.s | 20 ++++++++++++++++++++ test/MC/AsmParser/defsym_error1.s | 2 ++ test/MC/AsmParser/defsym_error2.s | 2 ++ tools/llvm-mc/llvm-mc.cpp | 26 ++++++++++++++++++++++++++ 4 files changed, 50 insertions(+) create mode 100644 test/MC/AsmParser/defsym.s create mode 100644 test/MC/AsmParser/defsym_error1.s create mode 100644 test/MC/AsmParser/defsym_error2.s diff --git a/test/MC/AsmParser/defsym.s b/test/MC/AsmParser/defsym.s new file mode 100644 index 00000000000..06981f54046 --- /dev/null +++ b/test/MC/AsmParser/defsym.s @@ -0,0 +1,20 @@ +# RUN: llvm-mc -filetype=obj -triple=i386-unknown-elf -defsym a=7 -defsym b=11 %s | llvm-objdump -t - | FileCheck %s + +.ifndef a +.err +.endif + +.if a<>7 +.err +.endif + +.ifndef b +.err +.endif + +.if b<>11 +.err +.endif + +# CHECK: 00000007 *ABS* 00000000 a +# CHECK: 0000000b *ABS* 00000000 b \ No newline at end of file diff --git a/test/MC/AsmParser/defsym_error1.s b/test/MC/AsmParser/defsym_error1.s new file mode 100644 index 00000000000..872577844d4 --- /dev/null +++ b/test/MC/AsmParser/defsym_error1.s @@ -0,0 +1,2 @@ +# RUN: not llvm-mc -filetype=obj -triple=i386-unknown-elf -defsym aaoeuaoeu %s 2>&1 | FileCheck %s +# CHECK: defsym must be of the form: sym=value diff --git a/test/MC/AsmParser/defsym_error2.s b/test/MC/AsmParser/defsym_error2.s new file mode 100644 index 00000000000..ec4cc79182f --- /dev/null +++ b/test/MC/AsmParser/defsym_error2.s @@ -0,0 +1,2 @@ +# RUN: not llvm-mc -filetype=obj -triple=i386-unknown-elf -defsym a=a %s 2>&1 | FileCheck %s +# CHECK: error: Value is not an integer: a diff --git a/tools/llvm-mc/llvm-mc.cpp b/tools/llvm-mc/llvm-mc.cpp index 6a8b49373df..9a9185c7523 100644 --- a/tools/llvm-mc/llvm-mc.cpp +++ b/tools/llvm-mc/llvm-mc.cpp @@ -70,6 +70,9 @@ static cl::opt PrintImmHex("print-imm-hex", cl::init(false), cl::desc("Prefer hex format for immediate values")); +static cl::list +DefineSymbol("defsym", cl::desc("Defines a symbol to be an integer constant")); + enum OutputFileType { OFT_Null, OFT_AssemblyFile, @@ -316,6 +319,26 @@ 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; + 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; +} + static int AssembleInput(const char *ProgName, const Target *TheTarget, SourceMgr &SrcMgr, MCContext &Ctx, MCStreamer &Str, MCAsmInfo &MAI, MCSubtargetInfo &STI, @@ -331,6 +354,9 @@ static int AssembleInput(const char *ProgName, const Target *TheTarget, return 1; } + int SymbolResult = fillCommandLineSymbols(*Parser); + if(SymbolResult) + return SymbolResult; Parser->setShowParsedOperands(ShowInstOperands); Parser->setTargetParser(*TAP);