From be66089390c5692f7a9d80e8832996f2d8fdc8c0 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Sun, 23 Feb 2014 06:22:09 +0000 Subject: [PATCH] ARM IAS: support .short and .hword This adds support for the .short and its alias .hword for adding literal values into the object file. This is similar to the .word directive, however, rather than inserting a value of 4 bytes, adds a 2-byte value. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@201968 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 14 +++++++----- test/MC/ARM/arm_word_directive.s | 6 ------ test/MC/ARM/directive-literals.s | 26 +++++++++++++++++++++++ 3 files changed, 35 insertions(+), 11 deletions(-) delete mode 100644 test/MC/ARM/arm_word_directive.s create mode 100644 test/MC/ARM/directive-literals.s diff --git a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index f84f4bcf5c5..82b510b9a5d 100644 --- a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -199,7 +199,7 @@ class ARMAsmParser : public MCTargetAsmParser { bool parsePrefix(ARMMCExpr::VariantKind &RefKind); bool parseMemRegOffsetShift(ARM_AM::ShiftOpc &ShiftType, unsigned &ShiftAmount); - bool parseDirectiveWord(unsigned Size, SMLoc L); + bool parseLiteralValues(unsigned Size, SMLoc L); bool parseDirectiveThumb(SMLoc L); bool parseDirectiveARM(SMLoc L); bool parseDirectiveThumbFunc(SMLoc L); @@ -7959,7 +7959,9 @@ MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, bool ARMAsmParser::ParseDirective(AsmToken DirectiveID) { StringRef IDVal = DirectiveID.getIdentifier(); if (IDVal == ".word") - return parseDirectiveWord(4, DirectiveID.getLoc()); + return parseLiteralValues(4, DirectiveID.getLoc()); + else if (IDVal == ".short" || IDVal == ".hword") + return parseLiteralValues(2, DirectiveID.getLoc()); else if (IDVal == ".thumb") return parseDirectiveThumb(DirectiveID.getLoc()); else if (IDVal == ".arm") @@ -8023,9 +8025,11 @@ bool ARMAsmParser::ParseDirective(AsmToken DirectiveID) { return true; } -/// parseDirectiveWord -/// ::= .word [ expression (, expression)* ] -bool ARMAsmParser::parseDirectiveWord(unsigned Size, SMLoc L) { +/// parseLiteralValues +/// ::= .hword expression [, expression]* +/// ::= .short expression [, expression]* +/// ::= .word expression [, expression]* +bool ARMAsmParser::parseLiteralValues(unsigned Size, SMLoc L) { if (getLexer().isNot(AsmToken::EndOfStatement)) { for (;;) { const MCExpr *Value; diff --git a/test/MC/ARM/arm_word_directive.s b/test/MC/ARM/arm_word_directive.s deleted file mode 100644 index e782479b608..00000000000 --- a/test/MC/ARM/arm_word_directive.s +++ /dev/null @@ -1,6 +0,0 @@ -@ RUN: llvm-mc -mcpu=cortex-a8 -triple arm-unknown-unknown %s | FileCheck %s - -@ CHECK: TEST0: -@ CHECK: .long 3 -TEST0: - .word 3 diff --git a/test/MC/ARM/directive-literals.s b/test/MC/ARM/directive-literals.s new file mode 100644 index 00000000000..eb09867d8aa --- /dev/null +++ b/test/MC/ARM/directive-literals.s @@ -0,0 +1,26 @@ +@ RUN: llvm-mc -triple arm %s | FileCheck %s + + .data + +short: + .short 0 + .short 0xdefe + +@ CHECK-LABEL: short +@ CHECK-NEXT: .short 0 +@ CHECK-NEXT: .short 57086 + +hword: + .hword 0 + .hword 0xdefe + +@ CHECK-LABEL: hword +@ CHECK-NEXT: .short 0 +@ CHECK-NEXT: .short 57086 + +word: + .word 3 + +@ CHECK-LABEL: word +@ CHECK-NEXT: .long 3 +