LLParser.h revision b45218f7c8c53ed77bc35563b2a300781be3cdd0
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; 35fdfeb6976f07ad10d809b922ed7376ba2a3539beChris Lattner class UnionType; 369ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 3709d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// ValID - Represents a reference of a definition of some sort with no type. 3809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// There are several cases where we have to parse the value but where the 3909d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// type can depend on later context. This may either be a numeric reference 4009d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner /// or a symbolic (%var) reference. This is just a discriminated union. 4109d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner struct ValID { 4209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner enum { 4309d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_LocalID, t_GlobalID, // ID in UIntVal. 4409d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_LocalName, t_GlobalName, // Name in StrVal. 4509d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_APSInt, t_APFloat, // Value in APSIntVal/APFloatVal. 4609d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_Null, t_Undef, t_Zero, // No value. 4709d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_EmptyArray, // No value: [] 4809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_Constant, // Value in ConstantVal. 4909d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner t_InlineAsm, // Value in StrVal/StrVal2/UIntVal. 50287881d51086c4c5b38d109142f97442c9283374Chris Lattner t_MDNode, // Value in MDNodeVal. 51287881d51086c4c5b38d109142f97442c9283374Chris Lattner t_MDString // Value in MDStringVal. 5209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner } Kind; 5309d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 5409d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner LLLexer::LocTy Loc; 5509d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner unsigned UIntVal; 5609d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner std::string StrVal, StrVal2; 5709d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner APSInt APSIntVal; 5809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner APFloat APFloatVal; 5909d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner Constant *ConstantVal; 60287881d51086c4c5b38d109142f97442c9283374Chris Lattner MDNode *MDNodeVal; 61287881d51086c4c5b38d109142f97442c9283374Chris Lattner MDString *MDStringVal; 6209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner ValID() : APFloatVal(0.0) {} 6309d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 6409d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner bool operator<(const ValID &RHS) const { 6509d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner if (Kind == t_LocalID || Kind == t_GlobalID) 6609d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner return UIntVal < RHS.UIntVal; 6709d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner assert((Kind == t_LocalName || Kind == t_GlobalName) && 6809d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner "Ordering not defined for this ValID kind yet"); 6909d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner return StrVal < RHS.StrVal; 7009d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner } 7109d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner }; 7209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 73df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner class LLParser { 74df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner public: 75df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner typedef LLLexer::LocTy LocTy; 76df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner private: 77fba933c823a2862067e0696bd5032ab18185bd77Owen Anderson LLVMContext& Context; 78df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner LLLexer Lex; 79df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Module *M; 80449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner 81449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner // Instruction metadata resolution. Each instruction can have a list of 82449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner // MDRef info associated with them. 83449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner struct MDRef { 84449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner SMLoc Loc; 85449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner unsigned MDKind, MDSlot; 86449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner }; 87449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner DenseMap<Instruction*, std::vector<MDRef> > ForwardRefInstMetadata; 889ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 89df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Type resolution handling data structures. 90df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::map<std::string, std::pair<PATypeHolder, LocTy> > ForwardRefTypes; 91df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::map<unsigned, std::pair<PATypeHolder, LocTy> > ForwardRefTypeIDs; 92df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::vector<PATypeHolder> NumberedTypes; 930834e6a07b1965712781804b0113a8b282f40a5fChris Lattner std::vector<TrackingVH<MDNode> > NumberedMetadata; 94e80250ec84e6e3aa916a66acc507241e7bde89c9Chris Lattner std::map<unsigned, std::pair<TrackingVH<MDNode>, LocTy> > ForwardRefMDNodes; 95df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner struct UpRefRecord { 96df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// Loc - This is the location of the upref. 97df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner LocTy Loc; 989ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 99df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// NestingLevel - The number of nesting levels that need to be popped 100df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// before this type is resolved. 101df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner unsigned NestingLevel; 1029ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 103df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// LastContainedTy - This is the type at the current binding level for 104df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// the type. Every time we reduce the nesting level, this gets updated. 105df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner const Type *LastContainedTy; 1069ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 107df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// UpRefTy - This is the actual opaque type that the upreference is 108df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// represented with. 109df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner OpaqueType *UpRefTy; 1109ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 111df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner UpRefRecord(LocTy L, unsigned NL, OpaqueType *URTy) 112df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner : Loc(L), NestingLevel(NL), LastContainedTy((Type*)URTy), 113df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner UpRefTy(URTy) {} 114df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner }; 115df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::vector<UpRefRecord> UpRefs; 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 12709d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner Function *MallocF; 128df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner public: 129eeb4a84ac8d91fb1d5a7c484a1c7047409faee30Chris Lattner LLParser(MemoryBuffer *F, SourceMgr &SM, SMDiagnostic &Err, Module *m) : 13013ad5aaaff8a446758b402fd5e9aea22f5bc5682Victor Hernandez Context(m->getContext()), Lex(F, SM, Err, m->getContext()), 13113ad5aaaff8a446758b402fd5e9aea22f5bc5682Victor Hernandez M(m), MallocF(NULL) {} 132ad7d1e2085a489dbedc65b99bab811771ead1aabChris Lattner bool Run(); 1339ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 134b43eae745eb9a7c46fe76b0ed8053b782ca67536Owen Anderson LLVMContext& getContext() { return Context; } 135b43eae745eb9a7c46fe76b0ed8053b782ca67536Owen Anderson 136df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner private: 137df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 138df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool Error(LocTy L, const std::string &Msg) const { 139df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return Lex.Error(L, Msg); 140df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 141df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool TokError(const std::string &Msg) const { 142df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return Error(Lex.getLoc(), Msg); 143df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 1449ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 145df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// GetGlobalVal - Get a value with the specified name or ID, creating a 146df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// forward reference record if needed. This can return null if the value 147df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner /// exists but does not have the right type. 148df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner GlobalValue *GetGlobalVal(const std::string &N, const Type *Ty, LocTy Loc); 149df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner GlobalValue *GetGlobalVal(unsigned ID, const Type *Ty, LocTy Loc); 1509ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 151df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Helper Routines. 152df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseToken(lltok::Kind T, const char *ErrMsg); 1533ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner bool EatIfPresent(lltok::Kind T) { 1543ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner if (Lex.getKind() != T) return false; 1553ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner Lex.Lex(); 1563ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner return true; 1573ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner } 158df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalToken(lltok::Kind T, bool &Present) { 159df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner if (Lex.getKind() != T) { 160df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Present = false; 161df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } else { 162df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Lex.Lex(); 163df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Present = true; 164df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 165df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return false; 166df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 1673ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner bool ParseStringConstant(std::string &Result); 1683ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner bool ParseUInt32(unsigned &Val); 1693ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner bool ParseUInt32(unsigned &Val, LocTy &Loc) { 170df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Loc = Lex.getLoc(); 1713ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner return ParseUInt32(Val); 172df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 173df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalAddrSpace(unsigned &AddrSpace); 174df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalAttrs(unsigned &Attrs, unsigned AttrKind); 175df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalLinkage(unsigned &Linkage, bool &HasLinkage); 176df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalLinkage(unsigned &Linkage) { 177df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool HasLinkage; return ParseOptionalLinkage(Linkage, HasLinkage); 178df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 179df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalVisibility(unsigned &Visibility); 18065c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel bool ParseOptionalCallingConv(CallingConv::ID &CC); 181df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseOptionalAlignment(unsigned &Alignment); 1821e063d14df0f182626ebdd7ac7f32405aa754e03Charles Davis bool ParseOptionalStackAlignment(unsigned &Alignment); 183fe805249f724629f1e90be81937274ea0ba78992Chris Lattner bool ParseInstructionMetadata(Instruction *Inst); 184c3a6c5c83b5fa7b813de1741ac9e9be702b03846Chris Lattner bool ParseOptionalCommaAlign(unsigned &Alignment, bool &AteExtraComma); 185628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner bool ParseIndexList(SmallVectorImpl<unsigned> &Indices,bool &AteExtraComma); 186628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner bool ParseIndexList(SmallVectorImpl<unsigned> &Indices) { 187628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner bool AteExtraComma; 188628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner if (ParseIndexList(Indices, AteExtraComma)) return true; 189628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner if (AteExtraComma) 190628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner return TokError("expected index"); 191628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner return false; 192628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8Chris Lattner } 1939ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 194df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Top-Level Entities 195df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseTopLevelEntities(); 196df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ValidateEndOfModule(); 197df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseTargetDefinition(); 198df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseDepLibs(); 199df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseModuleAsm(); 200df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseUnnamedType(); 201df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseNamedType(); 202df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseDeclare(); 203df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseDefine(); 2049ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 205df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseGlobalType(bool &IsConstant); 2063845e50edea58edd0f5e0f2b732e0106b53ba279Dan Gohman bool ParseUnnamedGlobal(); 207df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseNamedGlobal(); 208df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseGlobal(const std::string &Name, LocTy Loc, unsigned Linkage, 209df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool HasLinkage, unsigned Visibility); 210df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseAlias(const std::string &Name, LocTy Loc, unsigned Visibility); 211923078c65d5a37a4f135705300c9feea49487de5Devang Patel bool ParseStandaloneMetadata(); 212eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel bool ParseNamedMetadata(); 213442ffa1c5688f32b275f7657b5ee3646bfe8ffa3Chris Lattner bool ParseMDString(MDString *&Result); 2144a72efc0ad18c1b9c98bb2f0cb881a39a7010b53Chris Lattner bool ParseMDNodeID(MDNode *&Result); 215449c3103c5d8a3105ac1a46187ac1c7e1bdc0ba2Chris Lattner bool ParseMDNodeID(MDNode *&Result, unsigned &SlotNo); 2169ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 217df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Type Parsing. 218a9a9e07d1c5d3c73835e716d81c2ec94ad0b865fChris Lattner bool ParseType(PATypeHolder &Result, bool AllowVoid = false); 219a9a9e07d1c5d3c73835e716d81c2ec94ad0b865fChris Lattner bool ParseType(PATypeHolder &Result, LocTy &Loc, bool AllowVoid = false) { 220df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Loc = Lex.getLoc(); 221a9a9e07d1c5d3c73835e716d81c2ec94ad0b865fChris Lattner return ParseType(Result, AllowVoid); 222df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 223df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseTypeRec(PATypeHolder &H); 224df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseStructType(PATypeHolder &H, bool Packed); 225fdfeb6976f07ad10d809b922ed7376ba2a3539beChris Lattner bool ParseUnionType(PATypeHolder &H); 226df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseArrayVectorType(PATypeHolder &H, bool isVector); 227df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseFunctionType(PATypeHolder &Result); 228df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner PATypeHolder HandleUpRefs(const Type *Ty); 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. 252df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Value *GetVal(const std::string &Name, const Type *Ty, LocTy Loc); 253df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Value *GetVal(unsigned ID, const 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 272df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ConvertValIDToValue(const Type *Ty, ValID &ID, Value *&V, 27392f238dd8fe19b26103bd451c571281d9b7ad324Victor Hernandez PerFunctionState *PFS); 2749ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 275df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseValue(const Type *Ty, Value *&V, PerFunctionState &PFS); 276df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseValue(const Type *Ty, Value *&V, LocTy &Loc, 277df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner PerFunctionState &PFS) { 278df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Loc = Lex.getLoc(); 279df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return ParseValue(Ty, V, PFS); 280df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 2819ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 282df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseTypeAndValue(Value *&V, PerFunctionState &PFS); 283df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseTypeAndValue(Value *&V, LocTy &Loc, PerFunctionState &PFS) { 284df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Loc = Lex.getLoc(); 285df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return ParseTypeAndValue(V, PFS); 286df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 287f9be95f867745b6754b2402b9b72f9eaeabd637fChris Lattner bool ParseTypeAndBasicBlock(BasicBlock *&BB, LocTy &Loc, 288f9be95f867745b6754b2402b9b72f9eaeabd637fChris Lattner PerFunctionState &PFS); 289f9be95f867745b6754b2402b9b72f9eaeabd637fChris Lattner bool ParseTypeAndBasicBlock(BasicBlock *&BB, PerFunctionState &PFS) { 290f9be95f867745b6754b2402b9b72f9eaeabd637fChris Lattner LocTy Loc; 291f9be95f867745b6754b2402b9b72f9eaeabd637fChris Lattner return ParseTypeAndBasicBlock(BB, Loc, PFS); 292f9be95f867745b6754b2402b9b72f9eaeabd637fChris Lattner } 2931971556cc271710b683bc3ca8327c903791c910fVictor Hernandez 294fdfeb6976f07ad10d809b922ed7376ba2a3539beChris Lattner bool ParseUnionValue(const UnionType* utype, ValID &ID, Value *&V); 295fdfeb6976f07ad10d809b922ed7376ba2a3539beChris Lattner 296df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner struct ParamInfo { 297df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner LocTy Loc; 298df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner Value *V; 299df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner unsigned Attrs; 3009ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman ParamInfo(LocTy loc, Value *v, unsigned attrs) 301df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner : Loc(loc), V(v), Attrs(attrs) {} 302df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner }; 303df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseParameterList(SmallVectorImpl<ParamInfo> &ArgList, 304df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner PerFunctionState &PFS); 3059ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 306bf170d4c2ffd9dc99fad1fabfbf1f90f980a9782Victor Hernandez // Constant Parsing. 307bf170d4c2ffd9dc99fad1fabfbf1f90f980a9782Victor Hernandez bool ParseValID(ValID &ID, PerFunctionState *PFS = NULL); 308bf170d4c2ffd9dc99fad1fabfbf1f90f980a9782Victor Hernandez bool ParseGlobalValue(const Type *Ty, Constant *&V); 309bf170d4c2ffd9dc99fad1fabfbf1f90f980a9782Victor Hernandez bool ParseGlobalTypeAndValue(Constant *&V); 310bf170d4c2ffd9dc99fad1fabfbf1f90f980a9782Victor Hernandez bool ParseGlobalValueVector(SmallVectorImpl<Constant*> &Elts); 31124e64df7ec25b55aa872c2ef33728dfbb8c353c4Victor Hernandez bool ParseMDNodeVector(SmallVectorImpl<Value*> &, PerFunctionState *PFS); 312bf170d4c2ffd9dc99fad1fabfbf1f90f980a9782Victor Hernandez 313df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Function Parsing. 314df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner struct ArgInfo { 315df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner LocTy Loc; 316df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner PATypeHolder Type; 317df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner unsigned Attrs; 318df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner std::string Name; 319df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner ArgInfo(LocTy L, PATypeHolder Ty, unsigned Attr, const std::string &N) 320df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner : Loc(L), Type(Ty), Attrs(Attr), Name(N) {} 321df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner }; 322df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseArgumentList(std::vector<ArgInfo> &ArgList, 323dfd19ddcfa7568d2118fbc3c6da612295200c31cChris Lattner bool &isVarArg, bool inType); 324df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseFunctionHeader(Function *&Fn, bool isDefine); 325df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseFunctionBody(Function &Fn); 326df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseBasicBlock(PerFunctionState &PFS); 3279ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 328f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner // Instruction Parsing. Each instruction parsing routine can return with a 329f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner // normal result, an error result, or return having eaten an extra comma. 330f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner enum InstResult { InstNormal = 0, InstError = 1, InstExtraComma = 2 }; 331f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner int ParseInstruction(Instruction *&Inst, BasicBlock *BB, 332f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner PerFunctionState &PFS); 333df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseCmpPredicate(unsigned &Pred, unsigned Opc); 3349ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 335f1bc7ce7b362d2859349c7a1e2bc6df493d0f809Chris Lattner int ParseRet(Instruction *&Inst, BasicBlock *BB, PerFunctionState &PFS); 336df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseBr(Instruction *&Inst, PerFunctionState &PFS); 337df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseSwitch(Instruction *&Inst, PerFunctionState &PFS); 338ab21db79ef1d2530880ad11f21f0b87ffca02dd4Chris Lattner bool ParseIndirectBr(Instruction *&Inst, PerFunctionState &PFS); 339df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseInvoke(Instruction *&Inst, PerFunctionState &PFS); 3409ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman 341e914b59c008745204c49fcf0751f9cc4d91f44bbChris Lattner bool ParseArithmetic(Instruction *&I, PerFunctionState &PFS, unsigned Opc, 342e914b59c008745204c49fcf0751f9cc4d91f44bbChris Lattner unsigned OperandType); 343df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseLogical(Instruction *&I, PerFunctionState &PFS, unsigned Opc); 344df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseCompare(Instruction *&I, PerFunctionState &PFS, unsigned Opc); 345df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseCast(Instruction *&I, PerFunctionState &PFS, unsigned Opc); 346df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseSelect(Instruction *&I, PerFunctionState &PFS); 3470088a5cc722b9e32820d31c70175a7650ad4772dChris Lattner bool ParseVA_Arg(Instruction *&I, PerFunctionState &PFS); 348df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseExtractElement(Instruction *&I, PerFunctionState &PFS); 349df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseInsertElement(Instruction *&I, PerFunctionState &PFS); 350df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseShuffleVector(Instruction *&I, PerFunctionState &PFS); 351a7d7f2c0239ecc8513461ec69c8b922698ce5fe0Chris Lattner int ParsePHI(Instruction *&I, PerFunctionState &PFS); 352df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseCall(Instruction *&I, PerFunctionState &PFS, bool isTail); 353c3a6c5c83b5fa7b813de1741ac9e9be702b03846Chris Lattner int ParseAlloc(Instruction *&I, PerFunctionState &PFS, 35413ad5aaaff8a446758b402fd5e9aea22f5bc5682Victor Hernandez BasicBlock *BB = 0, bool isAlloca = true); 35566284e063a1e46500acae48bdc0e4a00652021d1Victor Hernandez bool ParseFree(Instruction *&I, PerFunctionState &PFS, BasicBlock *BB); 356c3a6c5c83b5fa7b813de1741ac9e9be702b03846Chris Lattner int ParseLoad(Instruction *&I, PerFunctionState &PFS, bool isVolatile); 357c3a6c5c83b5fa7b813de1741ac9e9be702b03846Chris Lattner int ParseStore(Instruction *&I, PerFunctionState &PFS, bool isVolatile); 358df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner bool ParseGetResult(Instruction *&I, PerFunctionState &PFS); 359a7d7f2c0239ecc8513461ec69c8b922698ce5fe0Chris Lattner int ParseGetElementPtr(Instruction *&I, PerFunctionState &PFS); 360a7d7f2c0239ecc8513461ec69c8b922698ce5fe0Chris Lattner int ParseExtractValue(Instruction *&I, PerFunctionState &PFS); 361a7d7f2c0239ecc8513461ec69c8b922698ce5fe0Chris Lattner int ParseInsertValue(Instruction *&I, PerFunctionState &PFS); 36209d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner 36309d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner bool ResolveForwardRefBlockAddresses(Function *TheFn, 36409d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner std::vector<std::pair<ValID, GlobalValue*> > &Refs, 36509d9ef4122414a1a2ec95f52d660d6500f2819d0Chris Lattner PerFunctionState *PFS); 366df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner }; 367df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner} // End llvm namespace 368df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 369df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#endif 370