summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharles Davis <cdavis@mines.edu>2011-05-25 04:51:25 +0000
committerCharles Davis <cdavis@mines.edu>2011-05-25 04:51:25 +0000
commit828b00c0e1126a27786982f63c941249ce3ab99c (patch)
treed878b4b07a863421c6dcc1183342926b1b95deaa
parenta51604e511d14514cdb2766100989d170ca4e5b5 (diff)
downloadbcm5719-llvm-828b00c0e1126a27786982f63c941249ce3ab99c.tar.gz
bcm5719-llvm-828b00c0e1126a27786982f63c941249ce3ab99c.zip
Add tests for .seh_savereg and .seh_savexmm parsing. Once again, fix the
buggy methods that parse these directives. llvm-svn: 132045
-rw-r--r--llvm/lib/MC/MCParser/COFFAsmParser.cpp23
-rw-r--r--llvm/test/MC/AsmParser/directive_seh.s6
2 files changed, 23 insertions, 6 deletions
diff --git a/llvm/lib/MC/MCParser/COFFAsmParser.cpp b/llvm/lib/MC/MCParser/COFFAsmParser.cpp
index 540df377bbd..7fde4fec38b 100644
--- a/llvm/lib/MC/MCParser/COFFAsmParser.cpp
+++ b/llvm/lib/MC/MCParser/COFFAsmParser.cpp
@@ -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;
}
diff --git a/llvm/test/MC/AsmParser/directive_seh.s b/llvm/test/MC/AsmParser/directive_seh.s
index e14be4367ae..8b27542fb32 100644
--- a/llvm/test/MC/AsmParser/directive_seh.s
+++ b/llvm/test/MC/AsmParser/directive_seh.s
@@ -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
OpenPOWER on IntegriCloud