Implement .seh_stackalloc and .seh_pushframe parsing.
authorCharles Davis <cdavis@mines.edu>
Mon, 23 May 2011 16:43:09 +0000 (16:43 +0000)
committerCharles Davis <cdavis@mines.edu>
Mon, 23 May 2011 16:43:09 +0000 (16:43 +0000)
I haven't implemented any of the ones that take registers yet. The problem is
that for x86-64 the streamer methods expect a native x86 register number (note:
%r8-%r15 want 8-15 instead of 0-7; same for %xmm8-%xmm15). I haven't figured
out exactly how I want to do that yet.

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

lib/MC/MCParser/COFFAsmParser.cpp

index 0045950dcaaca82e2560cd2be4161dcc732b0c25..63729a62161e9185acc4089229601fce14ccd4e5 100644 (file)
@@ -256,8 +256,17 @@ bool COFFAsmParser::ParseSEHDirectiveSetFrame(StringRef, SMLoc L) {
   return Error(L, "not implemented yet");
 }
 
-bool COFFAsmParser::ParseSEHDirectiveAllocStack(StringRef, SMLoc L) {
-  return Error(L, "not implemented yet");
+bool COFFAsmParser::ParseSEHDirectiveAllocStack(StringRef, SMLoc) {
+  int64_t Size;
+  if (getParser().ParseAbsoluteExpression(Size))
+    return true;
+
+  if (getLexer().isNot(AsmToken::EndOfStatement))
+    return TokError("unexpected token in directive");
+
+  Lex();
+  getStreamer().EmitWin64EHAllocStack(Size);
+  return false;
 }
 
 bool COFFAsmParser::ParseSEHDirectiveSaveReg(StringRef, SMLoc L) {
@@ -268,8 +277,22 @@ bool COFFAsmParser::ParseSEHDirectiveSaveXMM(StringRef, SMLoc L) {
   return Error(L, "not implemented yet");
 }
 
-bool COFFAsmParser::ParseSEHDirectivePushFrame(StringRef, SMLoc L) {
-  return Error(L, "not implemented yet");
+bool COFFAsmParser::ParseSEHDirectivePushFrame(StringRef, SMLoc) {
+  bool Code;
+  StringRef CodeID;
+  SMLoc startLoc = getLexer().getLoc();
+  if (!getParser().ParseIdentifier(CodeID)) {
+    if (CodeID != "@code")
+      return Error(startLoc, "expected @code");
+    Code = true;
+  }
+
+  if (getLexer().isNot(AsmToken::EndOfStatement))
+    return TokError("unexpected token in directive");
+
+  Lex();
+  getStreamer().EmitWin64EHPushFrame(Code);
+  return false;
 }
 
 bool COFFAsmParser::ParseSEHDirectiveEndProlog(StringRef, SMLoc) {