LLParser.h revision f3a789d931de6b5be729c33ff476fb20f0badbb1
1df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner//===-- LLParser.h - Parser Class -------------------------------*- C++ -*-===// 2df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner// 3df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner// The LLVM Compiler Infrastructure 4df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner// 5df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner// This file is distributed under the University of Illinois Open Source 6df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner// License. See LICENSE.TXT for details. 7df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner// 8df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner//===----------------------------------------------------------------------===// 9df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner// 10df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner// This file defines the parser class for .ll files. 11df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner// 12df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner//===----------------------------------------------------------------------===// 13df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 14df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#ifndef LLVM_ASMPARSER_LLPARSER_H 15df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#define LLVM_ASMPARSER_LLPARSER_H 16df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 17df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#include "LLLexer.h" 18fba933c823a2862067e0696bd5032ab18185bd77Owen Anderson#include "llvm/Module.h" 19df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#include "llvm/Type.h" 20b45218f7c8c53ed77bc35563b2a300781be3cdd0Chris Lattner#include "llvm/ADT/DenseMap.h" 215660846f15847e540066ae320a4adef7357d597dChris Lattner#include "llvm/Support/ValueHandle.h" 22e80250ec84e6e3aa916a66acc507241e7bde89c9Chris Lattner#include <map> 23df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 24df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnernamespace llvm { 25df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class Module; 26df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class OpaqueType; 27df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class Function; 28df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class Value; 29df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class BasicBlock; 30df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class Instruction; 31df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class Constant; 32df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class GlobalValue; 3321cc4460efa104e8591b05a90f20130291614344Nick Lewycky class MDString; 3421cc4460efa104e8591b05a90f20130291614344Nick Lewycky class MDNode; 359ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 3609d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// ValID - Represents a reference of a definition of some sort with no type. 3709d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// There are several cases where we have to parse the value but where the 3809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// type can depend on later context. This may either be a numeric reference 3909d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// or a symbolic (%var) reference. This is just a discriminated union. 4009d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner struct ValID { 4109d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner enum { 4209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_LocalID, t_GlobalID, // ID in UIntVal. 4309d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_LocalName, t_GlobalName, // Name in StrVal. 4409d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_APSInt, t_APFloat, // Value in APSIntVal/APFloatVal. 4509d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_Null, t_Undef, t_Zero, // No value. 4609d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_EmptyArray, // No value: [] 4709d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_Constant, // Value in ConstantVal. 4809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_InlineAsm, // Value in StrVal/StrVal2/UIntVal. 49287881d51086c4c5b38d109142f97442c9283374Chris Lattner t_MDNode, // Value in MDNodeVal. 50287881d51086c4c5b38d109142f97442c9283374Chris Lattner t_MDString // Value in MDStringVal. 5109d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner } Kind; 5209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 5309d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner LLLexer::LocTy Loc; 5409d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner unsigned UIntVal; 5509d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner std::string StrVal, StrVal2; 5609d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner APSInt APSIntVal; 5709d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner APFloat APFloatVal; 5809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner Constant *ConstantVal; 59287881d51086c4c5b38d109142f97442c9283374Chris Lattner MDNode *MDNodeVal; 60287881d51086c4c5b38d109142f97442c9283374Chris Lattner MDString *MDStringVal; 6109d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner ValID() : APFloatVal(0.0) {} 6209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 6309d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner bool operator<(const ValID &RHS) const { 6409d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner if (Kind == t_LocalID || Kind == t_GlobalID) 6509d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner return UIntVal < RHS.UIntVal; 6609d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner assert((Kind == t_LocalName || Kind == t_GlobalName) && 6709d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner "Ordering not defined for this ValID kind yet"); 6809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner return StrVal < RHS.StrVal; 6909d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner } 7009d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner }; 7109d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 72df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class LLParser { 73df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner public: 74df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner typedef LLLexer::LocTy LocTy; 75df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner private: 764ba9d9b67be87ce82f71023643b759ff12fdb411Chris Lattner LLVMContext &Context; 77df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner LLLexer Lex; 78df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Module *M; 79449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner 80449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner // Instruction metadata resolution. Each instruction can have a list of 81449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner // MDRef info associated with them. 8241d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // 8341d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // The simpler approach of just creating temporary MDNodes and then calling 8441d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // RAUW on them when the definition is processed doesn't work because some 8541d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // instruction metadata kinds, such as dbg, get stored in the IR in an 8641d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // "optimized" format which doesn't participate in the normal value use 8741d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // lists. This means that RAUW doesn't work, even on temporary MDNodes 8841d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // which otherwise support RAUW. Instead, we defer resolving MDNode 8941d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // references until the definitions have been processed. 90449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner struct MDRef { 91449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner SMLoc Loc; 92449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner unsigned MDKind, MDSlot; 93449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner }; 94449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner DenseMap<Instruction*, std::vector<MDRef> > ForwardRefInstMetadata; 959ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 96df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Type resolution handling data structures. 97df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::map<std::string, std::pair<PATypeHolder, LocTy> > ForwardRefTypes; 98df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::map<unsigned, std::pair<PATypeHolder, LocTy> > ForwardRefTypeIDs; 99df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::vector<PATypeHolder> NumberedTypes; 1000834e6a07b1965712781804b0113a8b282f40a5fChris Lattner std::vector<TrackingVH<MDNode> > NumberedMetadata; 101e80250ec84e6e3aa916a66acc507241e7bde89c9Chris Lattner std::map<unsigned, std::pair<TrackingVH<MDNode>, LocTy> > ForwardRefMDNodes; 102df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner struct UpRefRecord { 103df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// Loc - This is the location of the upref. 104df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner LocTy Loc; 1059ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 106df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// NestingLevel - The number of nesting levels that need to be popped 107df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// before this type is resolved. 108df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner unsigned NestingLevel; 1099ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 110df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// LastContainedTy - This is the type at the current binding level for 111df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// the type. Every time we reduce the nesting level, this gets updated. 112df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner const Type *LastContainedTy; 1139ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 114df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// UpRefTy - This is the actual opaque type that the upreference is 115df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// represented with. 116df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner OpaqueType *UpRefTy; 1179ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 118df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner UpRefRecord(LocTy L, unsigned NL, OpaqueType *URTy) 119df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner : Loc(L), NestingLevel(NL), LastContainedTy((Type*)URTy), 120df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner UpRefTy(URTy) {} 121df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner }; 122df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::vector<UpRefRecord> UpRefs; 123df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 124df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Global Value reference information. 125df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::map<std::string, std::pair<GlobalValue*, LocTy> > ForwardRefVals; 126df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::map<unsigned, std::pair<GlobalValue*, LocTy> > ForwardRefValIDs; 127df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::vector<GlobalValue*> NumberedVals; 12809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 12909d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner // References to blockaddress. The key is the function ValID, the value is 13009d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner // a list of references to blocks in that function. 13109d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner std::map<ValID, std::vector<std::pair<ValID, GlobalValue*> > > 13209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner ForwardRefBlockAddresses; 13309d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 134df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner public: 135eeb4a84ac8d91fb1d5a7c484a1c7047409faee30Chris Lattner LLParser(MemoryBuffer *F, SourceMgr &SM, SMDiagnostic &Err, Module *m) : 13613ad5aaaff8a446758b402fd5e9aea22f5bc5682Victor Hernandez Context(m->getContext()), Lex(F, SM, Err, m->getContext()), 137f3a789d931de6b5be729c33ff476fb20f0badbb1Chris Lattner M(m) {} 138ad7d1e2085a489dbedc65b99bab811771ead1aabChris Lattner bool Run(); 1399ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 140b43eae745eb9a7c46fe76b0ed8053b782ca67536Owen Anderson LLVMContext& getContext() { return Context; } 141b43eae745eb9a7c46fe76b0ed8053b782ca67536Owen Anderson 142df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner private: 143df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 144d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer bool Error(LocTy L, const Twine &Msg) const { 145df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return Lex.Error(L, Msg); 146df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 147d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer bool TokError(const Twine &Msg) const { 148df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return Error(Lex.getLoc(), Msg); 149df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 1509ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 151df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// GetGlobalVal - Get a value with the specified name or ID, creating a 152df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// forward reference record if needed. This can return null if the value 153df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// exists but does not have the right type. 154df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner GlobalValue *GetGlobalVal(const std::string &N, const Type *Ty, LocTy Loc); 155df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner GlobalValue *GetGlobalVal(unsigned ID, const Type *Ty, LocTy Loc); 1569ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 157df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Helper Routines. 158df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseToken(lltok::Kind T, const char *ErrMsg); 1593ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner bool EatIfPresent(lltok::Kind T) { 1603ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner if (Lex.getKind() != T) return false; 1613ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner Lex.Lex(); 1623ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner return true; 1633ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner } 164d72479c2f061e3b57adf3d054875665f25a30d90Rafael Espindola bool ParseOptionalToken(lltok::Kind T, bool &Present, LocTy *Loc = 0) { 165df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner if (Lex.getKind() != T) { 166df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Present = false; 167df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } else { 168d72479c2f061e3b57adf3d054875665f25a30d90Rafael Espindola if (Loc) 169d72479c2f061e3b57adf3d054875665f25a30d90Rafael Espindola *Loc = Lex.getLoc(); 170df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Lex.Lex(); 171df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Present = true; 172df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 173df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return false; 174df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 1753ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner bool ParseStringConstant(std::string &Result); 1763ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner bool ParseUInt32(unsigned &Val); 1773ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner bool ParseUInt32(unsigned &Val, LocTy &Loc) { 178df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Loc = Lex.getLoc(); 1793ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner return ParseUInt32(Val); 180df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 181df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalAddrSpace(unsigned &AddrSpace); 182df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalAttrs(unsigned &Attrs, unsigned AttrKind); 183df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalLinkage(unsigned &Linkage, bool &HasLinkage); 184df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalLinkage(unsigned &Linkage) { 185df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool HasLinkage; return ParseOptionalLinkage(Linkage, HasLinkage); 186df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 187df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalVisibility(unsigned &Visibility); 18865c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel bool ParseOptionalCallingConv(CallingConv::ID &CC); 189df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalAlignment(unsigned &Alignment); 1901e063d14df0f182626ebdd7ac7f32405aa754e03Charles Davis bool ParseOptionalStackAlignment(unsigned &Alignment); 191c3a6c5c83b5fa7b813de1741ac9e9be702b03846Chris Lattner bool ParseOptionalCommaAlign(unsigned &Alignment, bool &AteExtraComma); 192628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner bool ParseIndexList(SmallVectorImpl<unsigned> &Indices,bool &AteExtraComma); 193628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner bool ParseIndexList(SmallVectorImpl<unsigned> &Indices) { 194628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner bool AteExtraComma; 195628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner if (ParseIndexList(Indices, AteExtraComma)) return true; 196628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner if (AteExtraComma) 197628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner return TokError("expected index"); 198628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner return false; 199628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner } 2009ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 201df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Top-Level Entities 202df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseTopLevelEntities(); 203df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ValidateEndOfModule(); 204df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseTargetDefinition(); 205df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseDepLibs(); 206df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseModuleAsm(); 207df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseUnnamedType(); 208df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseNamedType(); 209df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseDeclare(); 210df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseDefine(); 2119ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 212df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseGlobalType(bool &IsConstant); 2133845e50edea58edd0f5e0f2b732e0106b53ba279Dan Gohman bool ParseUnnamedGlobal(); 214df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseNamedGlobal(); 215df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseGlobal(const std::string &Name, LocTy Loc, unsigned Linkage, 216df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool HasLinkage, unsigned Visibility); 217df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseAlias(const std::string &Name, LocTy Loc, unsigned Visibility); 218923078c65d5a37a4f135705300c9feea49487de5Devang Patel bool ParseStandaloneMetadata(); 219eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel bool ParseNamedMetadata(); 220442ffa1c5688f32b275f7657b5ee3646bfe8ffa3Chris Lattner bool ParseMDString(MDString *&Result); 2214a72efc0ad18c1b9c98bb2f0cb881a39a7010b53Chris Lattner bool ParseMDNodeID(MDNode *&Result); 222449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner bool ParseMDNodeID(MDNode *&Result, unsigned &SlotNo); 2239ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 224df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Type Parsing. 225a9a9e07d1c5d3c73835e716d81c2ec94ad0b865fChris Lattner bool ParseType(PATypeHolder &Result, bool AllowVoid = false); 226a9a9e07d1c5d3c73835e716d81c2ec94ad0b865fChris Lattner bool ParseType(PATypeHolder &Result, LocTy &Loc, bool AllowVoid = false) { 227df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Loc = Lex.getLoc(); 228a9a9e07d1c5d3c73835e716d81c2ec94ad0b865fChris Lattner return ParseType(Result, AllowVoid); 229df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 230df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseTypeRec(PATypeHolder &H); 231df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseStructType(PATypeHolder &H, bool Packed); 232df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseArrayVectorType(PATypeHolder &H, bool isVector); 233df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseFunctionType(PATypeHolder &Result); 234df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner PATypeHolder HandleUpRefs(const Type *Ty); 235df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 236df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Function Semantic Analysis. 237df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class PerFunctionState { 238df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner LLParser &P; 239df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Function &F; 240df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::map<std::string, std::pair<Value*, LocTy> > ForwardRefVals; 241df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::map<unsigned, std::pair<Value*, LocTy> > ForwardRefValIDs; 242df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::vector<Value*> NumberedVals; 24309d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 24409d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// FunctionNumber - If this is an unnamed function, this is the slot 24509d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// number of it, otherwise it is -1. 24609d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner int FunctionNumber; 247df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner public: 24809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner PerFunctionState(LLParser &p, Function &f, int FunctionNumber); 249df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner ~PerFunctionState(); 2509ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 251df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Function &getFunction() const { return F; } 2529ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 25309d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner bool FinishFunction(); 2549ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 255df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// GetVal - Get a value with the specified name or ID, creating a 256df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// forward reference record if needed. This can return null if the value 257df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// exists but does not have the right type. 258df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Value *GetVal(const std::string &Name, const Type *Ty, LocTy Loc); 259df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Value *GetVal(unsigned ID, const Type *Ty, LocTy Loc); 2609ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 261df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// SetInstName - After an instruction is parsed and inserted into its 262df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// basic block, this installs its name. 263df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool SetInstName(int NameID, const std::string &NameStr, LocTy NameLoc, 264df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Instruction *Inst); 2659ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 266df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// GetBB - Get a basic block with the specified name or ID, creating a 267df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// forward reference record if needed. This can return null if the value 268df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// is not a BasicBlock. 269df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner BasicBlock *GetBB(const std::string &Name, LocTy Loc); 270df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner BasicBlock *GetBB(unsigned ID, LocTy Loc); 2719ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 272df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// DefineBB - Define the specified basic block, which is either named or 273df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// unnamed. If there is an error, this returns null otherwise it returns 274df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// the block being defined. 275df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner BasicBlock *DefineBB(const std::string &Name, LocTy Loc); 276df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner }; 2779ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 278df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ConvertValIDToValue(const Type *Ty, ValID &ID, Value *&V, 27992f238dd8fe19b26103bd451c571281d9b7ad324Victor Hernandez PerFunctionState *PFS); 2809ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 281df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseValue(const Type *Ty, Value *&V, PerFunctionState &PFS); 282df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseValue(const Type *Ty, Value *&V, LocTy &Loc, 283df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner PerFunctionState &PFS) { 284df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Loc = Lex.getLoc(); 285df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return ParseValue(Ty, V, PFS); 286df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 2879ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 288df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseTypeAndValue(Value *&V, PerFunctionState &PFS); 289df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseTypeAndValue(Value *&V, LocTy &Loc, PerFunctionState &PFS) { 290df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Loc = Lex.getLoc(); 291df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return ParseTypeAndValue(V, PFS); 292df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 293f9be95f867745b6754b2402b9b72f9eaeabd637fChris Lattner bool ParseTypeAndBasicBlock(BasicBlock *&BB, LocTy &Loc, 294f9be95f867745b6754b2402b9b72f9eaeabd637fChris Lattner PerFunctionState &PFS); 295f9be95f867745b6754b2402b9b72f9eaeabd637fChris Lattner bool ParseTypeAndBasicBlock(BasicBlock *&BB, PerFunctionState &PFS) { 296f9be95f867745b6754b2402b9b72f9eaeabd637fChris Lattner LocTy Loc; 297f9be95f867745b6754b2402b9b72f9eaeabd637fChris Lattner return ParseTypeAndBasicBlock(BB, Loc, PFS); 298f9be95f867745b6754b2402b9b72f9eaeabd637fChris Lattner } 2991971556cc271710b683bc3ca8327c903791c910fVictor Hernandez 300fdfeb6976f07ad10d809b922ed7376ba2a3539beChris Lattner 301df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner struct ParamInfo { 302df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner LocTy Loc; 303df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Value *V; 304df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner unsigned Attrs; 3059ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman ParamInfo(LocTy loc, Value *v, unsigned attrs) 306df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner : Loc(loc), V(v), Attrs(attrs) {} 307df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner }; 308df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseParameterList(SmallVectorImpl<ParamInfo> &ArgList, 309df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner PerFunctionState &PFS); 3109ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 311bf170d4c2ffd9dc99fad1fabfbf1f90f980a9782Victor Hernandez // Constant Parsing. 312bf170d4c2ffd9dc99fad1fabfbf1f90f980a9782Victor Hernandez bool ParseValID(ValID &ID, PerFunctionState *PFS = NULL); 313bf170d4c2ffd9dc99fad1fabfbf1f90f980a9782Victor Hernandez bool ParseGlobalValue(const Type *Ty, Constant *&V); 314bf170d4c2ffd9dc99fad1fabfbf1f90f980a9782Victor Hernandez bool ParseGlobalTypeAndValue(Constant *&V); 315bf170d4c2ffd9dc99fad1fabfbf1f90f980a9782Victor Hernandez bool ParseGlobalValueVector(SmallVectorImpl<Constant*> &Elts); 316309b3af547a60bedd74daa2a94ebd3d3ed5f06e9Dan Gohman bool ParseMetadataListValue(ValID &ID, PerFunctionState *PFS); 317834480374ba38b2a31d6b63b492e442d75a462cfDan Gohman bool ParseMetadataValue(ValID &ID, PerFunctionState *PFS); 31824e64df7ec25b55aa872c2ef33728dfbb8c353c4Victor Hernandez bool ParseMDNodeVector(SmallVectorImpl<Value*> &, PerFunctionState *PFS); 3199d072f51ebf61edda9c31f831c2642d110170d13Dan Gohman bool ParseInstructionMetadata(Instruction *Inst, PerFunctionState *PFS); 320bf170d4c2ffd9dc99fad1fabfbf1f90f980a9782Victor Hernandez 321df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Function Parsing. 322df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner struct ArgInfo { 323df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner LocTy Loc; 324df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner PATypeHolder Type; 325df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner unsigned Attrs; 326df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::string Name; 327df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner ArgInfo(LocTy L, PATypeHolder Ty, unsigned Attr, const std::string &N) 328df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner : Loc(L), Type(Ty), Attrs(Attr), Name(N) {} 329df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner }; 330df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseArgumentList(std::vector<ArgInfo> &ArgList, 331dfd19ddcfa7568d2118fbc3c6da612295200c31cChris Lattner bool &isVarArg, bool inType); 332df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseFunctionHeader(Function *&Fn, bool isDefine); 333df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseFunctionBody(Function &Fn); 334df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseBasicBlock(PerFunctionState &PFS); 3359ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 336f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner // Instruction Parsing. Each instruction parsing routine can return with a 337f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner // normal result, an error result, or return having eaten an extra comma. 338f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner enum InstResult { InstNormal = 0, InstError = 1, InstExtraComma = 2 }; 339f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner int ParseInstruction(Instruction *&Inst, BasicBlock *BB, 340f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner PerFunctionState &PFS); 341df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseCmpPredicate(unsigned &Pred, unsigned Opc); 3429ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 343f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner int ParseRet(Instruction *&Inst, BasicBlock *BB, PerFunctionState &PFS); 344df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseBr(Instruction *&Inst, PerFunctionState &PFS); 345df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseSwitch(Instruction *&Inst, PerFunctionState &PFS); 346ab21db79ef1d2530880ad11f21f0b87ffca02dd4Chris Lattner bool ParseIndirectBr(Instruction *&Inst, PerFunctionState &PFS); 347df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseInvoke(Instruction *&Inst, PerFunctionState &PFS); 3489ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 349e914b59c008745204c49fcf0751f9cc4d91f44bbChris Lattner bool ParseArithmetic(Instruction *&I, PerFunctionState &PFS, unsigned Opc, 350e914b59c008745204c49fcf0751f9cc4d91f44bbChris Lattner unsigned OperandType); 351df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseLogical(Instruction *&I, PerFunctionState &PFS, unsigned Opc); 352df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseCompare(Instruction *&I, PerFunctionState &PFS, unsigned Opc); 353df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseCast(Instruction *&I, PerFunctionState &PFS, unsigned Opc); 354df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseSelect(Instruction *&I, PerFunctionState &PFS); 3550088a5cc722b9e32820d31c70175a7650ad4772dChris Lattner bool ParseVA_Arg(Instruction *&I, PerFunctionState &PFS); 356df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseExtractElement(Instruction *&I, PerFunctionState &PFS); 357df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseInsertElement(Instruction *&I, PerFunctionState &PFS); 358df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseShuffleVector(Instruction *&I, PerFunctionState &PFS); 359a7d7f2c0239ecc8513461ec69c8b922698ce5fe0Chris Lattner int ParsePHI(Instruction *&I, PerFunctionState &PFS); 360df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseCall(Instruction *&I, PerFunctionState &PFS, bool isTail); 361f3a789d931de6b5be729c33ff476fb20f0badbb1Chris Lattner int ParseAlloc(Instruction *&I, PerFunctionState &PFS); 362c3a6c5c83b5fa7b813de1741ac9e9be702b03846Chris Lattner int ParseLoad(Instruction *&I, PerFunctionState &PFS, bool isVolatile); 363c3a6c5c83b5fa7b813de1741ac9e9be702b03846Chris Lattner int ParseStore(Instruction *&I, PerFunctionState &PFS, bool isVolatile); 364df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseGetResult(Instruction *&I, PerFunctionState &PFS); 365a7d7f2c0239ecc8513461ec69c8b922698ce5fe0Chris Lattner int ParseGetElementPtr(Instruction *&I, PerFunctionState &PFS); 366a7d7f2c0239ecc8513461ec69c8b922698ce5fe0Chris Lattner int ParseExtractValue(Instruction *&I, PerFunctionState &PFS); 367a7d7f2c0239ecc8513461ec69c8b922698ce5fe0Chris Lattner int ParseInsertValue(Instruction *&I, PerFunctionState &PFS); 36809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 36909d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner bool ResolveForwardRefBlockAddresses(Function *TheFn, 37009d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner std::vector<std::pair<ValID, GlobalValue*> > &Refs, 37109d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner PerFunctionState *PFS); 372df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner }; 373df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner} // End llvm namespace 374df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 375df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#endif 376