OSDN Git Service

add a check for the mixing of vaarg and vanext with va_arg
authorAndrew Lenharth <andrewl@lenharth.org>
Sun, 19 Jun 2005 03:53:56 +0000 (03:53 +0000)
committerAndrew Lenharth <andrewl@lenharth.org>
Sun, 19 Jun 2005 03:53:56 +0000 (03:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22260 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AsmParser/llvmAsmParser.y

index f59475c..46dd988 100644 (file)
@@ -48,6 +48,7 @@ static Module *ParserResult;
 #define YYERROR_VERBOSE 1
 
 static bool ObsoleteVarArgs;
+static bool NewVarArgs;
 static BasicBlock* CurBB;
 
 
@@ -728,6 +729,7 @@ static PATypeHolder HandleUpRefs(const Type *ty) {
 
   llvmAsmlineno = 1;      // Reset the current line number...
   ObsoleteVarArgs = false;
+  NewVarArgs = false;
 
   CurModule.CurrentModule = M;
   yyparse();       // Parse the file, potentially throwing exception
@@ -735,6 +737,12 @@ static PATypeHolder HandleUpRefs(const Type *ty) {
   Module *Result = ParserResult;
   ParserResult = 0;
 
+  if (ObsoleteVarArgs && NewVarArgs)
+  {
+    std::cerr << "This file is corrupt in that it uses both new and old style varargs\n";
+    abort();
+  }
+
   if(ObsoleteVarArgs) {
     if(Function* F = Result->getNamedFunction("llvm.va_start")) {
       assert(F->arg_size() == 0 && "Obsolete va_start takes 0 argument!");
@@ -2041,6 +2049,7 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
     $$ = new SelectInst($2, $4, $6);
   }
   | VAARG ResolvedVal ',' Types {
+    NewVarArgs = true;
     $$ = new VAArgInst($2, *$4);
     delete $4;
   }