Update InvokeInst to work like CallInst
[oota-llvm.git] / lib / AsmParser / llvmAsmParser.y
index 92d06a75c5695bbc877bdd224931be4750c125e4..5570692864a9a29aaece7e7897ca1fe5d1cdd64c 100644 (file)
@@ -18,6 +18,7 @@
 #include "llvm/Instructions.h"
 #include "llvm/Module.h"
 #include "llvm/ValueSymbolTable.h"
+#include "llvm/AutoUpgrade.h"
 #include "llvm/Support/GetElementPtrTypeIterator.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/ADT/SmallVector.h"
@@ -131,6 +132,11 @@ static struct PerModuleInfo {
       return;
     }
 
+    // Look for intrinsic functions and CallInst that need to be upgraded
+    for (Module::iterator FI = CurrentModule->begin(),
+         FE = CurrentModule->end(); FI != FE; )
+      UpgradeCallsToIntrinsic(FI++); // must be post-increment, as we remove
+
     Values.clear();         // Clear out function local definitions
     Types.clear();
     CurrentModule = 0;
@@ -282,7 +288,7 @@ static const Type *getTypeVal(const ValID &D, bool DoNotImprovise = false) {
       return CurModule.Types[D.Num];
     break;
   case ValID::LocalName:                 // Is it a named definition?
-    if (const Type *N = CurModule.CurrentModule->getTypeByName(D.Name)) {
+    if (const Type *N = CurModule.CurrentModule->getTypeByName(D.getName())) {
       D.destroy();  // Free old strdup'd memory...
       return N;
     }
@@ -360,7 +366,7 @@ static Value *getExistingVal(const Type *Ty, const ValID &D) {
     if (!inFunctionScope()) 
       return 0;
     ValueSymbolTable &SymTab = CurFun.CurrentFunction->getValueSymbolTable();
-    Value *N = SymTab.lookup(D.Name);
+    Value *N = SymTab.lookup(D.getName());
     if (N == 0) 
       return 0;
     if (N->getType() != Ty)
@@ -371,7 +377,7 @@ static Value *getExistingVal(const Type *Ty, const ValID &D) {
   }
   case ValID::GlobalName: {                // Is it a named definition?
     ValueSymbolTable &SymTab = CurModule.CurrentModule->getValueSymbolTable();
-    Value *N = SymTab.lookup(D.Name);
+    Value *N = SymTab.lookup(D.getName());
     if (N == 0) 
       return 0;
     if (N->getType() != Ty)
@@ -480,8 +486,25 @@ static Value *getVal(const Type *Ty, const ValID &ID) {
   // or an id number that hasn't been read yet.  We may be referencing something
   // forward, so just create an entry to be resolved later and get to it...
   //
-  V = new Argument(Ty);
-
+  switch (ID.Type) {
+  case ValID::GlobalName:
+  case ValID::GlobalID: {
+   const PointerType *PTy = dyn_cast<PointerType>(Ty);
+   if (!PTy) {
+     GenerateError("Invalid type for reference to global" );
+     return 0;
+   }
+   const Type* ElTy = PTy->getElementType();
+   if (const FunctionType *FTy = dyn_cast<FunctionType>(ElTy))
+     V = new Function(FTy, GlobalValue::ExternalLinkage);
+   else
+     V = new GlobalVariable(ElTy, false, GlobalValue::ExternalLinkage);
+   break;
+  }
+  default:
+   V = new Argument(Ty);
+  }
+  
   // Remember where this forward reference came from.  FIXME, shouldn't we try
   // to recycle these things??
   CurModule.PlaceHolderInfo.insert(std::make_pair(V, std::make_pair(ID,
@@ -533,7 +556,7 @@ static BasicBlock *defineBBVal(const ValID &ID) {
   
   // We haven't seen this BB before and its first mention is a definition. 
   // Just create it and return it.
-  std::string Name (ID.Type == ValID::LocalName ? ID.Name : "");
+  std::string Name (ID.Type == ValID::LocalName ? ID.getName() : "");
   BB = new BasicBlock(Name, CurFun.CurrentFunction);
   if (ID.Type == ValID::LocalID) {
     assert(ID.Num == CurFun.NextValNum && "Invalid new block number");
@@ -555,7 +578,7 @@ static BasicBlock *getBBVal(const ValID &ID) {
   if (BBI != CurFun.BBForwardRefs.end()) {
     BB = BBI->second;
   } if (ID.Type == ValID::LocalName) {
-    std::string Name = ID.Name;
+    std::string Name = ID.getName();
     Value *N = CurFun.CurrentFunction->getValueSymbolTable().lookup(Name);
     if (N)
       if (N->getType()->getTypeID() == Type::LabelTyID)
@@ -586,7 +609,7 @@ static BasicBlock *getBBVal(const ValID &ID) {
   // Otherwise, this block has not been seen before, create it.
   std::string Name;
   if (ID.Type == ValID::LocalName)
-    Name = ID.Name;
+    Name = ID.getName();
   BB = new BasicBlock(Name, CurFun.CurrentFunction);
 
   // Insert it in the forward refs map.
@@ -658,10 +681,12 @@ ResolveDefinitions(ValueList &LateResolvers, ValueList *FutureLateResolvers) {
 // name is not null) things referencing Name can be resolved.  Otherwise, things
 // refering to the number can be resolved.  Do this now.
 //
-static void ResolveTypeTo(char *Name, const Type *ToTy) {
+static void ResolveTypeTo(std::string *Name, const Type *ToTy) {
   ValID D;
-  if (Name) D = ValID::createLocalName(Name);
-  else      D = ValID::createLocalID(CurModule.Types.size());
+  if (Name)
+    D = ValID::createLocalName(*Name);
+  else      
+    D = ValID::createLocalID(CurModule.Types.size());
 
   std::map<ValID, PATypeHolder>::iterator I =
     CurModule.LateResolveTypes.find(D);
@@ -675,10 +700,10 @@ static void ResolveTypeTo(char *Name, const Type *ToTy) {
 // null potentially, in which case this is a noop.  The string passed in is
 // assumed to be a malloc'd string buffer, and is free'd by this function.
 //
-static void setValueName(Value *V, char *NameStr) {
+static void setValueName(Value *V, std::string *NameStr) {
   if (!NameStr) return;
-  std::string Name(NameStr);      // Copy string
-  free(NameStr);                  // Free old string
+  std::string Name(*NameStr);      // Copy string
+  delete NameStr;                  // Free old string
 
   if (V->getType() == Type::VoidTy) {
     GenerateError("Can't assign name '" + Name+"' to value with void type");
@@ -700,11 +725,11 @@ static void setValueName(Value *V, char *NameStr) {
 /// ParseGlobalVariable - Handle parsing of a global.  If Initializer is null,
 /// this is a declaration, otherwise it is a definition.
 static GlobalVariable *
-ParseGlobalVariable(char *NameStr,
+ParseGlobalVariable(std::string *NameStr,
                     GlobalValue::LinkageTypes Linkage,
                     GlobalValue::VisibilityTypes Visibility,
                     bool isConstantGlobal, const Type *Ty,
-                    Constant *Initializer) {
+                    Constant *Initializer, bool IsThreadLocal) {
   if (isa<FunctionType>(Ty)) {
     GenerateError("Cannot declare global vars of function type");
     return 0;
@@ -714,15 +739,15 @@ ParseGlobalVariable(char *NameStr,
 
   std::string Name;
   if (NameStr) {
-    Name = NameStr;      // Copy string
-    free(NameStr);       // Free old string
+    Name = *NameStr;      // Copy string
+    delete NameStr;       // Free old string
   }
 
   // See if this global value was forward referenced.  If so, recycle the
   // object.
   ValID ID;
   if (!Name.empty()) {
-    ID = ValID::createGlobalName((char*)Name.c_str());
+    ID = ValID::createGlobalName(Name);
   } else {
     ID = ValID::createGlobalID(CurModule.Values.size());
   }
@@ -737,6 +762,7 @@ ParseGlobalVariable(char *NameStr,
     GV->setLinkage(Linkage);
     GV->setVisibility(Visibility);
     GV->setConstant(isConstantGlobal);
+    GV->setThreadLocal(IsThreadLocal);
     InsertValue(GV, CurModule.Values);
     return GV;
   }
@@ -761,7 +787,7 @@ ParseGlobalVariable(char *NameStr,
   // Otherwise there is no existing GV to use, create one now.
   GlobalVariable *GV =
     new GlobalVariable(Ty, isConstantGlobal, Linkage, Initializer, Name,
-                       CurModule.CurrentModule);
+                       CurModule.CurrentModule, IsThreadLocal);
   GV->setVisibility(Visibility);
   InsertValue(GV, CurModule.Values);
   return GV;
@@ -774,12 +800,12 @@ ParseGlobalVariable(char *NameStr,
 // This function returns true if the type has already been defined, but is
 // allowed to be redefined in the specified context.  If the name is a new name
 // for the type plane, it is inserted and false is returned.
-static bool setTypeName(const Type *T, char *NameStr) {
+static bool setTypeName(const Type *T, std::string *NameStr) {
   assert(!inFunctionScope() && "Can't give types function-local names!");
   if (NameStr == 0) return false;
  
-  std::string Name(NameStr);      // Copy string
-  free(NameStr);                  // Free old string
+  std::string Name(*NameStr);      // Copy string
+  delete NameStr;                  // Free old string
 
   // We don't allow assigning names to void type
   if (T == Type::VoidTy) {
@@ -969,8 +995,8 @@ Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) {
   double                            FPVal;
   bool                              BoolVal;
 
-  char                             *StrVal;   // This memory is strdup'd!
-  llvm::ValID                       ValIDVal; // strdup'd memory maybe!
+  std::string                      *StrVal;   // This memory must be deleted
+  llvm::ValID                       ValIDVal;
 
   llvm::Instruction::BinaryOps      BinaryOpVal;
   llvm::Instruction::TermOps        TermOpVal;
@@ -986,7 +1012,7 @@ Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) {
 %type <BasicBlockVal> BasicBlock InstructionList
 %type <TermInstVal>   BBTerminatorInst
 %type <InstVal>       Inst InstVal MemoryInst
-%type <ConstVal>      ConstVal ConstExpr
+%type <ConstVal>      ConstVal ConstExpr AliaseeRef
 %type <ConstVector>   ConstVector
 %type <ArgList>       ArgList ArgListH
 %type <PHIList>       PHIList
@@ -997,11 +1023,13 @@ Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) {
 %type <TypeWithAttrs> ArgType
 %type <JumpTable>     JumpTable
 %type <BoolVal>       GlobalType                  // GLOBAL or CONSTANT?
+%type <BoolVal>       ThreadLocal                 // 'thread_local' or not
 %type <BoolVal>       OptVolatile                 // 'volatile' or not
 %type <BoolVal>       OptTailCall                 // TAIL CALL or plain CALL.
 %type <BoolVal>       OptSideEffect               // 'sideeffect' or not.
 %type <Linkage>       GVInternalLinkage GVExternalLinkage
 %type <Linkage>       FunctionDefineLinkage FunctionDeclareLinkage
+%type <Linkage>       AliasLinkage
 %type <Visibility>    GVVisibilityStyle
 
 // ValueRef - Unresolved reference to a definition or BB
@@ -1028,17 +1056,20 @@ Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) {
 %type  <TypeVal> Types ResultTypes
 %type  <PrimType> IntType FPType PrimType           // Classifications
 %token <PrimType> VOID INTTYPE 
-%token <PrimType> FLOAT DOUBLE LABEL
+%token <PrimType> FLOAT DOUBLE X86_FP80 FP128 PPC_FP128 LABEL
 %token TYPE
 
-%token<StrVal> LOCALVAR GLOBALVAR LABELSTR STRINGCONSTANT ATSTRINGCONSTANT
+
+%token<StrVal> LOCALVAR GLOBALVAR LABELSTR 
+%token<StrVal> STRINGCONSTANT ATSTRINGCONSTANT PCTSTRINGCONSTANT
 %type <StrVal> LocalName OptLocalName OptLocalAssign
-%type <StrVal> GlobalName OptGlobalAssign
-%type <UIntVal> OptAlign OptCAlign
+%type <StrVal> GlobalName OptGlobalAssign GlobalAssign
 %type <StrVal> OptSection SectionString
 
+%type <UIntVal> OptAlign OptCAlign
+
 %token ZEROINITIALIZER TRUETOK FALSETOK BEGINTOK ENDTOK
-%token DECLARE DEFINE GLOBAL CONSTANT SECTION VOLATILE
+%token DECLARE DEFINE GLOBAL CONSTANT SECTION ALIAS VOLATILE THREAD_LOCAL
 %token TO DOTDOTDOT NULL_TOK UNDEF INTERNAL LINKONCE WEAK APPENDING
 %token DLLIMPORT DLLEXPORT EXTERN_WEAK
 %token OPAQUE EXTERNAL TARGET TRIPLE ALIGN
@@ -1076,10 +1107,10 @@ Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) {
 %token <OtherOpVal> EXTRACTELEMENT INSERTELEMENT SHUFFLEVECTOR
 
 // Function Attributes
-%token NORETURN INREG SRET NOUNWIND
+%token SIGNEXT ZEROEXT NORETURN INREG SRET NOUNWIND NOALIAS BYVAL NEST
 
 // Visibility Styles
-%token DEFAULT HIDDEN
+%token DEFAULT HIDDEN PROTECTED
 
 %start Module
 %%
@@ -1116,9 +1147,9 @@ FPredicates
 // These are some types that allow classification if we only want a particular 
 // thing... for example, only a signed, unsigned, or integral type.
 IntType :  INTTYPE;
-FPType   : FLOAT | DOUBLE;
+FPType   : FLOAT | DOUBLE | PPC_FP128 | FP128 | X86_FP80;
 
-LocalName : LOCALVAR | STRINGCONSTANT;
+LocalName : LOCALVAR | STRINGCONSTANT | PCTSTRINGCONSTANT ;
 OptLocalName : LocalName | /*empty*/ { $$ = 0; };
 
 /// OptLocalAssign - Value producing statements have an optional assignment
@@ -1132,17 +1163,19 @@ OptLocalAssign : LocalName '=' {
     CHECK_FOR_ERROR
   };
 
-GlobalName : GLOBALVAR | ATSTRINGCONSTANT;
+GlobalName : GLOBALVAR | ATSTRINGCONSTANT ;
 
-OptGlobalAssign : GlobalName '=' {
-    $$ = $1;
-    CHECK_FOR_ERROR
-  }
+OptGlobalAssign : GlobalAssign
   | /*empty*/ {
     $$ = 0;
     CHECK_FOR_ERROR
   };
 
+GlobalAssign : GlobalName '=' {
+    $$ = $1;
+    CHECK_FOR_ERROR
+  };
+
 GVInternalLinkage 
   : INTERNAL    { $$ = GlobalValue::InternalLinkage; } 
   | WEAK        { $$ = GlobalValue::WeakLinkage; } 
@@ -1158,8 +1191,10 @@ GVExternalLinkage
   ;
 
 GVVisibilityStyle
-  : /*empty*/ { $$ = GlobalValue::DefaultVisibility; }
-  | HIDDEN    { $$ = GlobalValue::HiddenVisibility;  }
+  : /*empty*/ { $$ = GlobalValue::DefaultVisibility;   }
+  | DEFAULT   { $$ = GlobalValue::DefaultVisibility;   }
+  | HIDDEN    { $$ = GlobalValue::HiddenVisibility;    }
+  | PROTECTED { $$ = GlobalValue::ProtectedVisibility; }
   ;
 
 FunctionDeclareLinkage
@@ -1168,7 +1203,7 @@ FunctionDeclareLinkage
   | EXTERN_WEAK { $$ = GlobalValue::ExternalWeakLinkage; }
   ;
   
-FunctionDefineLinkage 
+FunctionDefineLinkage
   : /*empty*/   { $$ = GlobalValue::ExternalLinkage; }
   | INTERNAL    { $$ = GlobalValue::InternalLinkage; }
   | LINKONCE    { $$ = GlobalValue::LinkOnceLinkage; }
@@ -1176,6 +1211,12 @@ FunctionDefineLinkage
   | DLLEXPORT   { $$ = GlobalValue::DLLExportLinkage; } 
   ; 
 
+AliasLinkage
+  : /*empty*/   { $$ = GlobalValue::ExternalLinkage; }
+  | WEAK        { $$ = GlobalValue::WeakLinkage; }
+  | INTERNAL    { $$ = GlobalValue::InternalLinkage; }
+  ;
+
 OptCallingConv : /*empty*/          { $$ = CallingConv::C; } |
                  CCC_TOK            { $$ = CallingConv::C; } |
                  FASTCC_TOK         { $$ = CallingConv::Fast; } |
@@ -1189,24 +1230,30 @@ OptCallingConv : /*empty*/          { $$ = CallingConv::C; } |
                   CHECK_FOR_ERROR
                  };
 
-ParamAttr     : ZEXT  { $$ = ZExtAttribute;      }
-              | SEXT  { $$ = SExtAttribute;      }
-              | INREG { $$ = InRegAttribute;     }
-              | SRET  { $$ = StructRetAttribute; }
+ParamAttr     : ZEROEXT { $$ = ParamAttr::ZExt;      }
+              | ZEXT    { $$ = ParamAttr::ZExt;      }
+              | SIGNEXT { $$ = ParamAttr::SExt;      }
+              | SEXT    { $$ = ParamAttr::SExt;      }
+              | INREG   { $$ = ParamAttr::InReg;     }
+              | SRET    { $$ = ParamAttr::StructRet; }
+              | NOALIAS { $$ = ParamAttr::NoAlias;   }
+              | BYVAL   { $$ = ParamAttr::ByVal;     }
+              | NEST    { $$ = ParamAttr::Nest;      }
               ;
 
-OptParamAttrs : /* empty */  { $$ = NoAttributeSet; }
+OptParamAttrs : /* empty */  { $$ = ParamAttr::None; }
               | OptParamAttrs ParamAttr {
                 $$ = $1 | $2;
               }
               ;
 
-FuncAttr      : NORETURN { $$ = NoReturnAttribute; }
-              | NOUNWIND { $$ = NoUnwindAttribute; }
-              | ParamAttr
+FuncAttr      : NORETURN { $$ = ParamAttr::NoReturn; }
+              | NOUNWIND { $$ = ParamAttr::NoUnwind; }
+              | ZEROEXT  { $$ = ParamAttr::ZExt;     }
+              | SIGNEXT  { $$ = ParamAttr::SExt;     }
               ;
 
-OptFuncAttrs  : /* empty */ { $$ = NoAttributeSet; }
+OptFuncAttrs  : /* empty */ { $$ = ParamAttr::None; }
               | OptFuncAttrs FuncAttr {
                 $$ = $1 | $2;
               }
@@ -1231,8 +1278,8 @@ OptCAlign : /*empty*/            { $$ = 0; } |
 
 
 SectionString : SECTION STRINGCONSTANT {
-  for (unsigned i = 0, e = strlen($2); i != e; ++i)
-    if ($2[i] == '"' || $2[i] == '\\')
+  for (unsigned i = 0, e = $2->length(); i != e; ++i)
+    if ((*$2)[i] == '"' || (*$2)[i] == '\\')
       GEN_ERROR("Invalid character in section name");
   $$ = $2;
   CHECK_FOR_ERROR
@@ -1247,8 +1294,8 @@ OptSection : /*empty*/ { $$ = 0; } |
 GlobalVarAttributes : /* empty */ {} |
                      ',' GlobalVarAttribute GlobalVarAttributes {};
 GlobalVarAttribute : SectionString {
-    CurGV->setSection($1);
-    free($1);
+    CurGV->setSection(*$1);
+    delete $1;
     CHECK_FOR_ERROR
   } 
   | ALIGN EUINT64VAL {
@@ -1264,7 +1311,7 @@ GlobalVarAttribute : SectionString {
 
 // Derived types are added later...
 //
-PrimType : INTTYPE | FLOAT | DOUBLE | LABEL ;
+PrimType : INTTYPE | FLOAT | DOUBLE | PPC_FP128 | FP128 | X86_FP80 | LABEL ;
 
 Types 
   : OPAQUE {
@@ -1297,24 +1344,28 @@ Types
   }
   | Types '(' ArgTypeListI ')' OptFuncAttrs {
     std::vector<const Type*> Params;
-    ParamAttrsList Attrs;
-    if ($5 != NoAttributeSet)
-      Attrs.addAttributes(0, $5);
+    ParamAttrsVector Attrs;
+    if ($5 != ParamAttr::None) {
+      ParamAttrsWithIndex X; X.index = 0; X.attrs = $5;
+      Attrs.push_back(X);
+    }
     unsigned index = 1;
     TypeWithAttrsList::iterator I = $3->begin(), E = $3->end();
     for (; I != E; ++I, ++index) {
       const Type *Ty = I->Ty->get();
       Params.push_back(Ty);
       if (Ty != Type::VoidTy)
-        if (I->Attrs != NoAttributeSet)
-          Attrs.addAttributes(index, I->Attrs);
+        if (I->Attrs != ParamAttr::None) {
+          ParamAttrsWithIndex X; X.index = index; X.attrs = I->Attrs;
+          Attrs.push_back(X);
+        }
     }
     bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
     if (isVarArg) Params.pop_back();
 
     ParamAttrsList *ActualAttrs = 0;
     if (!Attrs.empty())
-      ActualAttrs = new ParamAttrsList(Attrs);
+      ActualAttrs = ParamAttrsList::get(Attrs);
     FunctionType *FT = FunctionType::get(*$1, Params, isVarArg, ActualAttrs);
     delete $3;   // Delete the argument list
     delete $1;   // Delete the return type handle
@@ -1323,24 +1374,28 @@ Types
   }
   | VOID '(' ArgTypeListI ')' OptFuncAttrs {
     std::vector<const Type*> Params;
-    ParamAttrsList Attrs;
-    if ($5 != NoAttributeSet)
-      Attrs.addAttributes(0, $5);
+    ParamAttrsVector Attrs;
+    if ($5 != ParamAttr::None) {
+      ParamAttrsWithIndex X; X.index = 0; X.attrs = $5;
+      Attrs.push_back(X);
+    }
     TypeWithAttrsList::iterator I = $3->begin(), E = $3->end();
     unsigned index = 1;
     for ( ; I != E; ++I, ++index) {
       const Type* Ty = I->Ty->get();
       Params.push_back(Ty);
       if (Ty != Type::VoidTy)
-        if (I->Attrs != NoAttributeSet)
-          Attrs.addAttributes(index, I->Attrs);
+        if (I->Attrs != ParamAttr::None) {
+          ParamAttrsWithIndex X; X.index = index; X.attrs = I->Attrs;
+          Attrs.push_back(X);
+        }
     }
     bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
     if (isVarArg) Params.pop_back();
 
     ParamAttrsList *ActualAttrs = 0;
     if (!Attrs.empty())
-      ActualAttrs = new ParamAttrsList(Attrs);
+      ActualAttrs = ParamAttrsList::get(Attrs);
 
     FunctionType *FT = FunctionType::get($1, Params, isVarArg, ActualAttrs);
     delete $3;      // Delete the argument list
@@ -1430,14 +1485,14 @@ ArgTypeListI
   : ArgTypeList
   | ArgTypeList ',' DOTDOTDOT {
     $$=$1;
-    TypeWithAttrs TWA; TWA.Attrs = NoAttributeSet;
+    TypeWithAttrs TWA; TWA.Attrs = ParamAttr::None;
     TWA.Ty = new PATypeHolder(Type::VoidTy);
     $$->push_back(TWA);
     CHECK_FOR_ERROR
   }
   | DOTDOTDOT {
     $$ = new TypeWithAttrsList;
-    TypeWithAttrs TWA; TWA.Attrs = NoAttributeSet;
+    TypeWithAttrs TWA; TWA.Attrs = ParamAttr::None;
     TWA.Ty = new PATypeHolder(Type::VoidTy);
     $$->push_back(TWA);
     CHECK_FOR_ERROR
@@ -1522,21 +1577,19 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
 
     int NumElements = ATy->getNumElements();
     const Type *ETy = ATy->getElementType();
-    char *EndStr = UnEscapeLexed($3, true);
-    if (NumElements != -1 && NumElements != (EndStr-$3))
+    if (NumElements != -1 && NumElements != int($3->length()))
       GEN_ERROR("Can't build string constant of size " + 
-                     itostr((int)(EndStr-$3)) +
+                     itostr((int)($3->length())) +
                      " when array has size " + itostr(NumElements) + "");
     std::vector<Constant*> Vals;
     if (ETy == Type::Int8Ty) {
-      for (unsigned char *C = (unsigned char *)$3; 
-        C != (unsigned char*)EndStr; ++C)
-      Vals.push_back(ConstantInt::get(ETy, *C));
+      for (unsigned i = 0; i < $3->length(); ++i)
+        Vals.push_back(ConstantInt::get(ETy, (*$3)[i]));
     } else {
-      free($3);
+      delete $3;
       GEN_ERROR("Cannot build string arrays of non byte sized elements");
     }
-    free($3);
+    delete $3;
     $$ = ConstantArray::get(ATy, Vals);
     delete $1;
     CHECK_FOR_ERROR
@@ -1588,7 +1641,8 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
 
     // Check to ensure that Type is not packed
     if (STy->isPacked())
-      GEN_ERROR("Unpacked Initializer to vector type '" + STy->getDescription() + "'");
+      GEN_ERROR("Unpacked Initializer to vector type '" +
+                STy->getDescription() + "'");
 
     $$ = ConstantStruct::get(STy, *$3);
     delete $1; delete $3;
@@ -1607,7 +1661,8 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
 
     // Check to ensure that Type is not packed
     if (STy->isPacked())
-      GEN_ERROR("Unpacked Initializer to vector type '" + STy->getDescription() + "'");
+      GEN_ERROR("Unpacked Initializer to vector type '" +
+                STy->getDescription() + "'");
 
     $$ = ConstantStruct::get(STy, std::vector<Constant*>());
     delete $1;
@@ -1718,7 +1773,7 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
       } else {
         std::string Name;
         if ($2.Type == ValID::GlobalName)
-          Name = $2.Name;
+          Name = $2.getName();
         else if ($2.Type != ValID::GlobalID)
           GEN_ERROR("Invalid reference to global");
 
@@ -1726,11 +1781,11 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr
         GlobalValue *GV;
         if (const FunctionType *FTy = 
                  dyn_cast<FunctionType>(PT->getElementType())) {
-          GV = new Function(FTy, GlobalValue::ExternalLinkage, Name,
+          GV = new Function(FTy, GlobalValue::ExternalWeakLinkage, Name,
                             CurModule.CurrentModule);
         } else {
           GV = new GlobalVariable(PT->getElementType(), false,
-                                  GlobalValue::ExternalLinkage, 0,
+                                  GlobalValue::ExternalWeakLinkage, 0,
                                   Name, CurModule.CurrentModule);
         }
 
@@ -1918,6 +1973,34 @@ ConstVector : ConstVector ',' ConstVal {
 // GlobalType - Match either GLOBAL or CONSTANT for global declarations...
 GlobalType : GLOBAL { $$ = false; } | CONSTANT { $$ = true; };
 
+// ThreadLocal 
+ThreadLocal : THREAD_LOCAL { $$ = true; } | { $$ = false; };
+
+// AliaseeRef - Match either GlobalValue or bitcast to GlobalValue.
+AliaseeRef : ResultTypes SymbolicValueRef {
+    const Type* VTy = $1->get();
+    Value *V = getVal(VTy, $2);
+    CHECK_FOR_ERROR
+    GlobalValue* Aliasee = dyn_cast<GlobalValue>(V);
+    if (!Aliasee)
+      GEN_ERROR("Aliases can be created only to global values");
+
+    $$ = Aliasee;
+    CHECK_FOR_ERROR
+    delete $1;
+   }
+   | BITCAST '(' AliaseeRef TO Types ')' {
+    Constant *Val = $3;
+    const Type *DestTy = $5->get();
+    if (!CastInst::castIsValid($1, $3, DestTy))
+      GEN_ERROR("invalid cast opcode for cast from '" +
+                Val->getType()->getDescription() + "' to '" +
+                DestTy->getDescription() + "'");
+    
+    $$ = ConstantExpr::getCast($1, $3, DestTy);
+    CHECK_FOR_ERROR
+    delete $5;
+   };
 
 //===----------------------------------------------------------------------===//
 //                             Rules to match Modules
@@ -1990,34 +2073,55 @@ Definition
     }
     CHECK_FOR_ERROR
   }
-  | OptGlobalAssign GVVisibilityStyle GlobalType ConstVal { 
+  | OptGlobalAssign GVVisibilityStyle ThreadLocal GlobalType ConstVal { 
     /* "Externally Visible" Linkage */
-    if ($4 == 0) 
+    if ($5 == 0) 
       GEN_ERROR("Global value initializer is not a constant");
     CurGV = ParseGlobalVariable($1, GlobalValue::ExternalLinkage,
-                                $2, $3, $4->getType(), $4);
+                                $2, $4, $5->getType(), $5, $3);
     CHECK_FOR_ERROR
   } GlobalVarAttributes {
     CurGV = 0;
   }
-  | OptGlobalAssign GVInternalLinkage GVVisibilityStyle GlobalType ConstVal {
-    if ($5 == 0) 
+  | OptGlobalAssign GVInternalLinkage GVVisibilityStyle ThreadLocal GlobalType
+    ConstVal {
+    if ($6 == 0) 
       GEN_ERROR("Global value initializer is not a constant");
-    CurGV = ParseGlobalVariable($1, $2, $3, $4, $5->getType(), $5);
+    CurGV = ParseGlobalVariable($1, $2, $3, $5, $6->getType(), $6, $4);
     CHECK_FOR_ERROR
   } GlobalVarAttributes {
     CurGV = 0;
   }
-  | OptGlobalAssign GVExternalLinkage GVVisibilityStyle GlobalType Types {
+  | OptGlobalAssign GVExternalLinkage GVVisibilityStyle ThreadLocal GlobalType
+    Types {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*$5)->getDescription());
-    CurGV = ParseGlobalVariable($1, $2, $3, $4, *$5, 0);
+      GEN_ERROR("Invalid upreference in type: " + (*$6)->getDescription());
+    CurGV = ParseGlobalVariable($1, $2, $3, $5, *$6, 0, $4);
     CHECK_FOR_ERROR
-    delete $5;
+    delete $6;
   } GlobalVarAttributes {
     CurGV = 0;
     CHECK_FOR_ERROR
   }
+  | OptGlobalAssign GVVisibilityStyle ALIAS AliasLinkage AliaseeRef {
+    std::string Name;
+    if ($1) {
+      Name = *$1;
+      delete $1;
+    }
+    if (Name.empty())
+      GEN_ERROR("Alias name cannot be empty");
+    
+    Constant* Aliasee = $5;
+    if (Aliasee == 0)
+      GEN_ERROR(std::string("Invalid aliasee for alias: ") + Name);
+
+    GlobalAlias* GA = new GlobalAlias(Aliasee->getType(), $4, Name, Aliasee,
+                                      CurModule.CurrentModule);
+    GA->setVisibility($2);
+    InsertValue(GA, CurModule.Values);
+    CHECK_FOR_ERROR
+  }
   | TARGET TargetDefinition { 
     CHECK_FOR_ERROR
   }
@@ -2029,36 +2133,33 @@ Definition
 
 AsmBlock : STRINGCONSTANT {
   const std::string &AsmSoFar = CurModule.CurrentModule->getModuleInlineAsm();
-  char *EndStr = UnEscapeLexed($1, true);
-  std::string NewAsm($1, EndStr);
-  free($1);
-
   if (AsmSoFar.empty())
-    CurModule.CurrentModule->setModuleInlineAsm(NewAsm);
+    CurModule.CurrentModule->setModuleInlineAsm(*$1);
   else
-    CurModule.CurrentModule->setModuleInlineAsm(AsmSoFar+"\n"+NewAsm);
+    CurModule.CurrentModule->setModuleInlineAsm(AsmSoFar+"\n"+*$1);
+  delete $1;
   CHECK_FOR_ERROR
 };
 
 TargetDefinition : TRIPLE '=' STRINGCONSTANT {
-    CurModule.CurrentModule->setTargetTriple($3);
-    free($3);
+    CurModule.CurrentModule->setTargetTriple(*$3);
+    delete $3;
   }
   | DATALAYOUT '=' STRINGCONSTANT {
-    CurModule.CurrentModule->setDataLayout($3);
-    free($3);
+    CurModule.CurrentModule->setDataLayout(*$3);
+    delete $3;
   };
 
 LibrariesDefinition : '[' LibList ']';
 
 LibList : LibList ',' STRINGCONSTANT {
-          CurModule.CurrentModule->addLibrary($3);
-          free($3);
+          CurModule.CurrentModule->addLibrary(*$3);
+          delete $3;
           CHECK_FOR_ERROR
         }
         | STRINGCONSTANT {
-          CurModule.CurrentModule->addLibrary($1);
-          free($1);
+          CurModule.CurrentModule->addLibrary(*$1);
+          delete $1;
           CHECK_FOR_ERROR
         }
         | /* empty: end of list */ {
@@ -2100,7 +2201,7 @@ ArgList : ArgListH {
     struct ArgListEntry E;
     E.Ty = new PATypeHolder(Type::VoidTy);
     E.Name = 0;
-    E.Attrs = NoAttributeSet;
+    E.Attrs = ParamAttr::None;
     $$->push_back(E);
     CHECK_FOR_ERROR
   }
@@ -2109,7 +2210,7 @@ ArgList : ArgListH {
     struct ArgListEntry E;
     E.Ty = new PATypeHolder(Type::VoidTy);
     E.Name = 0;
-    E.Attrs = NoAttributeSet;
+    E.Attrs = ParamAttr::None;
     $$->push_back(E);
     CHECK_FOR_ERROR
   }
@@ -2120,9 +2221,8 @@ ArgList : ArgListH {
 
 FunctionHeaderH : OptCallingConv ResultTypes GlobalName '(' ArgList ')' 
                   OptFuncAttrs OptSection OptAlign {
-  UnEscapeLexed($3);
-  std::string FunctionName($3);
-  free($3);  // Free strdup'd memory!
+  std::string FunctionName(*$3);
+  delete $3;  // Free strdup'd memory!
   
   // Check the function result for abstractness if this is a define. We should
   // have no abstract types at this point
@@ -2130,9 +2230,11 @@ FunctionHeaderH : OptCallingConv ResultTypes GlobalName '(' ArgList ')'
     GEN_ERROR("Reference to abstract result: "+ $2->get()->getDescription());
 
   std::vector<const Type*> ParamTypeList;
-  ParamAttrsList ParamAttrs;
-  if ($7 != NoAttributeSet)
-    ParamAttrs.addAttributes(0, $7);
+  ParamAttrsVector Attrs;
+  if ($7 != ParamAttr::None) {
+    ParamAttrsWithIndex PAWI; PAWI.index = 0; PAWI.attrs = $7;
+    Attrs.push_back(PAWI);
+  }
   if ($5) {   // If there are arguments...
     unsigned index = 1;
     for (ArgListType::iterator I = $5->begin(); I != $5->end(); ++I, ++index) {
@@ -2141,20 +2243,21 @@ FunctionHeaderH : OptCallingConv ResultTypes GlobalName '(' ArgList ')'
         GEN_ERROR("Reference to abstract argument: " + Ty->getDescription());
       ParamTypeList.push_back(Ty);
       if (Ty != Type::VoidTy)
-        if (I->Attrs != NoAttributeSet)
-          ParamAttrs.addAttributes(index, I->Attrs);
+        if (I->Attrs != ParamAttr::None) {
+          ParamAttrsWithIndex PAWI; PAWI.index = index; PAWI.attrs = I->Attrs;
+          Attrs.push_back(PAWI);
+        }
     }
   }
 
   bool isVarArg = ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy;
   if (isVarArg) ParamTypeList.pop_back();
 
-  ParamAttrsList *ActualAttrs = 0;
-  if (!ParamAttrs.empty())
-    ActualAttrs = new ParamAttrsList(ParamAttrs);
+  ParamAttrsList *PAL = 0;
+  if (!Attrs.empty())
+    PAL = ParamAttrsList::get(Attrs);
 
-  FunctionType *FT = FunctionType::get(*$2, ParamTypeList, isVarArg, 
-                                       ActualAttrs);
+  FunctionType *FT = FunctionType::get(*$2, ParamTypeList, isVarArg, PAL);
   const PointerType *PFT = PointerType::get(FT);
   delete $2;
 
@@ -2175,7 +2278,7 @@ FunctionHeaderH : OptCallingConv ResultTypes GlobalName '(' ArgList ')'
     CurModule.CurrentModule->getFunctionList().push_back(Fn);
   } else if (!FunctionName.empty() &&     // Merge with an earlier prototype?
              (Fn = CurModule.CurrentModule->getFunction(FunctionName))) {
-    if (Fn->getFunctionType() != FT ) {
+    if (Fn->getFunctionType() != FT) {
       // The existing function doesn't have the same type. This is an overload
       // error.
       GEN_ERROR("Overload of function '" + FunctionName + "' not permitted.");
@@ -2190,7 +2293,7 @@ FunctionHeaderH : OptCallingConv ResultTypes GlobalName '(' ArgList ')'
         AI->setName("");
     }
   } else  {  // Not already defined?
-    Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName,
+    Fn = new Function(FT, GlobalValue::ExternalWeakLinkage, FunctionName,
                       CurModule.CurrentModule);
 
     InsertValue(Fn, CurModule.Values);
@@ -2208,8 +2311,8 @@ FunctionHeaderH : OptCallingConv ResultTypes GlobalName '(' ArgList ')'
   Fn->setCallingConv($1);
   Fn->setAlignment($9);
   if ($8) {
-    Fn->setSection($8);
-    free($8);
+    Fn->setSection(*$8);
+    delete $8;
   }
 
   // Add all of the arguments we parsed to the function...
@@ -2226,7 +2329,7 @@ FunctionHeaderH : OptCallingConv ResultTypes GlobalName '(' ArgList ')'
     for (ArgListType::iterator I = $5->begin(); 
          I != $5->end() && ArgIt != ArgEnd; ++I, ++ArgIt) {
       delete I->Ty;                          // Delete the typeholder...
-      setValueName(ArgIt, I->Name);          // Insert arg into symtab...
+      setValueName(ArgIt, I->Name);       // Insert arg into symtab...
       CHECK_FOR_ERROR
       InsertValue(ArgIt);
       Idx++;
@@ -2338,13 +2441,9 @@ ConstValueRef : ESINT64VAL {    // A reference to a direct constant
     CHECK_FOR_ERROR
   }
   | ASM_TOK OptSideEffect STRINGCONSTANT ',' STRINGCONSTANT {
-    char *End = UnEscapeLexed($3, true);
-    std::string AsmStr = std::string($3, End);
-    End = UnEscapeLexed($5, true);
-    std::string Constraints = std::string($5, End);
-    $$ = ValID::createInlineAsm(AsmStr, Constraints, $2);
-    free($3);
-    free($5);
+    $$ = ValID::createInlineAsm(*$3, *$5, $2);
+    delete $3;
+    delete $5;
     CHECK_FOR_ERROR
   };
 
@@ -2360,11 +2459,13 @@ SymbolicValueRef : LOCALVAL_ID {  // Is it an integer reference...?
     CHECK_FOR_ERROR
   }
   | LocalName {                   // Is it a named reference...?
-    $$ = ValID::createLocalName($1);
+    $$ = ValID::createLocalName(*$1);
+    delete $1;
     CHECK_FOR_ERROR
   }
   | GlobalName {                   // Is it a named reference...?
-    $$ = ValID::createGlobalName($1);
+    $$ = ValID::createGlobalName(*$1);
+    delete $1;
     CHECK_FOR_ERROR
   };
 
@@ -2420,8 +2521,10 @@ InstructionList : InstructionList Inst {
     CHECK_FOR_ERROR
   }
   | LABELSTR {             // Labelled (named) basic block
-    $$ = defineBBVal(ValID::createLocalName($1));
+    $$ = defineBBVal(ValID::createLocalName(*$1));
+    delete $1;
     CHECK_FOR_ERROR
+
   };
 
 BBTerminatorInst : RET ResolvedVal {              // Return with a result...
@@ -2485,9 +2588,11 @@ BBTerminatorInst : RET ResolvedVal {              // Return with a result...
         !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
       // Pull out the types of all of the arguments...
       std::vector<const Type*> ParamTypes;
-      ParamAttrsList ParamAttrs;
-      if ($8 != NoAttributeSet)
-        ParamAttrs.addAttributes(0, $8);
+      ParamAttrsVector Attrs;
+      if ($8 != ParamAttr::None) {
+        ParamAttrsWithIndex PAWI; PAWI.index = 0; PAWI.attrs = $8;
+        Attrs.push_back(PAWI);
+      }
       ValueRefList::iterator I = $6->begin(), E = $6->end();
       unsigned index = 1;
       for (; I != E; ++I, ++index) {
@@ -2495,14 +2600,16 @@ BBTerminatorInst : RET ResolvedVal {              // Return with a result...
         if (Ty == Type::VoidTy)
           GEN_ERROR("Short call syntax cannot be used with varargs");
         ParamTypes.push_back(Ty);
-        if (I->Attrs != NoAttributeSet)
-          ParamAttrs.addAttributes(index, I->Attrs);
+        if (I->Attrs != ParamAttr::None) {
+          ParamAttrsWithIndex PAWI; PAWI.index = index; PAWI.attrs = I->Attrs;
+          Attrs.push_back(PAWI);
+        }
       }
 
-      ParamAttrsList *Attrs = 0;
-      if (!ParamAttrs.empty())
-        Attrs = new ParamAttrsList(ParamAttrs);
-      Ty = FunctionType::get($3->get(), ParamTypes, false, Attrs);
+      ParamAttrsList *PAL = 0;
+      if (!Attrs.empty())
+        PAL = ParamAttrsList::get(Attrs);
+      Ty = FunctionType::get($3->get(), ParamTypes, false, PAL);
       PFTy = PointerType::get(Ty);
     }
 
@@ -2545,7 +2652,7 @@ BBTerminatorInst : RET ResolvedVal {              // Return with a result...
     }
 
     // Create the InvokeInst
-    InvokeInst *II = new InvokeInst(V, Normal, Except, &Args[0], Args.size());
+    InvokeInst *II = new InvokeInst(V, Normal, Except, Args.begin(), Args.end());
     II->setCallingConv($2);
     $$ = II;
     delete $6;
@@ -2791,9 +2898,11 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
         !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
       // Pull out the types of all of the arguments...
       std::vector<const Type*> ParamTypes;
-      ParamAttrsList ParamAttrs;
-      if ($8 != NoAttributeSet)
-        ParamAttrs.addAttributes(0, $8);
+      ParamAttrsVector Attrs;
+      if ($8 != ParamAttr::None) {
+        ParamAttrsWithIndex PAWI; PAWI.index = 0; PAWI.attrs = $8;
+        Attrs.push_back(PAWI);
+      }
       unsigned index = 1;
       ValueRefList::iterator I = $6->begin(), E = $6->end();
       for (; I != E; ++I, ++index) {
@@ -2801,21 +2910,32 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
         if (Ty == Type::VoidTy)
           GEN_ERROR("Short call syntax cannot be used with varargs");
         ParamTypes.push_back(Ty);
-        if (I->Attrs != NoAttributeSet)
-          ParamAttrs.addAttributes(index, I->Attrs);
+        if (I->Attrs != ParamAttr::None) {
+          ParamAttrsWithIndex PAWI; PAWI.index = index; PAWI.attrs = I->Attrs;
+          Attrs.push_back(PAWI);
+        }
       }
 
-      ParamAttrsList *Attrs = 0;
-      if (!ParamAttrs.empty())
-        Attrs = new ParamAttrsList(ParamAttrs);
+      ParamAttrsList *PAL = 0;
+      if (!Attrs.empty())
+        PAL = ParamAttrsList::get(Attrs);
 
-      Ty = FunctionType::get($3->get(), ParamTypes, false, Attrs);
+      Ty = FunctionType::get($3->get(), ParamTypes, false, PAL);
       PFTy = PointerType::get(Ty);
     }
 
     Value *V = getVal(PFTy, $4);   // Get the function we're calling...
     CHECK_FOR_ERROR
 
+    // Check for call to invalid intrinsic to avoid crashing later.
+    if (Function *theF = dyn_cast<Function>(V)) {
+      if (theF->hasName() && (theF->getValueName()->getKeyLength() >= 5) &&
+          (0 == strncmp(theF->getValueName()->getKeyData(), "llvm.", 5)) &&
+          !theF->getIntrinsicID(true))
+        GEN_ERROR("Call to invalid LLVM intrinsic function '" +
+                  theF->getName() + "'");
+    }
+
     // Check the arguments 
     ValueList Args;
     if ($6->empty()) {                                   // Has no arguments?
@@ -2845,7 +2965,7 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
         GEN_ERROR("Invalid number of parameters detected");
     }
     // Create the call node
-    CallInst *CI = new CallInst(V, &Args[0], Args.size());
+    CallInst *CI = new CallInst(V, Args.begin(), Args.end());
     CI->setTailCall($1);
     CI->setCallingConv($2);
     $$ = CI;
@@ -2907,7 +3027,7 @@ MemoryInst : MALLOC Types OptCAlign {
     CHECK_FOR_ERROR
   }
 
-  | OptVolatile LOAD Types ValueRef {
+  | OptVolatile LOAD Types ValueRef OptCAlign {
     if (!UpRefs.empty())
       GEN_ERROR("Invalid upreference in type: " + (*$3)->getDescription());
     if (!isa<PointerType>($3->get()))
@@ -2918,10 +3038,10 @@ MemoryInst : MALLOC Types OptCAlign {
                      (*$3)->getDescription());
     Value* tmpVal = getVal(*$3, $4);
     CHECK_FOR_ERROR
-    $$ = new LoadInst(tmpVal, "", $1);
+    $$ = new LoadInst(tmpVal, "", $1, $5);
     delete $3;
   }
-  | OptVolatile STORE ResolvedVal ',' Types ValueRef {
+  | OptVolatile STORE ResolvedVal ',' Types ValueRef OptCAlign {
     if (!UpRefs.empty())
       GEN_ERROR("Invalid upreference in type: " + (*$5)->getDescription());
     const PointerType *PT = dyn_cast<PointerType>($5->get());
@@ -2935,7 +3055,7 @@ MemoryInst : MALLOC Types OptCAlign {
 
     Value* tmpVal = getVal(*$5, $6);
     CHECK_FOR_ERROR
-    $$ = new StoreInst($3, tmpVal, $1);
+    $$ = new StoreInst($3, tmpVal, $1, $7);
     delete $5;
   }
   | GETELEMENTPTR Types ValueRef IndexList {