[llvm] 37fb3b3 - [AsmParser] Make generic directives and aliases case insensitive.

David Spickett via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 17 03:07:17 PST 2020


Author: David Spickett
Date: 2020-01-17T11:02:56Z
New Revision: 37fb3b33637b7ac120d68792ad2246c8b5d7eeff

URL: https://github.com/llvm/llvm-project/commit/37fb3b33637b7ac120d68792ad2246c8b5d7eeff
DIFF: https://github.com/llvm/llvm-project/commit/37fb3b33637b7ac120d68792ad2246c8b5d7eeff.diff

LOG: [AsmParser] Make generic directives and aliases case insensitive.

GCC will accept any case for assembler directives.
For example ".abort" and ".ABORT" (even ".aBoRt")
are equivalent.

https://sourceware.org/binutils/docs/as/Pseudo-Ops.html#Pseudo-Ops
"The names are case insensitive for most targets,
and usually written in lower case."

Change llvm-mc to accept any case for generic directives
or aliases of those directives.

This for Bugzilla #39527.

Differential Revision: https://reviews.llvm.org/D72686

Added: 
    llvm/test/MC/AsmParser/directive_case_insensitive.s

Modified: 
    llvm/lib/MC/MCParser/AsmParser.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp
index 94a44c1f93b1..c5938b813f41 100644
--- a/llvm/lib/MC/MCParser/AsmParser.cpp
+++ b/llvm/lib/MC/MCParser/AsmParser.cpp
@@ -199,7 +199,7 @@ class AsmParser : public MCAsmParser {
   }
 
   void addAliasForDirective(StringRef Directive, StringRef Alias) override {
-    DirectiveKindMap[Directive] = DirectiveKindMap[Alias];
+    DirectiveKindMap[Directive.lower()] = DirectiveKindMap[Alias.lower()];
   }
 
   /// @name MCAsmParser Interface
@@ -1750,7 +1750,7 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info,
   // have to do this so that .endif isn't skipped in a ".if 0" block for
   // example.
   StringMap<DirectiveKind>::const_iterator DirKindIt =
-      DirectiveKindMap.find(IDVal);
+      DirectiveKindMap.find(IDVal.lower());
   DirectiveKind DirKind = (DirKindIt == DirectiveKindMap.end())
 
                               ? DK_NO_DIRECTIVE
@@ -5320,6 +5320,12 @@ bool AsmParser::parseDirectiveEndIf(SMLoc DirectiveLoc) {
 }
 
 void AsmParser::initializeDirectiveKindMap() {
+  /* Lookup will be done with the directive
+   * converted to lower case, so all these
+   * keys should be lower case.
+   * (target specific directives are handled
+   *  elsewhere)
+   */
   DirectiveKindMap[".set"] = DK_SET;
   DirectiveKindMap[".equ"] = DK_EQU;
   DirectiveKindMap[".equiv"] = DK_EQUIV;

diff  --git a/llvm/test/MC/AsmParser/directive_case_insensitive.s b/llvm/test/MC/AsmParser/directive_case_insensitive.s
new file mode 100644
index 000000000000..67a204bb0c68
--- /dev/null
+++ b/llvm/test/MC/AsmParser/directive_case_insensitive.s
@@ -0,0 +1,16 @@
+# RUN: llvm-mc -triple i386-unknown-unknown %s | FileCheck %s
+
+# CHECK: .byte 65
+        .ascii "A"
+# CHECK: .byte 66
+        .ASCII "B"
+# CHECK: .byte 67
+        .aScIi "C"
+
+# Note: using 2byte because it is an alias
+# CHECK: .short 4660
+        .2byte 0x1234
+# CHECK: .short 4661
+        .2BYTE 0x1235
+# CHECK: .short 4662
+        .2bYtE 0x1236


        


More information about the llvm-commits mailing list