From 46d79cf83a826dc8821e87f71bac2fe4ced2f942 Mon Sep 17 00:00:00 2001 From: Petr Hosek Date: Tue, 23 Aug 2016 21:34:53 +0000 Subject: [PATCH] [MC] Support .dc directives in assembler parser While these directives are mostly aliases for the existing integer and float value directives, some of them like .dc.a have no direct equivalents and are sometimes being used for convenience. Differential Revision: https://reviews.llvm.org/D23810 llvm-svn: 279577 --- lib/MC/MCParser/AsmParser.cpp | 26 ++++++++++++++++++++ test/MC/AsmParser/directive_dc.s | 41 ++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 test/MC/AsmParser/directive_dc.s diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index 46696609961..83c845274d8 100644 --- a/lib/MC/MCParser/AsmParser.cpp +++ b/lib/MC/MCParser/AsmParser.cpp @@ -426,6 +426,7 @@ private: DK_SET, DK_EQU, DK_EQUIV, DK_ASCII, DK_ASCIZ, DK_STRING, DK_BYTE, DK_SHORT, DK_RELOC, DK_VALUE, DK_2BYTE, DK_LONG, DK_INT, DK_4BYTE, DK_QUAD, DK_8BYTE, DK_OCTA, + DK_DC, DK_DC_A, DK_DC_B, DK_DC_D, DK_DC_L, DK_DC_S, DK_DC_W, DK_DC_X, DK_SINGLE, DK_FLOAT, DK_DOUBLE, DK_ALIGN, DK_ALIGN32, DK_BALIGN, DK_BALIGNW, DK_BALIGNL, DK_P2ALIGN, DK_P2ALIGNW, DK_P2ALIGNL, DK_ORG, DK_FILL, DK_ENDR, DK_BUNDLE_ALIGN_MODE, DK_BUNDLE_LOCK, DK_BUNDLE_UNLOCK, @@ -1905,6 +1906,23 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info, return parseDirectiveWarning(IDLoc); case DK_RELOC: return parseDirectiveReloc(IDLoc); + case DK_DC: + return parseDirectiveValue(2); + case DK_DC_A: + return parseDirectiveValue(getContext().getAsmInfo()->getPointerSize()); + case DK_DC_B: + return parseDirectiveValue(1); + case DK_DC_D: + return parseDirectiveRealValue(APFloat::IEEEdouble); + case DK_DC_L: + return parseDirectiveValue(4); + case DK_DC_S: + return parseDirectiveRealValue(APFloat::IEEEsingle); + case DK_DC_W: + return parseDirectiveValue(2); + case DK_DC_X: + return TokError(Twine(IDVal) + + " not currently supported for this target"); } return Error(IDLoc, "unknown directive"); @@ -4763,6 +4781,14 @@ void AsmParser::initializeDirectiveKindMap() { DirectiveKindMap[".error"] = DK_ERROR; DirectiveKindMap[".warning"] = DK_WARNING; DirectiveKindMap[".reloc"] = DK_RELOC; + DirectiveKindMap[".dc"] = DK_DC; + DirectiveKindMap[".dc.a"] = DK_DC_A; + DirectiveKindMap[".dc.b"] = DK_DC_B; + DirectiveKindMap[".dc.d"] = DK_DC_D; + DirectiveKindMap[".dc.l"] = DK_DC_L; + DirectiveKindMap[".dc.s"] = DK_DC_S; + DirectiveKindMap[".dc.w"] = DK_DC_W; + DirectiveKindMap[".dc.x"] = DK_DC_X; } MCAsmMacro *AsmParser::parseMacroLikeBody(SMLoc DirectiveLoc) { diff --git a/test/MC/AsmParser/directive_dc.s b/test/MC/AsmParser/directive_dc.s new file mode 100644 index 00000000000..5c6c9aa9529 --- /dev/null +++ b/test/MC/AsmParser/directive_dc.s @@ -0,0 +1,41 @@ +# RUN: not llvm-mc -triple i386-unknown-unknown %s | FileCheck %s +# RUN: not llvm-mc -triple i386-unknown-unknown %s 2>&1 > /dev/null| FileCheck %s --check-prefix=CHECK-ERROR + +# CHECK: TEST0: +# CHECK: .byte 0 +TEST0: + .dc.b 0 + +# CHECK: TEST1: +# CHECK: .short 3 +TEST1: + .dc 3 + +# CHECK: TEST2: +# CHECK: .short 3 +TEST2: + .dc.w 3 + +# CHECK: TEST3: +# CHECK: .long 8 +TEST3: + .dc.l 8 + +# CHECK: TEST4: +# CHECK: .long 8 +TEST4: + .dc.a 8 + +# CHECK: TEST5 +# CHECK: .long 1067412619 +TEST5: + .dc.s 1.2455 + +# CHECK: TEST6 +# CHECK: .quad 4597526701198935065 +TEST6: + .dc.d .232 + +# CHECK-ERROR: error: .dc.x not currently supported for this target +TEST7: + .dc.x 1.2e3