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