CGObjC.cpp revision 8f2926b73ed635afecd020da787af6a837601a2b
15508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===---- CGBuiltin.cpp - Emit LLVM Code for builtins ---------------------===// 25508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// 35508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// The LLVM Compiler Infrastructure 45508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// 85508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===// 95508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// 105508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// This contains code to emit Objective-C code as LLVM code. 115508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// 125508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===// 135508518a2702b00be3b15a26d772bde968972f54Anders Carlsson 142979ec73b4f974d85f2ce84167712177a44c6f09Ted Kremenek#include "CGObjCRuntime.h" 155508518a2702b00be3b15a26d772bde968972f54Anders Carlsson#include "CodeGenFunction.h" 165508518a2702b00be3b15a26d772bde968972f54Anders Carlsson#include "CodeGenModule.h" 17c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/AST/DeclObjC.h" 184111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner 195508518a2702b00be3b15a26d772bde968972f54Anders Carlssonusing namespace clang; 205508518a2702b00be3b15a26d772bde968972f54Anders Carlssonusing namespace CodeGen; 215508518a2702b00be3b15a26d772bde968972f54Anders Carlsson 228fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner/// Emits an instance of NSConstantString representing the object. 23bbce49b9e5c6d7f05926b89f8e6fd235ae01c250Daniel Dunbarllvm::Value *CodeGenFunction::EmitObjCStringLiteral(const ObjCStringLiteral *E) { 24bbce49b9e5c6d7f05926b89f8e6fd235ae01c250Daniel Dunbar std::string String(E->getString()->getStrData(), E->getString()->getByteLength()); 25bbce49b9e5c6d7f05926b89f8e6fd235ae01c250Daniel Dunbar llvm::Constant *C = CGM.getObjCRuntime().GenerateConstantString(String); 26ed7c618f849e2541b1d0288c43154937652c5b15Daniel Dunbar // FIXME: This bitcast should just be made an invariant on the Runtime. 27bbce49b9e5c6d7f05926b89f8e6fd235ae01c250Daniel Dunbar return llvm::ConstantExpr::getBitCast(C, ConvertType(E->getType())); 288fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner} 298fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner 308fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner/// Emit a selector. 318fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattnerllvm::Value *CodeGenFunction::EmitObjCSelectorExpr(const ObjCSelectorExpr *E) { 328fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner // Untyped selector. 338fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner // Note that this implementation allows for non-constant strings to be passed 348fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner // as arguments to @selector(). Currently, the only thing preventing this 358fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner // behaviour is the type checking in the front end. 36208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar return CGM.getObjCRuntime().GetSelector(Builder, E->getSelector()); 378fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner} 388fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner 39ed7c618f849e2541b1d0288c43154937652c5b15Daniel Dunbarllvm::Value *CodeGenFunction::EmitObjCProtocolExpr(const ObjCProtocolExpr *E) { 40ed7c618f849e2541b1d0288c43154937652c5b15Daniel Dunbar // FIXME: This should pass the Decl not the name. 41ed7c618f849e2541b1d0288c43154937652c5b15Daniel Dunbar return CGM.getObjCRuntime().GenerateProtocolRef(Builder, E->getProtocol()); 42ed7c618f849e2541b1d0288c43154937652c5b15Daniel Dunbar} 438fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner 448fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner 458f2926b73ed635afecd020da787af6a837601a2bDaniel DunbarRValue CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E) { 468fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner // Only the lookup mechanism and first two arguments of the method 478fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner // implementation vary between runtimes. We can get the receiver and 488fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner // arguments in generic code. 498fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner 50208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar CGObjCRuntime &Runtime = CGM.getObjCRuntime(); 518fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner const Expr *ReceiverExpr = E->getReceiver(); 528fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner bool isSuperMessage = false; 538fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner // Find the receiver 548fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner llvm::Value *Receiver; 558fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner if (!ReceiverExpr) { 56ddb2a3d55a24a1dbdf9152621642d9a4b4fc2f61Daniel Dunbar const ObjCInterfaceDecl *OID = E->getClassInfo().first; 57ddb2a3d55a24a1dbdf9152621642d9a4b4fc2f61Daniel Dunbar 58ddb2a3d55a24a1dbdf9152621642d9a4b4fc2f61Daniel Dunbar // Very special case, super send in class method. The receiver is 59ddb2a3d55a24a1dbdf9152621642d9a4b4fc2f61Daniel Dunbar // self (the class object) and the send uses super semantics. 60ddb2a3d55a24a1dbdf9152621642d9a4b4fc2f61Daniel Dunbar if (!OID) { 61ddb2a3d55a24a1dbdf9152621642d9a4b4fc2f61Daniel Dunbar assert(!strcmp(E->getClassName()->getName(), "super") && 62ddb2a3d55a24a1dbdf9152621642d9a4b4fc2f61Daniel Dunbar "Unexpected missing class interface in message send."); 63ddb2a3d55a24a1dbdf9152621642d9a4b4fc2f61Daniel Dunbar OID = E->getMethodDecl()->getClassInterface(); 64ddb2a3d55a24a1dbdf9152621642d9a4b4fc2f61Daniel Dunbar isSuperMessage = true; 658fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner } 66ddb2a3d55a24a1dbdf9152621642d9a4b4fc2f61Daniel Dunbar 67ddb2a3d55a24a1dbdf9152621642d9a4b4fc2f61Daniel Dunbar Receiver = Runtime.GetClass(Builder, OID); 68d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner } else if (const PredefinedExpr *PDE = 69d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner dyn_cast<PredefinedExpr>(E->getReceiver())) { 70d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner assert(PDE->getIdentType() == PredefinedExpr::ObjCSuper); 718fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner isSuperMessage = true; 728fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner Receiver = LoadObjCSelf(); 738fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner } else { 742bedbf8549bb33293c6a53e5da6cbd8de290d014Daniel Dunbar Receiver = EmitScalarExpr(E->getReceiver()); 758fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner } 768fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner 778fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner if (isSuperMessage) { 789384c768e93f270118a30ce96546083a666da284Chris Lattner // super is only valid in an Objective-C method 799384c768e93f270118a30ce96546083a666da284Chris Lattner const ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(CurFuncDecl); 808f2926b73ed635afecd020da787af6a837601a2bDaniel Dunbar return Runtime.GenerateMessageSendSuper(*this, E, 818f2926b73ed635afecd020da787af6a837601a2bDaniel Dunbar OMD->getClassInterface()->getSuperClass(), 828f2926b73ed635afecd020da787af6a837601a2bDaniel Dunbar Receiver); 838fdf32822be2238aa7db62d40e75b168b637ab7dChris Lattner } 848f2926b73ed635afecd020da787af6a837601a2bDaniel Dunbar return Runtime.GenerateMessageSend(*this, E, Receiver); 855508518a2702b00be3b15a26d772bde968972f54Anders Carlsson} 865508518a2702b00be3b15a26d772bde968972f54Anders Carlsson 874111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner/// Generate an Objective-C method. An Objective-C method is a C function with 884111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner/// its pointer, name, and types registered in the class struture. 894111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattnervoid CodeGenFunction::GenerateObjCMethod(const ObjCMethodDecl *OMD) { 907ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar CurFn = CGM.getObjCRuntime().GenerateMethod(OMD); 914111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner llvm::BasicBlock *EntryBB = llvm::BasicBlock::Create("entry", CurFn); 924111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner 934111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner // Create a marker to make it easy to insert allocas into the entryblock 944111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner // later. Don't create this with the builder, because we don't want it 954111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner // folded. 964111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner llvm::Value *Undef = llvm::UndefValue::get(llvm::Type::Int32Ty); 974111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner AllocaInsertPt = new llvm::BitCastInst(Undef, llvm::Type::Int32Ty, "allocapt", 984111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner EntryBB); 994111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner 1004111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner FnRetTy = OMD->getResultType(); 1014111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner CurFuncDecl = OMD; 1024111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner 1034111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner Builder.SetInsertPoint(EntryBB); 1044111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner 1054111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner // Emit allocs for param decls. Give the LLVM Argument nodes names. 1064111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner llvm::Function::arg_iterator AI = CurFn->arg_begin(); 1074111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner 108b7ec246872b412f0e7bb9e93eacfd78cfa6adfb3Daniel Dunbar // Name the struct return argument. 1094111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner if (hasAggregateLLVMType(OMD->getResultType())) { 110b7ec246872b412f0e7bb9e93eacfd78cfa6adfb3Daniel Dunbar AI->setName("agg.result"); 1114111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner ++AI; 1124111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner } 113b7ec246872b412f0e7bb9e93eacfd78cfa6adfb3Daniel Dunbar 1144111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner // Add implicit parameters to the decl map. 115b7ec246872b412f0e7bb9e93eacfd78cfa6adfb3Daniel Dunbar EmitParmDecl(*OMD->getSelfDecl(), AI); 116b7ec246872b412f0e7bb9e93eacfd78cfa6adfb3Daniel Dunbar ++AI; 117b7ec246872b412f0e7bb9e93eacfd78cfa6adfb3Daniel Dunbar 118b7ec246872b412f0e7bb9e93eacfd78cfa6adfb3Daniel Dunbar EmitParmDecl(*OMD->getCmdDecl(), AI); 1194111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner ++AI; 1204111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner 1214111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner for (unsigned i = 0, e = OMD->getNumParams(); i != e; ++i, ++AI) { 1224111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner assert(AI != CurFn->arg_end() && "Argument mismatch!"); 1234111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner EmitParmDecl(*OMD->getParamDecl(i), AI); 1244111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner } 125b7ec246872b412f0e7bb9e93eacfd78cfa6adfb3Daniel Dunbar assert(AI == CurFn->arg_end() && "Argument mismatch"); 126b7ec246872b412f0e7bb9e93eacfd78cfa6adfb3Daniel Dunbar 1274111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner GenerateFunction(OMD->getBody()); 1284111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner} 1294111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner 130b7ec246872b412f0e7bb9e93eacfd78cfa6adfb3Daniel Dunbarllvm::Value *CodeGenFunction::LoadObjCSelf(void) { 131b7ec246872b412f0e7bb9e93eacfd78cfa6adfb3Daniel Dunbar const ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(CurFuncDecl); 132b7ec246872b412f0e7bb9e93eacfd78cfa6adfb3Daniel Dunbar return Builder.CreateLoad(LocalDeclMap[OMD->getSelfDecl()], "self"); 1334111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner} 1344111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner 1352979ec73b4f974d85f2ce84167712177a44c6f09Ted KremenekCGObjCRuntime::~CGObjCRuntime() {} 136