[llvm] r184437 - [MC] Support @ variants with directional labels

Ulrich Weigand ulrich.weigand at de.ibm.com
Thu Jun 20 09:24:17 PDT 2013


Author: uweigand
Date: Thu Jun 20 11:24:17 2013
New Revision: 184437

URL: http://llvm.org/viewvc/llvm-project?rev=184437&view=rev
Log:

[MC] Support @ variants with directional labels

The assembler parser common code supports recognizing symbol variants
using the @ modifer.  On PowerPC, it should also be possible to use
(some of) those modifiers with directional labels, like "1f at l".

This patch adds support for accepting symbol variants on directional
labels as well.


Modified:
    llvm/trunk/lib/MC/MCParser/AsmParser.cpp
    llvm/trunk/test/MC/PowerPC/ppc64-fixup-apply.s

Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=184437&r1=184436&r2=184437&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
+++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Thu Jun 20 11:24:17 2013
@@ -805,11 +805,21 @@ bool AsmParser::ParsePrimaryExpr(const M
     // Look for 'b' or 'f' following an Integer as a directional label
     if (Lexer.getKind() == AsmToken::Identifier) {
       StringRef IDVal = getTok().getString();
+      // Lookup the symbol variant if used.
+      std::pair<StringRef, StringRef> Split = IDVal.split('@');
+      MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
+      if (Split.first.size() != IDVal.size()) {
+        Variant = MCSymbolRefExpr::getVariantKindForName(Split.second);
+        if (Variant == MCSymbolRefExpr::VK_Invalid) {
+          Variant = MCSymbolRefExpr::VK_None;
+          return TokError("invalid variant '" + Split.second + "'");
+        }
+	IDVal = Split.first;
+      }
       if (IDVal == "f" || IDVal == "b"){
         MCSymbol *Sym = Ctx.GetDirectionalLocalSymbol(IntVal,
                                                       IDVal == "f" ? 1 : 0);
-        Res = MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_None,
-                                      getContext());
+        Res = MCSymbolRefExpr::Create(Sym, Variant, getContext());
         if (IDVal == "b" && Sym->isUndefined())
           return Error(Loc, "invalid reference to undefined symbol");
         EndLoc = Lexer.getTok().getEndLoc();

Modified: llvm/trunk/test/MC/PowerPC/ppc64-fixup-apply.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/PowerPC/ppc64-fixup-apply.s?rev=184437&r1=184436&r2=184437&view=diff
==============================================================================
--- llvm/trunk/test/MC/PowerPC/ppc64-fixup-apply.s (original)
+++ llvm/trunk/test/MC/PowerPC/ppc64-fixup-apply.s Thu Jun 20 11:24:17 2013
@@ -28,6 +28,11 @@ addis 1, 1, target5+0x8000 at ha
 
 .set target5, 0x10000001
 
+1:
+addi 1, 1, 2f-1b at l
+addis 1, 1, 1b-2f at ha
+2:
+
 .data
 
 .quad v1
@@ -49,7 +54,7 @@ addis 1, 1, target5+0x8000 at ha
 # CHECK-NEXT:    ]
 # CHECK-NEXT:    Address: 0x0
 # CHECK-NEXT:    Offset:
-# CHECK-NEXT:    Size: 32
+# CHECK-NEXT:    Size: 40
 # CHECK-NEXT:    Link: 0
 # CHECK-NEXT:    Info: 0
 # CHECK-NEXT:    AddressAlignment: 4
@@ -57,6 +62,7 @@ addis 1, 1, target5+0x8000 at ha
 # CHECK-NEXT:    SectionData (
 # CHECK-NEXT:      0000: 38211234 3C211234 38215678 3C211234
 # CHECK-NEXT:      0010: 38214444 3C211111 38218001 3C211001
+# CHECK-NEXT:      0020: 38210008 3C210000
 # CHECK-NEXT:    )
 # CHECK-NEXT:  }
 





More information about the llvm-commits mailing list