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" 18164b86b4399559e45fab7846f1e3e09119cab4e2Kostya Serebryany#include "llvm/Attributes.h" 1947f3513dd574535aeb40c9eb11134f0899e92269Eli Friedman#include "llvm/Instructions.h" 20fba933c823a2862067e0696bd5032ab18185bd77Owen Anderson#include "llvm/Module.h" 21df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#include "llvm/Type.h" 22b45218f7c8c53ed77bc35563b2a300781be3cdd0Chris Lattner#include "llvm/ADT/DenseMap.h" 231afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner#include "llvm/ADT/StringMap.h" 245660846f15847e540066ae320a4adef7357d597dChris Lattner#include "llvm/Support/ValueHandle.h" 25e80250ec84e6e3aa916a66acc507241e7bde89c9Chris Lattner#include <map> 26df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 27df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnernamespace llvm { 28df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class Module; 29df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class OpaqueType; 30df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class Function; 31df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class Value; 32df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class BasicBlock; 33df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class Instruction; 34df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class Constant; 35df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class GlobalValue; 3621cc4460efa104e8591b05a90f20130291614344Nick Lewycky class MDString; 3721cc4460efa104e8591b05a90f20130291614344Nick Lewycky class MDNode; 381afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner class StructType; 399ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 4009d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// ValID - Represents a reference of a definition of some sort with no type. 4109d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// There are several cases where we have to parse the value but where the 4209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// type can depend on later context. This may either be a numeric reference 4309d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// or a symbolic (%var) reference. This is just a discriminated union. 4409d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner struct ValID { 4509d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner enum { 4609d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_LocalID, t_GlobalID, // ID in UIntVal. 4709d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_LocalName, t_GlobalName, // Name in StrVal. 4809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_APSInt, t_APFloat, // Value in APSIntVal/APFloatVal. 4909d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_Null, t_Undef, t_Zero, // No value. 5009d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_EmptyArray, // No value: [] 5109d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_Constant, // Value in ConstantVal. 5209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_InlineAsm, // Value in StrVal/StrVal2/UIntVal. 53287881d51086c4c5b38d109142f97442c9283374Chris Lattner t_MDNode, // Value in MDNodeVal. 541afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner t_MDString, // Value in MDStringVal. 551afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner t_ConstantStruct, // Value in ConstantStructElts. 561afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner t_PackedConstantStruct // Value in ConstantStructElts. 5709d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner } Kind; 5809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 5909d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner LLLexer::LocTy Loc; 6009d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner unsigned UIntVal; 6109d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner std::string StrVal, StrVal2; 6209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner APSInt APSIntVal; 6309d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner APFloat APFloatVal; 6409d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner Constant *ConstantVal; 65287881d51086c4c5b38d109142f97442c9283374Chris Lattner MDNode *MDNodeVal; 66287881d51086c4c5b38d109142f97442c9283374Chris Lattner MDString *MDStringVal; 671afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Constant **ConstantStructElts; 681afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 691afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ValID() : Kind(t_LocalID), APFloatVal(0.0) {} 701afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ~ValID() { 711afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (Kind == t_ConstantStruct || Kind == t_PackedConstantStruct) 721afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner delete [] ConstantStructElts; 731afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } 7409d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 7509d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner bool operator<(const ValID &RHS) const { 7609d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner if (Kind == t_LocalID || Kind == t_GlobalID) 7709d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner return UIntVal < RHS.UIntVal; 781afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner assert((Kind == t_LocalName || Kind == t_GlobalName || 791afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Kind == t_ConstantStruct || Kind == t_PackedConstantStruct) && 8009d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner "Ordering not defined for this ValID kind yet"); 8109d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner return StrVal < RHS.StrVal; 8209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner } 8309d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner }; 8409d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 85df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class LLParser { 86df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner public: 87df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner typedef LLLexer::LocTy LocTy; 88df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner private: 894ba9d9b67be87ce82f71023643b759ff12fdb411Chris Lattner LLVMContext &Context; 90df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner LLLexer Lex; 91df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Module *M; 92449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner 93449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner // Instruction metadata resolution. Each instruction can have a list of 94449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner // MDRef info associated with them. 9541d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // 9641d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // The simpler approach of just creating temporary MDNodes and then calling 9741d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // RAUW on them when the definition is processed doesn't work because some 9841d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // instruction metadata kinds, such as dbg, get stored in the IR in an 9941d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // "optimized" format which doesn't participate in the normal value use 10041d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // lists. This means that RAUW doesn't work, even on temporary MDNodes 10141d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // which otherwise support RAUW. Instead, we defer resolving MDNode 10241d6ab4b884120123e4f03bf284166f3af73deaaDan Gohman // references until the definitions have been processed. 103449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner struct MDRef { 104449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner SMLoc Loc; 105449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner unsigned MDKind, MDSlot; 106449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner }; 107449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner DenseMap<Instruction*, std::vector<MDRef> > ForwardRefInstMetadata; 1089ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 1091afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Type resolution handling data structures. The location is set when we 1101afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // have processed a use of the type but not a definition yet. 1111afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner StringMap<std::pair<Type*, LocTy> > NamedTypes; 1121afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner std::vector<std::pair<Type*, LocTy> > NumberedTypes; 1131afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 1140834e6a07b1965712781804b0113a8b282f40a5fChris Lattner std::vector<TrackingVH<MDNode> > NumberedMetadata; 115e80250ec84e6e3aa916a66acc507241e7bde89c9Chris Lattner std::map<unsigned, std::pair<TrackingVH<MDNode>, LocTy> > ForwardRefMDNodes; 116df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 117df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Global Value reference information. 118df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::map<std::string, std::pair<GlobalValue*, LocTy> > ForwardRefVals; 119df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::map<unsigned, std::pair<GlobalValue*, LocTy> > ForwardRefValIDs; 120df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::vector<GlobalValue*> NumberedVals; 12109d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 12209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner // References to blockaddress. The key is the function ValID, the value is 12309d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner // a list of references to blocks in that function. 12409d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner std::map<ValID, std::vector<std::pair<ValID, GlobalValue*> > > 12509d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner ForwardRefBlockAddresses; 12609d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 127df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner public: 128eeb4a84ac8d91fb1d5a7c484a1c7047409faee30Chris Lattner LLParser(MemoryBuffer *F, SourceMgr &SM, SMDiagnostic &Err, Module *m) : 12913ad5aaaff8a446758b402fd5e9aea22f5bc5682Victor Hernandez Context(m->getContext()), Lex(F, SM, Err, m->getContext()), 130f3a789d931de6b5be729c33ff476fb20f0badbb1Chris Lattner M(m) {} 131ad7d1e2085a489dbedc65b99bab811771ead1aabChris Lattner bool Run(); 1329ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 1331afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner LLVMContext &getContext() { return Context; } 134b43eae745eb9a7c46fe76b0ed8053b782ca67536Owen Anderson 135df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner private: 136df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 137d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer bool Error(LocTy L, const Twine &Msg) const { 138df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return Lex.Error(L, Msg); 139df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 140d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer bool TokError(const Twine &Msg) const { 141df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return Error(Lex.getLoc(), Msg); 142df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 1439ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 144df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// GetGlobalVal - Get a value with the specified name or ID, creating a 145df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// forward reference record if needed. This can return null if the value 146df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// exists but does not have the right type. 147db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner GlobalValue *GetGlobalVal(const std::string &N, Type *Ty, LocTy Loc); 148db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner GlobalValue *GetGlobalVal(unsigned ID, Type *Ty, LocTy Loc); 1499ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 150df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Helper Routines. 151df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseToken(lltok::Kind T, const char *ErrMsg); 1523ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner bool EatIfPresent(lltok::Kind T) { 1533ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner if (Lex.getKind() != T) return false; 1543ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner Lex.Lex(); 1553ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner return true; 1563ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner } 157d72479c2f061e3b57adf3d054875665f25a30d90Rafael Espindola bool ParseOptionalToken(lltok::Kind T, bool &Present, LocTy *Loc = 0) { 158df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner if (Lex.getKind() != T) { 159df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Present = false; 160df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } else { 161d72479c2f061e3b57adf3d054875665f25a30d90Rafael Espindola if (Loc) 162d72479c2f061e3b57adf3d054875665f25a30d90Rafael Espindola *Loc = Lex.getLoc(); 163df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Lex.Lex(); 164df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Present = true; 165df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 166df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return false; 167df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 1683ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner bool ParseStringConstant(std::string &Result); 1693ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner bool ParseUInt32(unsigned &Val); 1703ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner bool ParseUInt32(unsigned &Val, LocTy &Loc) { 171df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Loc = Lex.getLoc(); 1723ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner return ParseUInt32(Val); 173df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 174df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalAddrSpace(unsigned &AddrSpace); 175164b86b4399559e45fab7846f1e3e09119cab4e2Kostya Serebryany bool ParseOptionalAttrs(Attributes &Attrs, unsigned AttrKind); 176df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalLinkage(unsigned &Linkage, bool &HasLinkage); 177df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalLinkage(unsigned &Linkage) { 178df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool HasLinkage; return ParseOptionalLinkage(Linkage, HasLinkage); 179df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 180df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalVisibility(unsigned &Visibility); 18165c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel bool ParseOptionalCallingConv(CallingConv::ID &CC); 182df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalAlignment(unsigned &Alignment); 18347f3513dd574535aeb40c9eb11134f0899e92269Eli Friedman bool ParseScopeAndOrdering(bool isAtomic, SynchronizationScope &Scope, 18447f3513dd574535aeb40c9eb11134f0899e92269Eli Friedman AtomicOrdering &Ordering); 1851e063d14df0f182626ebdd7ac7f32405aa754e03Charles Davis bool ParseOptionalStackAlignment(unsigned &Alignment); 186c3a6c5c83b5fa7b813de1741ac9e9be702b03846Chris Lattner bool ParseOptionalCommaAlign(unsigned &Alignment, bool &AteExtraComma); 187628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner bool ParseIndexList(SmallVectorImpl<unsigned> &Indices,bool &AteExtraComma); 188628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner bool ParseIndexList(SmallVectorImpl<unsigned> &Indices) { 189628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner bool AteExtraComma; 190628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner if (ParseIndexList(Indices, AteExtraComma)) return true; 191628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner if (AteExtraComma) 192628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner return TokError("expected index"); 193628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner return false; 194628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner } 1959ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 196df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Top-Level Entities 197df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseTopLevelEntities(); 198df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ValidateEndOfModule(); 199df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseTargetDefinition(); 200df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseDepLibs(); 201df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseModuleAsm(); 202df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseUnnamedType(); 203df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseNamedType(); 204df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseDeclare(); 205df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseDefine(); 2069ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 207df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseGlobalType(bool &IsConstant); 2083845e50edea58edd0f5e0f2b732e0106b53ba279Dan Gohman bool ParseUnnamedGlobal(); 209df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseNamedGlobal(); 210df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseGlobal(const std::string &Name, LocTy Loc, unsigned Linkage, 211df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool HasLinkage, unsigned Visibility); 212df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseAlias(const std::string &Name, LocTy Loc, unsigned Visibility); 213923078c65d5a37a4f135705300c9feea49487de5Devang Patel bool ParseStandaloneMetadata(); 214eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel bool ParseNamedMetadata(); 215442ffa1c5688f32b275f7657b5ee3646bfe8ffa3Chris Lattner bool ParseMDString(MDString *&Result); 2164a72efc0ad18c1b9c98bb2f0cb881a39a7010b53Chris Lattner bool ParseMDNodeID(MDNode *&Result); 217449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner bool ParseMDNodeID(MDNode *&Result, unsigned &SlotNo); 2189ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 219df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Type Parsing. 2201afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseType(Type *&Result, bool AllowVoid = false); 2211afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseType(Type *&Result, LocTy &Loc, bool AllowVoid = false) { 222df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Loc = Lex.getLoc(); 223a9a9e07d1c5d3c73835e716d81c2ec94ad0b865fChris Lattner return ParseType(Result, AllowVoid); 224df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 2251afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseAnonStructType(Type *&Result, bool Packed); 2261afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseStructBody(SmallVectorImpl<Type*> &Body); 2271afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseStructDefinition(SMLoc TypeLoc, StringRef Name, 2281afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner std::pair<Type*, LocTy> &Entry, 2291afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Type *&ResultTy); 2301afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 2311afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseArrayVectorType(Type *&Result, bool isVector); 2321afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseFunctionType(Type *&Result); 233df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 234df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Function Semantic Analysis. 235df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class PerFunctionState { 236df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner LLParser &P; 237df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Function &F; 238df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::map<std::string, std::pair<Value*, LocTy> > ForwardRefVals; 239df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::map<unsigned, std::pair<Value*, LocTy> > ForwardRefValIDs; 240df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::vector<Value*> NumberedVals; 24109d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 24209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// FunctionNumber - If this is an unnamed function, this is the slot 24309d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// number of it, otherwise it is -1. 24409d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner int FunctionNumber; 245df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner public: 24609d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner PerFunctionState(LLParser &p, Function &f, int FunctionNumber); 247df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner ~PerFunctionState(); 2489ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 249df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Function &getFunction() const { return F; } 2509ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 25109d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner bool FinishFunction(); 2529ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 253df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// GetVal - Get a value with the specified name or ID, creating a 254df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// forward reference record if needed. This can return null if the value 255df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// exists but does not have the right type. 256db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Value *GetVal(const std::string &Name, Type *Ty, LocTy Loc); 257db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Value *GetVal(unsigned ID, Type *Ty, LocTy Loc); 2589ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 259df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// SetInstName - After an instruction is parsed and inserted into its 260df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// basic block, this installs its name. 261df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool SetInstName(int NameID, const std::string &NameStr, LocTy NameLoc, 262df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Instruction *Inst); 2639ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 264df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// GetBB - Get a basic block with the specified name or ID, creating a 265df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// forward reference record if needed. This can return null if the value 266df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// is not a BasicBlock. 267df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner BasicBlock *GetBB(const std::string &Name, LocTy Loc); 268df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner BasicBlock *GetBB(unsigned ID, LocTy Loc); 2699ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 270df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// DefineBB - Define the specified basic block, which is either named or 271df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// unnamed. If there is an error, this returns null otherwise it returns 272df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// the block being defined. 273df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner BasicBlock *DefineBB(const std::string &Name, LocTy Loc); 274df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner }; 2759ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 276db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner bool ConvertValIDToValue(Type *Ty, ValID &ID, Value *&V, 27792f238dd8fe19b26103bd451c571281d9b7ad324Victor Hernandez PerFunctionState *PFS); 2789ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 279db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner bool ParseValue(Type *Ty, Value *&V, PerFunctionState *PFS); 280db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner bool ParseValue(Type *Ty, Value *&V, PerFunctionState &PFS) { 2811afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return ParseValue(Ty, V, &PFS); 2821afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } 283db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner bool ParseValue(Type *Ty, Value *&V, LocTy &Loc, 284df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner PerFunctionState &PFS) { 285df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Loc = Lex.getLoc(); 2861afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return ParseValue(Ty, V, &PFS); 287df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 2889ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 2891afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseTypeAndValue(Value *&V, PerFunctionState *PFS); 2901afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseTypeAndValue(Value *&V, PerFunctionState &PFS) { 2911afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return ParseTypeAndValue(V, &PFS); 2921afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } 293df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseTypeAndValue(Value *&V, LocTy &Loc, PerFunctionState &PFS) { 294df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Loc = Lex.getLoc(); 295df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return ParseTypeAndValue(V, PFS); 296df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 297f9be95f867745b6754b2402b9b72f9eaeabd637fChris Lattner bool ParseTypeAndBasicBlock(BasicBlock *&BB, LocTy &Loc, 298f9be95f867745b6754b2402b9b72f9eaeabd637fChris Lattner PerFunctionState &PFS); 299f9be95f867745b6754b2402b9b72f9eaeabd637fChris Lattner bool ParseTypeAndBasicBlock(BasicBlock *&BB, PerFunctionState &PFS) { 300f9be95f867745b6754b2402b9b72f9eaeabd637fChris Lattner LocTy Loc; 301f9be95f867745b6754b2402b9b72f9eaeabd637fChris Lattner return ParseTypeAndBasicBlock(BB, Loc, PFS); 302f9be95f867745b6754b2402b9b72f9eaeabd637fChris Lattner } 3031971556cc271710b683bc3ca8327c903791c910fVictor Hernandez 304fdfeb6976f07ad10d809b922ed7376ba2a3539beChris Lattner 305df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner struct ParamInfo { 306df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner LocTy Loc; 307df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Value *V; 308164b86b4399559e45fab7846f1e3e09119cab4e2Kostya Serebryany Attributes Attrs; 309164b86b4399559e45fab7846f1e3e09119cab4e2Kostya Serebryany ParamInfo(LocTy loc, Value *v, Attributes attrs) 310df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner : Loc(loc), V(v), Attrs(attrs) {} 311df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner }; 312df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseParameterList(SmallVectorImpl<ParamInfo> &ArgList, 313df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner PerFunctionState &PFS); 3149ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 315bf170d4c2ffd9dc99fad1fabfbf1f90f980a9782Victor Hernandez // Constant Parsing. 316bf170d4c2ffd9dc99fad1fabfbf1f90f980a9782Victor Hernandez bool ParseValID(ValID &ID, PerFunctionState *PFS = NULL); 317db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner bool ParseGlobalValue(Type *Ty, Constant *&V); 318bf170d4c2ffd9dc99fad1fabfbf1f90f980a9782Victor Hernandez bool ParseGlobalTypeAndValue(Constant *&V); 319bf170d4c2ffd9dc99fad1fabfbf1f90f980a9782Victor Hernandez bool ParseGlobalValueVector(SmallVectorImpl<Constant*> &Elts); 320309b3af547a60bedd74daa2a94ebd3d3ed5f06e9Dan Gohman bool ParseMetadataListValue(ValID &ID, PerFunctionState *PFS); 321834480374ba38b2a31d6b63b492e442d75a462cfDan Gohman bool ParseMetadataValue(ValID &ID, PerFunctionState *PFS); 32224e64df7ec25b55aa872c2ef33728dfbb8c353c4Victor Hernandez bool ParseMDNodeVector(SmallVectorImpl<Value*> &, PerFunctionState *PFS); 3239d072f51ebf61edda9c31f831c2642d110170d13Dan Gohman bool ParseInstructionMetadata(Instruction *Inst, PerFunctionState *PFS); 324bf170d4c2ffd9dc99fad1fabfbf1f90f980a9782Victor Hernandez 325df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Function Parsing. 326df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner struct ArgInfo { 327df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner LocTy Loc; 3281afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Type *Ty; 329164b86b4399559e45fab7846f1e3e09119cab4e2Kostya Serebryany Attributes Attrs; 330df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::string Name; 331164b86b4399559e45fab7846f1e3e09119cab4e2Kostya Serebryany ArgInfo(LocTy L, Type *ty, Attributes Attr, const std::string &N) 3321afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner : Loc(L), Ty(ty), Attrs(Attr), Name(N) {} 333df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner }; 3341afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool ParseArgumentList(SmallVectorImpl<ArgInfo> &ArgList, bool &isVarArg); 335df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseFunctionHeader(Function *&Fn, bool isDefine); 336df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseFunctionBody(Function &Fn); 337df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseBasicBlock(PerFunctionState &PFS); 3389ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 339f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner // Instruction Parsing. Each instruction parsing routine can return with a 340f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner // normal result, an error result, or return having eaten an extra comma. 341f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner enum InstResult { InstNormal = 0, InstError = 1, InstExtraComma = 2 }; 342f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner int ParseInstruction(Instruction *&Inst, BasicBlock *BB, 343f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner PerFunctionState &PFS); 344df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseCmpPredicate(unsigned &Pred, unsigned Opc); 3459ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 346437544f25c1a6f6a00a2ed245c935088dbf9963dChris Lattner bool ParseRet(Instruction *&Inst, BasicBlock *BB, PerFunctionState &PFS); 347df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseBr(Instruction *&Inst, PerFunctionState &PFS); 348df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseSwitch(Instruction *&Inst, PerFunctionState &PFS); 349ab21db79ef1d2530880ad11f21f0b87ffca02dd4Chris Lattner bool ParseIndirectBr(Instruction *&Inst, PerFunctionState &PFS); 350df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseInvoke(Instruction *&Inst, PerFunctionState &PFS); 351dccc03b2423fe65efb5963ae816b99c24fc53374Bill Wendling bool ParseResume(Instruction *&Inst, PerFunctionState &PFS); 3529ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 353e914b59c008745204c49fcf0751f9cc4d91f44bbChris Lattner bool ParseArithmetic(Instruction *&I, PerFunctionState &PFS, unsigned Opc, 354e914b59c008745204c49fcf0751f9cc4d91f44bbChris Lattner unsigned OperandType); 355df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseLogical(Instruction *&I, PerFunctionState &PFS, unsigned Opc); 356df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseCompare(Instruction *&I, PerFunctionState &PFS, unsigned Opc); 357df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseCast(Instruction *&I, PerFunctionState &PFS, unsigned Opc); 358df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseSelect(Instruction *&I, PerFunctionState &PFS); 3590088a5cc722b9e32820d31c70175a7650ad4772dChris Lattner bool ParseVA_Arg(Instruction *&I, PerFunctionState &PFS); 360df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseExtractElement(Instruction *&I, PerFunctionState &PFS); 361df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseInsertElement(Instruction *&I, PerFunctionState &PFS); 362df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseShuffleVector(Instruction *&I, PerFunctionState &PFS); 363a7d7f2c0239ecc8513461ec69c8b922698ce5fe0Chris Lattner int ParsePHI(Instruction *&I, PerFunctionState &PFS); 364e6e8826870bee3facb04f950f0bd725f8a88623dBill Wendling bool ParseLandingPad(Instruction *&I, PerFunctionState &PFS); 365df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseCall(Instruction *&I, PerFunctionState &PFS, bool isTail); 366f3a789d931de6b5be729c33ff476fb20f0badbb1Chris Lattner int ParseAlloc(Instruction *&I, PerFunctionState &PFS); 367fbe910e7f432682457a7b3b9319f618dd66ddcd4Chris Lattner int ParseLoad(Instruction *&I, PerFunctionState &PFS); 368fbe910e7f432682457a7b3b9319f618dd66ddcd4Chris Lattner int ParseStore(Instruction *&I, PerFunctionState &PFS); 369f03bb260c90ad013aa4e55af36382875011c95b8Eli Friedman int ParseCmpXchg(Instruction *&I, PerFunctionState &PFS); 370f03bb260c90ad013aa4e55af36382875011c95b8Eli Friedman int ParseAtomicRMW(Instruction *&I, PerFunctionState &PFS); 37147f3513dd574535aeb40c9eb11134f0899e92269Eli Friedman int ParseFence(Instruction *&I, PerFunctionState &PFS); 372a7d7f2c0239ecc8513461ec69c8b922698ce5fe0Chris Lattner int ParseGetElementPtr(Instruction *&I, PerFunctionState &PFS); 373a7d7f2c0239ecc8513461ec69c8b922698ce5fe0Chris Lattner int ParseExtractValue(Instruction *&I, PerFunctionState &PFS); 374a7d7f2c0239ecc8513461ec69c8b922698ce5fe0Chris Lattner int ParseInsertValue(Instruction *&I, PerFunctionState &PFS); 37509d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 37609d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner bool ResolveForwardRefBlockAddresses(Function *TheFn, 37709d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner std::vector<std::pair<ValID, GlobalValue*> > &Refs, 37809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner PerFunctionState *PFS); 379df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner }; 380df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner} // End llvm namespace 381df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 382df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#endif 383