[llvm-commits] [llvm] r166433 - /llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp

Chad Rosier mcrosier at apple.com
Mon Oct 22 12:42:52 PDT 2012


Author: mcrosier
Date: Mon Oct 22 14:42:52 2012
New Revision: 166433

URL: http://llvm.org/viewvc/llvm-project?rev=166433&view=rev
Log:
[ms-inline asm] Add support for parsing the offset operator.  Callback for 
CodeGen in the front-end not implemented yet.
rdar://12470317

Modified:
    llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp

Modified: llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp?rev=166433&r1=166432&r2=166433&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp (original)
+++ llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp Mon Oct 22 14:42:52 2012
@@ -181,6 +181,7 @@
       unsigned IndexReg;
       unsigned Scale;
       unsigned Size;
+      bool OffsetOf;
       bool NeedSizeDir;
     } Mem;
   };
@@ -464,7 +465,7 @@
   /// Create an absolute memory operand.
   static X86Operand *CreateMem(const MCExpr *Disp, SMLoc StartLoc,
                                SMLoc EndLoc, unsigned Size = 0,
-                               bool NeedSizeDir = false) {
+                               bool OffsetOf = false, bool NeedSizeDir = false){
     X86Operand *Res = new X86Operand(Memory, StartLoc, EndLoc);
     Res->Mem.SegReg   = 0;
     Res->Mem.Disp     = Disp;
@@ -472,6 +473,7 @@
     Res->Mem.IndexReg = 0;
     Res->Mem.Scale    = 1;
     Res->Mem.Size     = Size;
+    Res->Mem.OffsetOf = OffsetOf;
     Res->Mem.NeedSizeDir = NeedSizeDir;
     return Res;
   }
@@ -480,7 +482,8 @@
   static X86Operand *CreateMem(unsigned SegReg, const MCExpr *Disp,
                                unsigned BaseReg, unsigned IndexReg,
                                unsigned Scale, SMLoc StartLoc, SMLoc EndLoc,
-                               unsigned Size = 0, bool NeedSizeDir = false) {
+                               unsigned Size = 0, bool OffsetOf = false,
+                               bool NeedSizeDir = false) {
     // We should never just have a displacement, that should be parsed as an
     // absolute memory operand.
     assert((SegReg || BaseReg || IndexReg) && "Invalid memory operand!");
@@ -495,6 +498,7 @@
     Res->Mem.IndexReg = IndexReg;
     Res->Mem.Scale    = Scale;
     Res->Mem.Size     = Size;
+    Res->Mem.OffsetOf = OffsetOf;
     Res->Mem.NeedSizeDir = NeedSizeDir;
     return Res;
   }
@@ -649,7 +653,7 @@
   return Size;
 }
 
-X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg,
+X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg, 
                                                    unsigned Size) {
   unsigned BaseReg = 0, IndexReg = 0, Scale = 1;
   SMLoc Start = Parser.getTok().getLoc(), End;
@@ -752,10 +756,22 @@
     Parser.Lex();
   }
 
-  if (getLexer().is(AsmToken::LBrac))
+  // Parse the 'offset' operator.  This operator is used to specify the
+  // location rather then the content of a variable.
+  bool OffsetOf = false;
+  if(isParsingInlineAsm() && (Tok.getString() == "offset" ||
+                              Tok.getString() == "OFFSET")) {
+    OffsetOf = true;
+    Parser.Lex(); // Eat offset.
+  }
+
+  if (getLexer().is(AsmToken::LBrac)) {
+    assert (!OffsetOf && "Unexpected offset operator!");
     return ParseIntelBracExpression(SegReg, Size);
+  }
 
   if (!ParseRegister(SegReg, Start, End)) {
+    assert (!OffsetOf && "Unexpected offset operator!");
     // Handel SegReg : [ ... ]
     if (getLexer().isNot(AsmToken::Colon))
       return ErrorOperand(Start, "Expected ':' token!");
@@ -780,7 +796,7 @@
       NeedSizeDir = Size > 0;
     }
   }
-  return X86Operand::CreateMem(Disp, Start, End, Size, NeedSizeDir);
+  return X86Operand::CreateMem(Disp, Start, End, Size, OffsetOf, NeedSizeDir);
 }
 
 X86Operand *X86AsmParser::ParseIntelOperand() {





More information about the llvm-commits mailing list