LLParser.h revision db125cfaf57cc83e7dd7453de2d509bc8efd0e5e
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" 211afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner#include "llvm/ADT/StringMap.h" 225660846f15847e540066ae320a4adef7357d597dChris Lattner#include "llvm/Support/ValueHandle.h" 23e80250ec84e6e3aa916a66acc507241e7bde89c9Chris Lattner#include <map> 24df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 25df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnernamespace llvm { 26df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class Module; 27df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class OpaqueType; 28df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class Function; 29df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class Value; 30df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class BasicBlock; 31df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class Instruction; 32df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class Constant; 33df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class GlobalValue; 3421cc4460efa104e8591b05a90f20130291614344Nick Lewycky class MDString; 3521cc4460efa104e8591b05a90f20130291614344Nick Lewycky class MDNode; 361afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner class StructType; 379ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 3809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// ValID - Represents a reference of a definition of some sort with no type. 3909d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// There are several cases where we have to parse the value but where the 4009d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// type can depend on later context. This may either be a numeric reference 4109d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// or a symbolic (%var) reference. This is just a discriminated union. 4209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner struct ValID { 4309d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner enum { 4409d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_LocalID, t_GlobalID, // ID in UIntVal. 4509d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_LocalName, t_GlobalName, // Name in StrVal. 4609d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_APSInt, t_APFloat, // Value in APSIntVal/APFloatVal. 4709d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_Null, t_Undef, t_Zero, // No value. 4809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_EmptyArray, // No value: [] 4909d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_Constant, // Value in ConstantVal. 5009d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_InlineAsm, // Value in StrVal/StrVal2/UIntVal. 51287881d51086c4c5b38d109142f97442c9283374Chris Lattner t_MDNode, // Value in MDNodeVal. 521afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner t_MDString, // Value in MDStringVal. 531afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner t_ConstantStruct, // Value in ConstantStructElts. 541afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner t_PackedConstantStruct // Value in ConstantStructElts. 5509d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner } Kind; 5609d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 5709d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner LLLexer::LocTy Loc; 5809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner unsigned UIntVal; 5909d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner std::string StrVal, StrVal2; 6009d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner APSInt APSIntVal; 6109d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner APFloat APFloatVal; 6209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner Constant *ConstantVal; 63287881d51086c4c5b38d109142f97442c9283374Chris Lattner MDNode *MDNodeVal; 64287881d51086c4c5b38d109142f97442c9283374Chris Lattner MDString *MDStringVal; 651afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Constant **ConstantStructElts; 661afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 671afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ValID() : Kind(t_LocalID), APFloatVal(0.0) {} 681afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ~ValID() { 691afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (Kind == t_ConstantStruct || Kind == t_PackedConstantStruct) 701afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner delete [] ConstantStructElts; 711afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } 7209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 7309d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner bool operator<(const ValID &RHS) const { 7409d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner if (Kind == t_LocalID || Kind == t_GlobalID) 7509d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner return UIntVal < RHS.UIntVal; 761afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner assert((Kind == t_LocalName || Kind == t_GlobalName || 771afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Kind == t_ConstantStruct || Kind == t_PackedConstantStruct) && 7809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner "Ordering not defined for this ValID kind yet"); 7909d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner return StrVal < RHS.StrVal; 8009d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner } 8109d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner }; 8209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 83df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class LLParser { 84df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner public: 85df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner typedef LLLexer::LocTy LocTy; 86df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner private: 874ba9d9b67be87ce82f71023643b759ff12fdb411Chris Lattner LLVMContext &Context; 88df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner LLLexer Lex; 89df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Module *M; 90449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner 91449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner // Instruction metadata resolution. Each instruction can have a list of 92449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner // MDRef info associated with them. 9341d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // 9441d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // The simpler approach of just creating temporary MDNodes and then calling 9541d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // RAUW on them when the definition is processed doesn't work because some 9641d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // instruction metadata kinds, such as dbg, get stored in the IR in an 9741d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // "optimized" format which doesn't participate in the normal value use 9841d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // lists. This means that RAUW doesn't work, even on temporary MDNodes 9941d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // which otherwise support RAUW. Instead, we defer resolving MDNode 10041d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // references until the definitions have been processed. 101449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner struct MDRef { 102449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner SMLoc Loc; 103449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner unsigned MDKind, MDSlot; 104449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner }; 105449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner DenseMap<Instruction*, std::vector<MDRef> > ForwardRefInstMetadata; 1069ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 1071afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Type resolution handling data structures. The location is set when we 1081afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // have processed a use of the type but not a definition yet. 1091afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner StringMap<std::pair<Type*, LocTy> > NamedTypes; 1101afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner std::vector<std::pair<Type*, LocTy> > NumberedTypes; 1111afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 1120834e6a07b1965712781804b0113a8b282f40a5fChris Lattner std::vector<TrackingVH<MDNode> > NumberedMetadata; 113e80250ec84e6e3aa916a66acc507241e7bde89c9Chris Lattner std::map<unsigned, std::pair<TrackingVH<MDNode>, LocTy> > ForwardRefMDNodes; 114df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 115df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Global Value reference information. 116df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::map<std::string, std::pair<GlobalValue*, LocTy> > ForwardRefVals; 117df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::map<unsigned, std::pair<GlobalValue*, LocTy> > ForwardRefValIDs; 118df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::vector<GlobalValue*> NumberedVals; 11909d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 12009d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner // References to blockaddress. The key is the function ValID, the value is 12109d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner // a list of references to blocks in that function. 12209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner std::map<ValID, std::vector<std::pair<ValID, GlobalValue*> > > 12309d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner ForwardRefBlockAddresses; 12409d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 125df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner public: 126eeb4a84ac8d91fb1d5a7c484a1c7047409faee30Chris Lattner LLParser(MemoryBuffer *F, SourceMgr &SM, SMDiagnostic &Err, Module *m) : 12713ad5aaaff8a446758b402fd5e9aea22f5bc5682Victor Hernandez Context(m->getContext()), Lex(F, SM, Err, m->getContext()), 128f3a789d931de6b5be729c33ff476fb20f0badbb1Chris Lattner M(m) {} 129ad7d1e2085a489dbedc65b99bab811771ead1aabChris Lattner bool Run(); 1309ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 1311afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner LLVMContext &getContext() { return Context; } 132b43eae745eb9a7c46fe76b0ed8053b782ca67536Owen Anderson 133df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner private: 134df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 135d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer bool Error(LocTy L, const Twine &Msg) const { 136df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return Lex.Error(L, Msg); 137df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 138d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer bool TokError(const Twine &Msg) const { 139df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return Error(Lex.getLoc(), Msg); 140df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 1419ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 142df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// GetGlobalVal - Get a value with the specified name or ID, creating a 143df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// forward reference record if needed. This can return null if the value 144df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// exists but does not have the right type. 145db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner GlobalValue *GetGlobalVal(const std::string &N, Type *Ty, LocTy Loc); 146db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner GlobalValue *GetGlobalVal(unsigned ID, Type *Ty, LocTy Loc); 1479ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 148df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Helper Routines. 149df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseToken(lltok::Kind T, const char *ErrMsg); 1503ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner bool EatIfPresent(lltok::Kind T) { 1513ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner if (Lex.getKind() != T) return false; 1523ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner Lex.Lex(); 1533ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner return true; 1543ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner } 155d72479c2f061e3b57adf3d054875665f25a30d90Rafael Espindola bool ParseOptionalToken(lltok::Kind T, bool &Present, LocTy *Loc = 0) { 156df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner if (Lex.getKind() != T) { 157df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Present = false; 158df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } else { 159d72479c2f061e3b57adf3d054875665f25a30d90Rafael Espindola if (Loc) 160d72479c2f061e3b57adf3d054875665f25a30d90Rafael Espindola *Loc = Lex.getLoc(); 161df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Lex.Lex(); 162df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Present = true; 163df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 164df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return false; 165df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 1663ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner bool ParseStringConstant(std::string &Result); 1673ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner bool ParseUInt32(unsigned &Val); 1683ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner bool ParseUInt32(unsigned &Val, LocTy &Loc) { 169df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Loc = Lex.getLoc(); 1703ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner return ParseUInt32(Val); 171df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 172df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalAddrSpace(unsigned &AddrSpace); 173df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalAttrs(unsigned &Attrs, unsigned AttrKind); 174df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalLinkage(unsigned &Linkage, bool &HasLinkage); 175df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalLinkage(unsigned &Linkage) { 176df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool HasLinkage; return ParseOptionalLinkage(Linkage, HasLinkage); 177df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 178df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalVisibility(unsigned &Visibility); 17965c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel bool ParseOptionalCallingConv(CallingConv::ID &CC); 180df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalAlignment(unsigned &Alignment); 1811e063d14df0f182626ebdd7ac7f32405aa754e03Charles Davis bool ParseOptionalStackAlignment(unsigned &Alignment); 182c3a6c5c83b5fa7b813de1741ac9e9be702b03846Chris Lattner bool ParseOptionalCommaAlign(unsigned &Alignment, bool &AteExtraComma); 183628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner bool ParseIndexList(SmallVectorImpl<unsigned> &Indices,bool &AteExtraComma); 184628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner bool ParseIndexList(SmallVectorImpl<unsigned> &Indices) { 185628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner bool AteExtraComma; 186628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner if (ParseIndexList(Indices, AteExtraComma)) return true; 187628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner if (AteExtraComma) 188628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner return TokError("expected index"); 189628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner return false; 190628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner } 1919ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 192df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Top-Level Entities 193df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseTopLevelEntities(); 194df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ValidateEndOfModule(); 195df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseTargetDefinition(); 196df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseDepLibs(); 197df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseModuleAsm(); 198df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseUnnamedType(); 199df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseNamedType(); 200df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseDeclare(); 201df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseDefine(); 2029ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 203df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseGlobalType(bool &IsConstant); 2043845e50edea58edd0f5e0f2b732e0106b53ba279Dan Gohman bool ParseUnnamedGlobal(); 205df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseNamedGlobal(); 206df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseGlobal(const std::string &Name, LocTy Loc, unsigned Linkage, 207df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool HasLinkage, unsigned Visibility); 208df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseAlias(const std::string &Name, LocTy Loc, unsigned Visibility); 209923078c65d5a37a4f135705300c9feea49487de5Devang Patel bool ParseStandaloneMetadata(); 210eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel bool ParseNamedMetadata(); 211442ffa1c5688f32b275f7657b5ee3646bfe8ffa3Chris Lattner bool ParseMDString(MDString *&Result); 2124a72efc0ad18c1b9c98bb2f0cb881a39a7010b53Chris Lattner bool ParseMDNodeID(MDNode *&Result); 213449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner bool ParseMDNodeID(MDNode *&Result, unsigned &SlotNo); 2149ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 215df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Type Parsing. 2161afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseType(Type *&Result, bool AllowVoid = false); 2171afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseType(Type *&Result, LocTy &Loc, bool AllowVoid = false) { 218df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Loc = Lex.getLoc(); 219a9a9e07d1c5d3c73835e716d81c2ec94ad0b865fChris Lattner return ParseType(Result, AllowVoid); 220df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 2211afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseAnonStructType(Type *&Result, bool Packed); 2221afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseStructBody(SmallVectorImpl<Type*> &Body); 2231afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseStructDefinition(SMLoc TypeLoc, StringRef Name, 2241afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner std::pair<Type*, LocTy> &Entry, 2251afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Type *&ResultTy); 2261afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 2271afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseArrayVectorType(Type *&Result, bool isVector); 2281afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseFunctionType(Type *&Result); 229df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 230df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Function Semantic Analysis. 231df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class PerFunctionState { 232df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner LLParser &P; 233df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Function &F; 234df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::map<std::string, std::pair<Value*, LocTy> > ForwardRefVals; 235df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::map<unsigned, std::pair<Value*, LocTy> > ForwardRefValIDs; 236df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::vector<Value*> NumberedVals; 23709d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 23809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// FunctionNumber - If this is an unnamed function, this is the slot 23909d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// number of it, otherwise it is -1. 24009d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner int FunctionNumber; 241df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner public: 24209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner PerFunctionState(LLParser &p, Function &f, int FunctionNumber); 243df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner ~PerFunctionState(); 2449ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 245df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Function &getFunction() const { return F; } 2469ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 24709d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner bool FinishFunction(); 2489ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 249df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// GetVal - Get a value with the specified name or ID, creating a 250df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// forward reference record if needed. This can return null if the value 251df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// exists but does not have the right type. 252db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Value *GetVal(const std::string &Name, Type *Ty, LocTy Loc); 253db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Value *GetVal(unsigned ID, Type *Ty, LocTy Loc); 2549ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 255df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// SetInstName - After an instruction is parsed and inserted into its 256df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// basic block, this installs its name. 257df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool SetInstName(int NameID, const std::string &NameStr, LocTy NameLoc, 258df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Instruction *Inst); 2599ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 260df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// GetBB - Get a basic block with the specified name or ID, creating a 261df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// forward reference record if needed. This can return null if the value 262df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// is not a BasicBlock. 263df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner BasicBlock *GetBB(const std::string &Name, LocTy Loc); 264df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner BasicBlock *GetBB(unsigned ID, LocTy Loc); 2659ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 266df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// DefineBB - Define the specified basic block, which is either named or 267df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// unnamed. If there is an error, this returns null otherwise it returns 268df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// the block being defined. 269df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner BasicBlock *DefineBB(const std::string &Name, LocTy Loc); 270df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner }; 2719ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 272db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner bool ConvertValIDToValue(Type *Ty, ValID &ID, Value *&V, 27392f238dd8fe19b26103bd451c571281d9b7ad324Victor Hernandez PerFunctionState *PFS); 2749ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 275db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner bool ParseValue(Type *Ty, Value *&V, PerFunctionState *PFS); 276db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner bool ParseValue(Type *Ty, Value *&V, PerFunctionState &PFS) { 2771afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return ParseValue(Ty, V, &PFS); 2781afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } 279db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner bool ParseValue(Type *Ty, Value *&V, LocTy &Loc, 280df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner PerFunctionState &PFS) { 281df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Loc = Lex.getLoc(); 2821afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return ParseValue(Ty, V, &PFS); 283df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 2849ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 2851afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseTypeAndValue(Value *&V, PerFunctionState *PFS); 2861afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseTypeAndValue(Value *&V, PerFunctionState &PFS) { 2871afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return ParseTypeAndValue(V, &PFS); 2881afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } 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); 313db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner bool ParseGlobalValue(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; 3241afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Type *Ty; 325df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner unsigned Attrs; 326df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::string Name; 3271afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ArgInfo(LocTy L, Type *ty, unsigned Attr, const std::string &N) 3281afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner : Loc(L), Ty(ty), Attrs(Attr), Name(N) {} 329df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner }; 3301afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseArgumentList(SmallVectorImpl<ArgInfo> &ArgList, bool &isVarArg); 331df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseFunctionHeader(Function *&Fn, bool isDefine); 332df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseFunctionBody(Function &Fn); 333df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseBasicBlock(PerFunctionState &PFS); 3349ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 335f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner // Instruction Parsing. Each instruction parsing routine can return with a 336f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner // normal result, an error result, or return having eaten an extra comma. 337f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner enum InstResult { InstNormal = 0, InstError = 1, InstExtraComma = 2 }; 338f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner int ParseInstruction(Instruction *&Inst, BasicBlock *BB, 339f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner PerFunctionState &PFS); 340df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseCmpPredicate(unsigned &Pred, unsigned Opc); 3419ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 342437544f25c1a6f6a00a2ed245c935088dbf9963dChris Lattner bool ParseRet(Instruction *&Inst, BasicBlock *BB, PerFunctionState &PFS); 343df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseBr(Instruction *&Inst, PerFunctionState &PFS); 344df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseSwitch(Instruction *&Inst, PerFunctionState &PFS); 345ab21db79ef1d2530880ad11f21f0b87ffca02dd4Chris Lattner bool ParseIndirectBr(Instruction *&Inst, PerFunctionState &PFS); 346df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseInvoke(Instruction *&Inst, PerFunctionState &PFS); 3479ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 348e914b59c008745204c49fcf0751f9cc4d91f44bbChris Lattner bool ParseArithmetic(Instruction *&I, PerFunctionState &PFS, unsigned Opc, 349e914b59c008745204c49fcf0751f9cc4d91f44bbChris Lattner unsigned OperandType); 350df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseLogical(Instruction *&I, PerFunctionState &PFS, unsigned Opc); 351df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseCompare(Instruction *&I, PerFunctionState &PFS, unsigned Opc); 352df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseCast(Instruction *&I, PerFunctionState &PFS, unsigned Opc); 353df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseSelect(Instruction *&I, PerFunctionState &PFS); 3540088a5cc722b9e32820d31c70175a7650ad4772dChris Lattner bool ParseVA_Arg(Instruction *&I, PerFunctionState &PFS); 355df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseExtractElement(Instruction *&I, PerFunctionState &PFS); 356df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseInsertElement(Instruction *&I, PerFunctionState &PFS); 357df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseShuffleVector(Instruction *&I, PerFunctionState &PFS); 358a7d7f2c0239ecc8513461ec69c8b922698ce5fe0Chris Lattner int ParsePHI(Instruction *&I, PerFunctionState &PFS); 359df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseCall(Instruction *&I, PerFunctionState &PFS, bool isTail); 360f3a789d931de6b5be729c33ff476fb20f0badbb1Chris Lattner int ParseAlloc(Instruction *&I, PerFunctionState &PFS); 361c3a6c5c83b5fa7b813de1741ac9e9be702b03846Chris Lattner int ParseLoad(Instruction *&I, PerFunctionState &PFS, bool isVolatile); 362c3a6c5c83b5fa7b813de1741ac9e9be702b03846Chris Lattner int ParseStore(Instruction *&I, PerFunctionState &PFS, bool isVolatile); 363a7d7f2c0239ecc8513461ec69c8b922698ce5fe0Chris Lattner int ParseGetElementPtr(Instruction *&I, PerFunctionState &PFS); 364a7d7f2c0239ecc8513461ec69c8b922698ce5fe0Chris Lattner int ParseExtractValue(Instruction *&I, PerFunctionState &PFS); 365a7d7f2c0239ecc8513461ec69c8b922698ce5fe0Chris Lattner int ParseInsertValue(Instruction *&I, PerFunctionState &PFS); 36609d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 36709d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner bool ResolveForwardRefBlockAddresses(Function *TheFn, 36809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner std::vector<std::pair<ValID, GlobalValue*> > &Refs, 36909d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner PerFunctionState *PFS); 370df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner }; 371df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner} // End llvm namespace 372df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 373df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#endif 374