Add tests for .seh_savereg and .seh_savexmm parsing. Once again, fix the
authorCharles Davis <cdavis@mines.edu>
Wed, 25 May 2011 04:51:25 +0000 (04:51 +0000)
committerCharles Davis <cdavis@mines.edu>
Wed, 25 May 2011 04:51:25 +0000 (04:51 +0000)
buggy methods that parse these directives.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132045 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/MCParser/COFFAsmParser.cpp
test/MC/AsmParser/directive_seh.s

index 540df377bbd2e5df33deda0fd694b9db95bc18c3..7fde4fec38bfd535d9c786143b256373e03f7229 100644 (file)
@@ -303,6 +303,10 @@ bool COFFAsmParser::ParseSEHDirectiveSaveReg(StringRef, SMLoc L) {
   int64_t Off;
   if (ParseSEHRegisterNumber(Reg))
     return true;
+  if (getLexer().isNot(AsmToken::Comma))
+    return TokError("expected comma");
+
+  Lex();
   SMLoc startLoc = getLexer().getLoc();
   if (getParser().ParseAbsoluteExpression(Off))
     return true;
@@ -326,6 +330,10 @@ bool COFFAsmParser::ParseSEHDirectiveSaveXMM(StringRef, SMLoc L) {
   int64_t Off;
   if (ParseSEHRegisterNumber(Reg))
     return true;
+  if (getLexer().isNot(AsmToken::Comma))
+    return TokError("expected comma");
+
+  Lex();
   SMLoc startLoc = getLexer().getLoc();
   if (getParser().ParseAbsoluteExpression(Off))
     return true;
@@ -387,14 +395,13 @@ bool COFFAsmParser::ParseAtUnwindOrAtExcept(bool &unwind, bool &except) {
 }
 
 bool COFFAsmParser::ParseSEHRegisterNumber(unsigned &RegNo) {
-  int64_t n;
   SMLoc startLoc = getLexer().getLoc();
-  if (getParser().ParseAbsoluteExpression(n)) {
+  if (getLexer().is(AsmToken::Percent)) {
     const TargetAsmInfo &asmInfo = getContext().getTargetAsmInfo();
     SMLoc endLoc;
     unsigned LLVMRegNo;
     if (getParser().getTargetParser().ParseRegister(LLVMRegNo,startLoc,endLoc))
-      return Error(startLoc, "expected register or number");
+      return true;
 
     // Check that this is a non-volatile register.
     const unsigned *NVRegs = asmInfo.getCalleeSavedRegs();
@@ -410,11 +417,15 @@ bool COFFAsmParser::ParseSEHRegisterNumber(unsigned &RegNo) {
       return Error(startLoc,"register can't be represented in SEH unwind info");
     RegNo = SEHRegNo;
   }
-  else
+  else {
+    int64_t n;
+    if (getParser().ParseAbsoluteExpression(n))
+      return true;
+    if (n > 15)
+      return Error(startLoc, "register number is too high");
     RegNo = n;
+  }
 
-  if (RegNo > 15)
-    return Error(startLoc, "register number is too high");
   return false;
 }
 
index e14be4367aeeb3b6d3fc5411d66ae685f3c56826..8b27542fb3286e21429a3e3dea827e4714eec6d5 100644 (file)
@@ -3,6 +3,8 @@
 # CHECK: .seh_proc func
 # CHECK: .seh_pushframe @code
 # CHECK: .seh_stackalloc 24
+# CHECK: .seh_savereg 6, 16
+# CHECK: .seh_savexmm 8, 0
 # CHECK: .seh_endprologue
 # CHECK: .seh_handler __C_specific_handler, @except
 # CHECK: .seh_endproc
@@ -15,6 +17,10 @@ func:
     .seh_pushframe @code
     subq $24, %rsp
     .seh_stackalloc 24
+    movq %rsi, 16(%rsp)
+    .seh_savereg %rsi, 16
+    movups %xmm8, (%rsp)
+    .seh_savexmm %xmm8, 0
     .seh_endprologue
     .seh_handler __C_specific_handler, @except
     addq $24, %rsp