CodeGenModule.cpp revision 208ff5e8a073de2a5d15cbe03cab8a4c0d935e28
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- CodeGenModule.cpp - Emit LLVM Code from ASTs for a Module --------===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This coordinates the per-module state used while generating code. 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 14e8b9f5b8ea60983c4a74cb8b63879616b914b65aSanjiv Gupta#include "CGDebugInfo.h" 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "CodeGenModule.h" 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "CodeGenFunction.h" 175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/ASTContext.h" 18c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/AST/DeclObjC.h" 192c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner#include "clang/Basic/Diagnostic.h" 208bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman#include "clang/Basic/SourceManager.h" 215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h" 22ec9426ca6039279bcc99bc2c625bb2abe4f0353dNate Begeman#include "llvm/CallingConv.h" 23bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner#include "llvm/Module.h" 245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/Intrinsics.h" 2520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov#include "llvm/Target/TargetData.h" 26a1945fa74d04098d7e22d7c31585342555eca928Chris Lattner#include "llvm/Analysis/Verifier.h" 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace CodeGen; 295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris LattnerCodeGenModule::CodeGenModule(ASTContext &C, const LangOptions &LO, 32fb97b03e42d397405f617be0252be83e77a66f6eChris Lattner llvm::Module &M, const llvm::TargetData &TD, 33c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel Dunbar Diagnostic &diags, bool GenerateDebugInfo, 34c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel Dunbar bool UseMacObjCRuntime) 35fb97b03e42d397405f617be0252be83e77a66f6eChris Lattner : Context(C), Features(LO), TheModule(M), TheTargetData(TD), Diags(diags), 36208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar Types(C, M, TD), Runtime(0), MemCpyFn(0), MemMoveFn(0), MemSetFn(0), 370c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman CFConstantStringClassRef(0) { 38208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar 39208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar if (Features.ObjC1) { 40208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar // TODO: Make this selectable at runtime 41208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar if (UseMacObjCRuntime) { 42208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar Runtime = CreateMacObjCRuntime(*this); 43208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar } else { 44208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar Runtime = CreateGNUObjCRuntime(*this); 45208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar } 46c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel Dunbar } 47e8b9f5b8ea60983c4a74cb8b63879616b914b65aSanjiv Gupta 48e8b9f5b8ea60983c4a74cb8b63879616b914b65aSanjiv Gupta // If debug info generation is enabled, create the CGDebugInfo object. 49815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek DebugInfo = GenerateDebugInfo ? new CGDebugInfo(this) : 0; 502b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris Lattner} 512b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris Lattner 522b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris LattnerCodeGenModule::~CodeGenModule() { 53815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek delete Runtime; 54815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek delete DebugInfo; 55815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek} 56815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek 57815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenekvoid CodeGenModule::Release() { 5820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov EmitStatics(); 59208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar if (Runtime) 60208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar if (llvm::Function *ObjCInitFunction = Runtime->ModuleInitFunction()) 61208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar AddGlobalCtor(ObjCInitFunction); 626bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar EmitCtorList(GlobalCtors, "llvm.global_ctors"); 636bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar EmitCtorList(GlobalDtors, "llvm.global_dtors"); 64532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman EmitAnnotations(); 65a1945fa74d04098d7e22d7c31585342555eca928Chris Lattner // Run the verifier to check that the generated code is consistent. 66a1945fa74d04098d7e22d7c31585342555eca928Chris Lattner assert(!verifyModule(TheModule)); 672b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris Lattner} 685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 692c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner/// WarnUnsupported - Print out a warning that codegen doesn't support the 702c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner/// specified stmt yet. 712c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattnervoid CodeGenModule::WarnUnsupported(const Stmt *S, const char *Type) { 722c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner unsigned DiagID = getDiags().getCustomDiagID(Diagnostic::Warning, 732c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner "cannot codegen this %0 yet"); 742c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner SourceRange Range = S->getSourceRange(); 752c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner std::string Msg = Type; 769c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek getDiags().Report(Context.getFullLoc(S->getLocStart()), DiagID, 777a9d49fd2bfac00e905b361ba76d26ab5b6c3b09Ted Kremenek &Msg, 1, &Range, 1); 782c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner} 7958c3f9ec11cbe852a518bf2f83af46f938b7b852Chris Lattner 80c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner/// WarnUnsupported - Print out a warning that codegen doesn't support the 81c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner/// specified decl yet. 82c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattnervoid CodeGenModule::WarnUnsupported(const Decl *D, const char *Type) { 83c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner unsigned DiagID = getDiags().getCustomDiagID(Diagnostic::Warning, 84c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner "cannot codegen this %0 yet"); 85c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner std::string Msg = Type; 86c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID, 87c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner &Msg, 1); 88c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner} 89c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner 904f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman/// setVisibility - Set the visibility for the given LLVM GlobalValue 914f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman/// according to the given clang AST visibility value. 924f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanvoid CodeGenModule::setVisibility(llvm::GlobalValue *GV, 934f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman VisibilityAttr::VisibilityTypes Vis) { 944f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman switch (Vis) { 954f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman default: assert(0 && "Unknown visibility!"); 964f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman case VisibilityAttr::DefaultVisibility: 974f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman GV->setVisibility(llvm::GlobalValue::DefaultVisibility); 984f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman break; 994f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman case VisibilityAttr::HiddenVisibility: 1004f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman GV->setVisibility(llvm::GlobalValue::HiddenVisibility); 1014f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman break; 1024f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman case VisibilityAttr::ProtectedVisibility: 1034f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman GV->setVisibility(llvm::GlobalValue::ProtectedVisibility); 1044f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman break; 1054f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman } 1064f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman} 1074f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman 1086d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner/// AddGlobalCtor - Add a function to the list that will be called before 1096d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner/// main() runs. 1106bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::AddGlobalCtor(llvm::Function * Ctor, int Priority) { 1116d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner // TODO: Type coercion of void()* types. 1126bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar GlobalCtors.push_back(std::make_pair(Ctor, Priority)); 1136d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner} 1146d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner 1156bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar/// AddGlobalDtor - Add a function to the list that will be called 1166bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar/// when the module is unloaded. 1176bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::AddGlobalDtor(llvm::Function * Dtor, int Priority) { 1186bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // TODO: Type coercion of void()* types. 1196bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar GlobalDtors.push_back(std::make_pair(Dtor, Priority)); 1206bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar} 1216bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1226bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) { 1236bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // Ctor function type is void()*. 1246bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::FunctionType* CtorFTy = 1256bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::FunctionType::get(llvm::Type::VoidTy, 1266bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar std::vector<const llvm::Type*>(), 1276bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar false); 1286bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy); 1296bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1306bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // Get the type of a ctor entry, { i32, void ()* }. 131572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner llvm::StructType* CtorStructTy = 1326bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::StructType::get(llvm::Type::Int32Ty, 1336bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::PointerType::getUnqual(CtorFTy), NULL); 1346bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1356bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // Construct the constructor and destructor arrays. 1366bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar std::vector<llvm::Constant*> Ctors; 1376bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar for (CtorList::const_iterator I = Fns.begin(), E = Fns.end(); I != E; ++I) { 1386bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar std::vector<llvm::Constant*> S; 1396bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar S.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty, I->second, false)); 1406bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar S.push_back(llvm::ConstantExpr::getBitCast(I->first, CtorPFTy)); 1416bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar Ctors.push_back(llvm::ConstantStruct::get(CtorStructTy, S)); 1426bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar } 1436bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1446bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar if (!Ctors.empty()) { 1456bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::ArrayType *AT = llvm::ArrayType::get(CtorStructTy, Ctors.size()); 1466bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar new llvm::GlobalVariable(AT, false, 147572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner llvm::GlobalValue::AppendingLinkage, 1486bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::ConstantArray::get(AT, Ctors), 1496bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar GlobalName, 150572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner &TheModule); 1516d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner } 1526d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner} 1536d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner 154532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begemanvoid CodeGenModule::EmitAnnotations() { 155532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman if (Annotations.empty()) 156532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman return; 157532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman 158532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman // Create a new global variable for the ConstantStruct in the Module. 159532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::Constant *Array = 160532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::ConstantArray::get(llvm::ArrayType::get(Annotations[0]->getType(), 161532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman Annotations.size()), 162532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman Annotations); 163532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::GlobalValue *gv = 164532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman new llvm::GlobalVariable(Array->getType(), false, 165532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::GlobalValue::AppendingLinkage, Array, 166532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman "llvm.global.annotations", &TheModule); 167532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman gv->setSection("llvm.metadata"); 168532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman} 169532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman 170ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedmanbool hasAggregateLLVMType(QualType T) { 171ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman return !T->isRealType() && !T->isPointerLikeType() && 172ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman !T->isVoidType() && !T->isVectorType() && !T->isFunctionType(); 173ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman} 174ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 175d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopesvoid CodeGenModule::SetGlobalValueAttributes(const FunctionDecl *FD, 176d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes llvm::GlobalValue *GV) { 177d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes // TODO: Set up linkage and many other things. Note, this is a simple 178d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes // approximation of what we really want. 179d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes if (FD->getStorageClass() == FunctionDecl::Static) 180d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes GV->setLinkage(llvm::Function::InternalLinkage); 181d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes else if (FD->getAttr<DLLImportAttr>()) 182d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes GV->setLinkage(llvm::Function::DLLImportLinkage); 183d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes else if (FD->getAttr<DLLExportAttr>()) 184d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes GV->setLinkage(llvm::Function::DLLExportLinkage); 185d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes else if (FD->getAttr<WeakAttr>() || FD->isInline()) 186d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes GV->setLinkage(llvm::Function::WeakLinkage); 187d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 188d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes if (const VisibilityAttr *attr = FD->getAttr<VisibilityAttr>()) 189d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes CodeGenModule::setVisibility(GV, attr->getVisibility()); 190d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes // FIXME: else handle -fvisibility 191a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar 192a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar if (const AsmLabelAttr *ALA = FD->getAttr<AsmLabelAttr>()) { 193a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // Prefaced with special LLVM marker to indicate that the name 194a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // should not be munged. 195a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar GV->setName("\01" + ALA->getLabel()); 196a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar } 197d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes} 198d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 199ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedmanvoid CodeGenModule::SetFunctionAttributes(const FunctionDecl *FD, 200ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman llvm::Function *F, 201ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman const llvm::FunctionType *FTy) { 202ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman unsigned FuncAttrs = 0; 203ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman if (FD->getAttr<NoThrowAttr>()) 204ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman FuncAttrs |= llvm::ParamAttr::NoUnwind; 205ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman if (FD->getAttr<NoReturnAttr>()) 206ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman FuncAttrs |= llvm::ParamAttr::NoReturn; 207ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 208ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman llvm::SmallVector<llvm::ParamAttrsWithIndex, 8> ParamAttrList; 209ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman if (FuncAttrs) 210ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman ParamAttrList.push_back(llvm::ParamAttrsWithIndex::get(0, FuncAttrs)); 211ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman // Note that there is parallel code in CodeGenFunction::EmitCallExpr 212ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman bool AggregateReturn = hasAggregateLLVMType(FD->getResultType()); 213ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman if (AggregateReturn) 214ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman ParamAttrList.push_back( 215ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman llvm::ParamAttrsWithIndex::get(1, llvm::ParamAttr::StructRet)); 216ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman unsigned increment = AggregateReturn ? 2 : 1; 217c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman const FunctionTypeProto* FTP = dyn_cast<FunctionTypeProto>(FD->getType()); 218c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman if (FTP) { 219c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman for (unsigned i = 0; i < FTP->getNumArgs(); i++) { 220c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman QualType ParamType = FTP->getArgType(i); 221c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman unsigned ParamAttrs = 0; 222c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman if (ParamType->isRecordType()) 223c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman ParamAttrs |= llvm::ParamAttr::ByVal; 224a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner if (ParamType->isSignedIntegerType() && 225a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner ParamType->isPromotableIntegerType()) 226c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman ParamAttrs |= llvm::ParamAttr::SExt; 227a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner if (ParamType->isUnsignedIntegerType() && 228a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner ParamType->isPromotableIntegerType()) 229c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman ParamAttrs |= llvm::ParamAttr::ZExt; 230c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman if (ParamAttrs) 231c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman ParamAttrList.push_back(llvm::ParamAttrsWithIndex::get(i + increment, 232c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman ParamAttrs)); 233c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman } 234ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman } 235c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman 236ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman F->setParamAttrs(llvm::PAListPtr::get(ParamAttrList.begin(), 237ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman ParamAttrList.size())); 238ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 239ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman // Set the appropriate calling convention for the Function. 240ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman if (FD->getAttr<FastCallAttr>()) 241ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman F->setCallingConv(llvm::CallingConv::Fast); 242ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 243d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes SetGlobalValueAttributes(FD, F); 244ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman} 245ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 246391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattnervoid CodeGenModule::EmitObjCMethod(const ObjCMethodDecl *OMD) { 247391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // If this is not a prototype, emit the body. 248391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner if (OMD->getBody()) 249391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner CodeGenFunction(*this).GenerateObjCMethod(OMD); 250391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner} 25120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikovvoid CodeGenModule::EmitObjCProtocolImplementation(const ObjCProtocolDecl *PD){ 25220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<std::string, 16> Protocols; 253780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner for (ObjCProtocolDecl::protocol_iterator PI = PD->protocol_begin(), 254780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner E = PD->protocol_end(); PI != E; ++PI) 255780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner Protocols.push_back((*PI)->getName()); 25620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> InstanceMethodNames; 25720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> InstanceMethodTypes; 25820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCProtocolDecl::instmeth_iterator iter = PD->instmeth_begin(), 259780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner E = PD->instmeth_end(); iter != E; iter++) { 26020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 261780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner Context.getObjCEncodingForMethodDecl(*iter, TypeStr); 26220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov InstanceMethodNames.push_back( 26320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov GetAddrOfConstantString((*iter)->getSelector().getName())); 26420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov InstanceMethodTypes.push_back(GetAddrOfConstantString(TypeStr)); 26520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 26620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect information about class methods: 26720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> ClassMethodNames; 26820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> ClassMethodTypes; 26920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCProtocolDecl::classmeth_iterator iter = PD->classmeth_begin(), 27020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov endIter = PD->classmeth_end() ; iter != endIter ; iter++) { 27120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 27220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Context.getObjCEncodingForMethodDecl((*iter),TypeStr); 27320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ClassMethodNames.push_back( 27420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov GetAddrOfConstantString((*iter)->getSelector().getName())); 27520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ClassMethodTypes.push_back(GetAddrOfConstantString(TypeStr)); 27620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 27720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Runtime->GenerateProtocol(PD->getName(), Protocols, InstanceMethodNames, 27820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov InstanceMethodTypes, ClassMethodNames, ClassMethodTypes); 27920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov} 28020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 28120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikovvoid CodeGenModule::EmitObjCCategoryImpl(const ObjCCategoryImplDecl *OCD) { 28220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 28320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect information about instance methods 284a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner llvm::SmallVector<Selector, 16> InstanceMethodSels; 28520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> InstanceMethodTypes; 28620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCCategoryDecl::instmeth_iterator iter = OCD->instmeth_begin(), 28720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov endIter = OCD->instmeth_end() ; iter != endIter ; iter++) { 288a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner InstanceMethodSels.push_back((*iter)->getSelector()); 28920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 290fba676396703e87a5034e5f308aa30a633468f66Chris Lattner Context.getObjCEncodingForMethodDecl(*iter,TypeStr); 29120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov InstanceMethodTypes.push_back(GetAddrOfConstantString(TypeStr)); 29220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 29320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 29420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect information about class methods 295a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner llvm::SmallVector<Selector, 16> ClassMethodSels; 29620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> ClassMethodTypes; 29720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCCategoryDecl::classmeth_iterator iter = OCD->classmeth_begin(), 29820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov endIter = OCD->classmeth_end() ; iter != endIter ; iter++) { 299a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner ClassMethodSels.push_back((*iter)->getSelector()); 30020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 301fba676396703e87a5034e5f308aa30a633468f66Chris Lattner Context.getObjCEncodingForMethodDecl(*iter,TypeStr); 30220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ClassMethodTypes.push_back(GetAddrOfConstantString(TypeStr)); 30320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 30420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 30520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect the names of referenced protocols 30620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<std::string, 16> Protocols; 3073db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner const ObjCInterfaceDecl *ClassDecl = OCD->getClassInterface(); 3083db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner const ObjCList<ObjCProtocolDecl> &Protos =ClassDecl->getReferencedProtocols(); 3093db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner for (ObjCList<ObjCProtocolDecl>::iterator I = Protos.begin(), 3103db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner E = Protos.end(); I != E; ++I) 3113db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner Protocols.push_back((*I)->getName()); 31220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 31320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Generate the category 31420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Runtime->GenerateCategory(OCD->getClassInterface()->getName(), 315a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner OCD->getName(), InstanceMethodSels, InstanceMethodTypes, 316a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner ClassMethodSels, ClassMethodTypes, Protocols); 31720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov} 31820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 31920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikovvoid CodeGenModule::EmitObjCClassImplementation( 32020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov const ObjCImplementationDecl *OID) { 32120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Get the superclass name. 32220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov const ObjCInterfaceDecl * SCDecl = OID->getClassInterface()->getSuperClass(); 32320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov const char * SCName = NULL; 32420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov if (SCDecl) { 32520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov SCName = SCDecl->getName(); 32620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 32720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 32820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Get the class name 32920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ObjCInterfaceDecl * ClassDecl = (ObjCInterfaceDecl*)OID->getClassInterface(); 33020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov const char * ClassName = ClassDecl->getName(); 33120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 33220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Get the size of instances. For runtimes that support late-bound instances 33320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // this should probably be something different (size just of instance 33420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // varaibles in this class, not superclasses?). 33520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov int instanceSize = 0; 33620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov const llvm::Type *ObjTy; 33720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov if (!Runtime->LateBoundIVars()) { 33820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ObjTy = getTypes().ConvertType(Context.getObjCInterfaceType(ClassDecl)); 33920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov instanceSize = TheTargetData.getABITypeSize(ObjTy); 34020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 34120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 34220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect information about instance variables. 34320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> IvarNames; 34420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> IvarTypes; 34520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> IvarOffsets; 34620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov const llvm::StructLayout *Layout = 34720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov TheTargetData.getStructLayout(cast<llvm::StructType>(ObjTy)); 34820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ObjTy = llvm::PointerType::getUnqual(ObjTy); 34920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCInterfaceDecl::ivar_iterator iter = ClassDecl->ivar_begin(), 35020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov endIter = ClassDecl->ivar_end() ; iter != endIter ; iter++) { 35120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Store the name 35220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov IvarNames.push_back(GetAddrOfConstantString((*iter)->getName())); 35320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Get the type encoding for this ivar 35420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 35520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<const RecordType *, 8> EncodingRecordTypes; 35620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Context.getObjCEncodingForType((*iter)->getType(), TypeStr, 35720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov EncodingRecordTypes); 35820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov IvarTypes.push_back(GetAddrOfConstantString(TypeStr)); 35920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Get the offset 36020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov int offset = 36120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov (int)Layout->getElementOffset(getTypes().getLLVMFieldNo(*iter)); 36220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov IvarOffsets.push_back( 36320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::ConstantInt::get(llvm::Type::Int32Ty, offset)); 36420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 36520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 36620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect information about instance methods 367a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner llvm::SmallVector<Selector, 16> InstanceMethodSels; 36820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> InstanceMethodTypes; 36920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCImplementationDecl::instmeth_iterator iter = OID->instmeth_begin(), 37020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov endIter = OID->instmeth_end() ; iter != endIter ; iter++) { 371a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner InstanceMethodSels.push_back((*iter)->getSelector()); 37220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 37320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Context.getObjCEncodingForMethodDecl((*iter),TypeStr); 37420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov InstanceMethodTypes.push_back(GetAddrOfConstantString(TypeStr)); 37520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 37620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 37720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect information about class methods 378a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner llvm::SmallVector<Selector, 16> ClassMethodSels; 37920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> ClassMethodTypes; 38020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCImplementationDecl::classmeth_iterator iter = OID->classmeth_begin(), 38120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov endIter = OID->classmeth_end() ; iter != endIter ; iter++) { 382a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner ClassMethodSels.push_back((*iter)->getSelector()); 38320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 38420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Context.getObjCEncodingForMethodDecl((*iter),TypeStr); 38520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ClassMethodTypes.push_back(GetAddrOfConstantString(TypeStr)); 38620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 38720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect the names of referenced protocols 38820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<std::string, 16> Protocols; 3893db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner const ObjCList<ObjCProtocolDecl> &Protos =ClassDecl->getReferencedProtocols(); 3903db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner for (ObjCList<ObjCProtocolDecl>::iterator I = Protos.begin(), 3913db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner E = Protos.end(); I != E; ++I) 3923db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner Protocols.push_back((*I)->getName()); 39320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 39420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Generate the category 39520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Runtime->GenerateClass(ClassName, SCName, instanceSize, IvarNames, IvarTypes, 396a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner IvarOffsets, InstanceMethodSels, InstanceMethodTypes, 397a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner ClassMethodSels, ClassMethodTypes, Protocols); 39820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov} 39920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 4004c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begemanvoid CodeGenModule::EmitStatics() { 4014c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // Emit code for each used static decl encountered. Since a previously unused 4024c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // static decl may become used during the generation of code for a static 4034c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // function, iterate until no changes are made. 4044c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman bool Changed; 4054c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman do { 4064c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman Changed = false; 4074c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman for (unsigned i = 0, e = StaticDecls.size(); i != e; ++i) { 408bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar const ValueDecl *D = StaticDecls[i]; 4096f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman 4106f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman // Check if we have used a decl with the same name 4116f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman // FIXME: The AST should have some sort of aggregate decls or 4126f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman // global symbol map. 413a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar if (!GlobalDeclMap.count(D->getName())) 414a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar continue; 4156f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman 416bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Emit the definition. 417bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalDefinition(D); 418bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 4194c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // Erase the used decl from the list. 4204c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman StaticDecls[i] = StaticDecls.back(); 4214c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman StaticDecls.pop_back(); 4224c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman --i; 4234c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman --e; 4244c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman 4254c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // Remember that we made a change. 4264c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman Changed = true; 4274c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman } 4284c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman } while (Changed); 4295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 4305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4318bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// EmitAnnotateAttr - Generate the llvm::ConstantStruct which contains the 4328bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// annotation information for a given GlobalValue. The annotation struct is 4338bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// {i8 *, i8 *, i8 *, i32}. The first field is a constant expression, the 4343c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar/// GlobalValue being annotated. The second field is the constant string 4358bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// created from the AnnotateAttr's annotation. The third field is a constant 4368bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// string containing the name of the translation unit. The fourth field is 4378bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// the line number in the file of the annotated value declaration. 4388bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// 4398bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// FIXME: this does not unique the annotation string constants, as llvm-gcc 4408bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// appears to. 4418bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// 4428bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begemanllvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV, 4438bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman const AnnotateAttr *AA, 4448bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman unsigned LineNo) { 4458bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Module *M = &getModule(); 4468bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 4478bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // get [N x i8] constants for the annotation string, and the filename string 4488bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // which are the 2nd and 3rd elements of the global annotation structure. 4498bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman const llvm::Type *SBP = llvm::PointerType::getUnqual(llvm::Type::Int8Ty); 4508bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Constant *anno = llvm::ConstantArray::get(AA->getAnnotation(), true); 4518bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Constant *unit = llvm::ConstantArray::get(M->getModuleIdentifier(), 4528bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman true); 4538bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 4548bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // Get the two global values corresponding to the ConstantArrays we just 4558bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // created to hold the bytes of the strings. 4568bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue *annoGV = 4578bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman new llvm::GlobalVariable(anno->getType(), false, 4588bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue::InternalLinkage, anno, 4598bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman GV->getName() + ".str", M); 4608bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // translation unit name string, emitted into the llvm.metadata section. 4618bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue *unitGV = 4628bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman new llvm::GlobalVariable(unit->getType(), false, 4638bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue::InternalLinkage, unit, ".str", M); 4648bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 4658bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // Create the ConstantStruct that is the global annotion. 4668bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Constant *Fields[4] = { 4678bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantExpr::getBitCast(GV, SBP), 4688bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantExpr::getBitCast(annoGV, SBP), 4698bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantExpr::getBitCast(unitGV, SBP), 4708bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantInt::get(llvm::Type::Int32Ty, LineNo) 4718bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman }; 4728bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman return llvm::ConstantStruct::get(Fields, 4, false); 4738bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman} 4748bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 475bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobal(const ValueDecl *Global) { 476bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar bool isDef, isStatic; 477bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 478bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Global)) { 479bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar isDef = (FD->isThisDeclarationADefinition() || 480bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar FD->getAttr<AliasAttr>()); 481bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar isStatic = FD->getStorageClass() == FunctionDecl::Static; 482bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else if (const VarDecl *VD = cast<VarDecl>(Global)) { 483bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar assert(VD->isFileVarDecl() && "Cannot emit local var decl as global."); 484bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 485bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar isDef = !(VD->getStorageClass() == VarDecl::Extern && VD->getInit() == 0); 486bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar isStatic = VD->getStorageClass() == VarDecl::Static; 487bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 488bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar assert(0 && "Invalid argument to EmitGlobal"); 4894c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman return; 4904c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman } 4914c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman 492bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Forward declarations are emitted lazily on first use. 493bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (!isDef) 49488a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner return; 495bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 496bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // If the global is a static, defer code generation until later so 497bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // we can easily omit unused statics. 498bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (isStatic) { 499bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar StaticDecls.push_back(Global); 500bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar return; 501bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 502bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 503bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Otherwise emit the definition. 504bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalDefinition(Global); 5054c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman} 5064c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman 507bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalDefinition(const ValueDecl *D) { 508bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 509bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalFunctionDefinition(FD); 510bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 511bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalVarDefinition(VD); 512bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 513bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar assert(0 && "Invalid argument to EmitGlobalDefinition()"); 514bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 515bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 516bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 5179986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D) { 51877ba708819285931932ecd33691a672bb59d221aEli Friedman assert(D->hasGlobalStorage() && "Not a global variable"); 51977ba708819285931932ecd33691a672bb59d221aEli Friedman 520bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar QualType ASTTy = D->getType(); 521bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar const llvm::Type *Ty = getTypes().ConvertTypeForMem(ASTTy); 5229986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar const llvm::Type *PTy = llvm::PointerType::get(Ty, ASTTy.getAddressSpace()); 523bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 5243c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar // Lookup the entry, lazily creating it if necessary. 5253c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getName()]; 5263c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (!Entry) 5273c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry = new llvm::GlobalVariable(Ty, false, 5283c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue::ExternalLinkage, 5293c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 0, D->getName(), &getModule(), 0, 5303c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar ASTTy.getAddressSpace()); 5313c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 5329986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar // Make sure the result is of the correct type. 5339986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar return llvm::ConstantExpr::getBitCast(Entry, PTy); 534bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 535bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 536bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) { 5378f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner llvm::Constant *Init = 0; 53877ba708819285931932ecd33691a672bb59d221aEli Friedman QualType ASTTy = D->getType(); 53977ba708819285931932ecd33691a672bb59d221aEli Friedman const llvm::Type *VarTy = getTypes().ConvertTypeForMem(ASTTy); 54077ba708819285931932ecd33691a672bb59d221aEli Friedman 5418f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner if (D->getInit() == 0) { 542cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // This is a tentative definition; tentative definitions are 543cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // implicitly initialized with { 0 } 544cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman const llvm::Type* InitTy; 545cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman if (ASTTy->isIncompleteArrayType()) { 546cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // An incomplete array is normally [ TYPE x 0 ], but we need 547cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // to fix it to [ TYPE x 1 ]. 548cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman const llvm::ArrayType* ATy = cast<llvm::ArrayType>(VarTy); 549cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman InitTy = llvm::ArrayType::get(ATy->getElementType(), 1); 550cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman } else { 551cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman InitTy = VarTy; 552cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman } 553cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman Init = llvm::Constant::getNullValue(InitTy); 55477ba708819285931932ecd33691a672bb59d221aEli Friedman } else { 555bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar Init = EmitConstantExpr(D->getInit()); 5568f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner } 55777ba708819285931932ecd33691a672bb59d221aEli Friedman const llvm::Type* InitType = Init->getType(); 5588e53e720b3d7c962e91138a130dbd5d6c2def0e5Devang Patel 5593c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getName()]; 5603c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalVariable *GV = cast_or_null<llvm::GlobalVariable>(Entry); 5613c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 56277ba708819285931932ecd33691a672bb59d221aEli Friedman if (!GV) { 56377ba708819285931932ecd33691a672bb59d221aEli Friedman GV = new llvm::GlobalVariable(InitType, false, 56477ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::GlobalValue::ExternalLinkage, 56577ba708819285931932ecd33691a672bb59d221aEli Friedman 0, D->getName(), &getModule(), 0, 56677ba708819285931932ecd33691a672bb59d221aEli Friedman ASTTy.getAddressSpace()); 5673c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar } else if (GV->getType() != 5683c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::PointerType::get(InitType, ASTTy.getAddressSpace())) { 56977ba708819285931932ecd33691a672bb59d221aEli Friedman // We have a definition after a prototype with the wrong type. 57077ba708819285931932ecd33691a672bb59d221aEli Friedman // We must make a new GlobalVariable* and update everything that used OldGV 57177ba708819285931932ecd33691a672bb59d221aEli Friedman // (a declaration or tentative definition) with the new GlobalVariable* 57277ba708819285931932ecd33691a672bb59d221aEli Friedman // (which will be a definition). 57377ba708819285931932ecd33691a672bb59d221aEli Friedman // 57477ba708819285931932ecd33691a672bb59d221aEli Friedman // This happens if there is a prototype for a global (e.g. "extern int x[];") 57577ba708819285931932ecd33691a672bb59d221aEli Friedman // and then a definition of a different type (e.g. "int x[10];"). This also 57677ba708819285931932ecd33691a672bb59d221aEli Friedman // happens when an initializer has a different type from the type of the 57777ba708819285931932ecd33691a672bb59d221aEli Friedman // global (this happens with unions). 578cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // 579cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // FIXME: This also ends up happening if there's a definition followed by 580cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // a tentative definition! (Although Sema rejects that construct 581cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // at the moment.) 58277ba708819285931932ecd33691a672bb59d221aEli Friedman 58377ba708819285931932ecd33691a672bb59d221aEli Friedman // Save the old global 58477ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::GlobalVariable *OldGV = GV; 58577ba708819285931932ecd33691a672bb59d221aEli Friedman 58677ba708819285931932ecd33691a672bb59d221aEli Friedman // Make a new global with the correct type 58777ba708819285931932ecd33691a672bb59d221aEli Friedman GV = new llvm::GlobalVariable(InitType, false, 58877ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::GlobalValue::ExternalLinkage, 58977ba708819285931932ecd33691a672bb59d221aEli Friedman 0, D->getName(), &getModule(), 0, 59077ba708819285931932ecd33691a672bb59d221aEli Friedman ASTTy.getAddressSpace()); 59177ba708819285931932ecd33691a672bb59d221aEli Friedman // Steal the name of the old global 59277ba708819285931932ecd33691a672bb59d221aEli Friedman GV->takeName(OldGV); 59377ba708819285931932ecd33691a672bb59d221aEli Friedman 59477ba708819285931932ecd33691a672bb59d221aEli Friedman // Replace all uses of the old global with the new global 59577ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::Constant *NewPtrForOldDecl = 59677ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::ConstantExpr::getBitCast(GV, OldGV->getType()); 59777ba708819285931932ecd33691a672bb59d221aEli Friedman OldGV->replaceAllUsesWith(NewPtrForOldDecl); 59877ba708819285931932ecd33691a672bb59d221aEli Friedman 59977ba708819285931932ecd33691a672bb59d221aEli Friedman // Erase the old global, since it is no longer used. 60077ba708819285931932ecd33691a672bb59d221aEli Friedman OldGV->eraseFromParent(); 60177ba708819285931932ecd33691a672bb59d221aEli Friedman } 60277ba708819285931932ecd33691a672bb59d221aEli Friedman 6033c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry = GV; 6049e32d4b4a7270a9701b7cb454381eeaa4cc42a77Devang Patel 6058bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman if (const AnnotateAttr *AA = D->getAttr<AnnotateAttr>()) { 6068bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman SourceManager &SM = Context.getSourceManager(); 6078bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman AddAnnotation(EmitAnnotateAttr(GV, AA, 6088bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman SM.getLogicalLineNumber(D->getLocation()))); 6098bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman } 6108bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 61188a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner GV->setInitializer(Init); 612ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 613cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // FIXME: This is silly; getTypeAlign should just work for incomplete arrays 614cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman unsigned Align; 615c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const IncompleteArrayType* IAT = 616c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner Context.getAsIncompleteArrayType(D->getType())) 617cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman Align = Context.getTypeAlign(IAT->getElementType()); 618cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman else 619cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman Align = Context.getTypeAlign(D->getType()); 62008d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman if (const AlignedAttr* AA = D->getAttr<AlignedAttr>()) { 62108d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman Align = std::max(Align, AA->getAlignment()); 62208d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman } 62308d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman GV->setAlignment(Align / 8); 62408d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman 625ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner if (const VisibilityAttr *attr = D->getAttr<VisibilityAttr>()) 6264f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman setVisibility(GV, attr->getVisibility()); 627ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // FIXME: else handle -fvisibility 628a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar 629a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar if (const AsmLabelAttr *ALA = D->getAttr<AsmLabelAttr>()) { 630a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // Prefaced with special LLVM marker to indicate that the name 631a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // should not be munged. 632a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar GV->setName("\01" + ALA->getLabel()); 633a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar } 63488a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner 63588a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner // Set the llvm linkage type as appropriate. 6368fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner if (D->getStorageClass() == VarDecl::Static) 6378fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner GV->setLinkage(llvm::Function::InternalLinkage); 6388fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner else if (D->getAttr<DLLImportAttr>()) 639ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner GV->setLinkage(llvm::Function::DLLImportLinkage); 640ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner else if (D->getAttr<DLLExportAttr>()) 641ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner GV->setLinkage(llvm::Function::DLLExportLinkage); 6428fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner else if (D->getAttr<WeakAttr>()) 643ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner GV->setLinkage(llvm::GlobalVariable::WeakLinkage); 6448fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner else { 645ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // FIXME: This isn't right. This should handle common linkage and other 646ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // stuff. 647ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner switch (D->getStorageClass()) { 6488fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner case VarDecl::Static: assert(0 && "This case handled above"); 649ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::Auto: 650ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::Register: 651ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner assert(0 && "Can't have auto or register globals"); 652ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::None: 653ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner if (!D->getInit()) 654a07b76419a03f126c22949dce2e546ba4df0e415Eli Friedman GV->setLinkage(llvm::GlobalVariable::CommonLinkage); 655ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner break; 656ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::Extern: 657ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::PrivateExtern: 658ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // todo: common 659ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner break; 660ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner } 66188a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner } 662686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta 663686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta // Emit global variable debug information. 664686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta CGDebugInfo *DI = getDebugInfo(); 665686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta if(DI) { 666686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta if(D->getLocation().isValid()) 667686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta DI->setLocation(D->getLocation()); 668686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta DI->EmitGlobalVariable(GV, D); 669686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta } 67088a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner} 6715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 672bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarllvm::GlobalValue * 673bd012ff1fa088181646a784f385b28867372d434Daniel DunbarCodeGenModule::EmitForwardFunctionDefinition(const FunctionDecl *D) { 674bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // FIXME: param attributes for sext/zext etc. 675bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (const AliasAttr *AA = D->getAttr<AliasAttr>()) { 676bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar assert(!D->getBody() && "Unexpected alias attr on function with body."); 677bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 678bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar const std::string& aliaseeName = AA->getAliasee(); 679bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Function *aliasee = getModule().getFunction(aliaseeName); 680bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::GlobalValue *alias = new llvm::GlobalAlias(aliasee->getType(), 681bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Function::ExternalLinkage, 682bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar D->getName(), 683bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar aliasee, 684bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar &getModule()); 685bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar SetGlobalValueAttributes(D, alias); 686bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar return alias; 687bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 688bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar const llvm::Type *Ty = getTypes().ConvertType(D->getType()); 689bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar const llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty); 690bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Function *F = llvm::Function::Create(FTy, 691bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Function::ExternalLinkage, 692bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar D->getName(), &getModule()); 693bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 694bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar SetFunctionAttributes(D, F, FTy); 695bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar return F; 696bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 697bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 698bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 699bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarllvm::Constant *CodeGenModule::GetAddrOfFunction(const FunctionDecl *D) { 7009986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar QualType ASTTy = D->getType(); 7019986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar const llvm::Type *Ty = getTypes().ConvertTypeForMem(ASTTy); 7029986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar const llvm::Type *PTy = llvm::PointerType::get(Ty, ASTTy.getAddressSpace()); 7033c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 7043c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar // Lookup the entry, lazily creating it if necessary. 7053c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getName()]; 7063c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (!Entry) 7073c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry = EmitForwardFunctionDefinition(D); 708bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 7099986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar return llvm::ConstantExpr::getBitCast(Entry, PTy); 710bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 711bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 712bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalFunctionDefinition(const FunctionDecl *D) { 7133c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getName()]; 7143c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (!Entry) { 715bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar Entry = EmitForwardFunctionDefinition(D); 716bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 7173c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar // If the types mismatch then we have to rewrite the definition. 7183c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar const llvm::Type *Ty = getTypes().ConvertType(D->getType()); 7193c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (Entry->getType() != llvm::PointerType::getUnqual(Ty)) { 720bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Otherwise, we have a definition after a prototype with the wrong type. 721bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // F is the Function* for the one with the wrong type, we must make a new 722bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Function* and update everything that used F (a declaration) with the new 723bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Function* (which will be a definition). 724bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // 725bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // This happens if there is a prototype for a function (e.g. "int f()") and 726bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // then a definition of a different type (e.g. "int f(int x)"). Start by 727bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // making a new function of the correct type, RAUW, then steal the name. 7283c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue *NewFn = EmitForwardFunctionDefinition(D); 7293c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar NewFn->takeName(Entry); 730bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 731bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Replace uses of F with the Function we will endow with a body. 732bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Constant *NewPtrForOldDecl = 7333c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::ConstantExpr::getBitCast(NewFn, Entry->getType()); 7343c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry->replaceAllUsesWith(NewPtrForOldDecl); 7353c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 736bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Ok, delete the old function now, which is dead. 7373c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar // FIXME: Add GlobalValue->eraseFromParent(). 7383c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar assert(Entry->isDeclaration() && "Shouldn't replace non-declaration"); 7393c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (llvm::Function *F = dyn_cast<llvm::Function>(Entry)) { 7403c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar F->eraseFromParent(); 7413c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar } else if (llvm::GlobalAlias *GA = dyn_cast<llvm::GlobalAlias>(Entry)) { 7423c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar GA->eraseFromParent(); 7433c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar } else { 7443c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar assert(0 && "Invalid global variable type."); 7453c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar } 746bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 747bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar Entry = NewFn; 748bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 749bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 750bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 751bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (D->getAttr<AliasAttr>()) { 752bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar ; 753bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 754bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Function *Fn = cast<llvm::Function>(Entry); 755bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar CodeGenFunction(*this).GenerateCode(D, Fn); 7566bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 7576379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar // Set attributes specific to definition. 7586379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar // FIXME: This needs to be cleaned up by clearly emitting the 7596379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar // declaration / definition at separate times. 7606379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar if (!Features.Exceptions) 7616379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar Fn->addParamAttr(0, llvm::ParamAttr::NoUnwind); 7626379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar 7636bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar if (const ConstructorAttr *CA = D->getAttr<ConstructorAttr>()) { 7646bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar AddGlobalCtor(Fn, CA->getPriority()); 7656bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar } else if (const DestructorAttr *DA = D->getAttr<DestructorAttr>()) { 7666bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar AddGlobalDtor(Fn, DA->getPriority()); 7676bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar } 768bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 769bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 770bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 771c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattnervoid CodeGenModule::UpdateCompletedType(const TagDecl *TD) { 772c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattner // Make sure that this type is translated. 773c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattner Types.UpdateCompletedType(TD); 774d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner} 775d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner 776d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner 777bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner/// getBuiltinLibFunction 778bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattnerllvm::Function *CodeGenModule::getBuiltinLibFunction(unsigned BuiltinID) { 7791426fecdf90dd1986751b9940422e675880ff671Chris Lattner if (BuiltinID > BuiltinFunctions.size()) 7801426fecdf90dd1986751b9940422e675880ff671Chris Lattner BuiltinFunctions.resize(BuiltinID); 781bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 7821426fecdf90dd1986751b9940422e675880ff671Chris Lattner // Cache looked up functions. Since builtin id #0 is invalid we don't reserve 7831426fecdf90dd1986751b9940422e675880ff671Chris Lattner // a slot for it. 7841426fecdf90dd1986751b9940422e675880ff671Chris Lattner assert(BuiltinID && "Invalid Builtin ID"); 7851426fecdf90dd1986751b9940422e675880ff671Chris Lattner llvm::Function *&FunctionSlot = BuiltinFunctions[BuiltinID-1]; 786bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner if (FunctionSlot) 787bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner return FunctionSlot; 788bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 789bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner assert(Context.BuiltinInfo.isLibFunction(BuiltinID) && "isn't a lib fn"); 790bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 791bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // Get the name, skip over the __builtin_ prefix. 792bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner const char *Name = Context.BuiltinInfo.GetName(BuiltinID)+10; 793bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 794bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // Get the type for the builtin. 795bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner QualType Type = Context.BuiltinInfo.GetBuiltinType(BuiltinID, Context); 796bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner const llvm::FunctionType *Ty = 797bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner cast<llvm::FunctionType>(getTypes().ConvertType(Type)); 798bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 799bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // FIXME: This has a serious problem with code like this: 800bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // void abs() {} 801bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // ... __builtin_abs(x); 802bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // The two versions of abs will collide. The fix is for the builtin to win, 803bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // and for the existing one to be turned into a constantexpr cast of the 804bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // builtin. In the case where the existing one is a static function, it 805bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // should just be renamed. 806c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner if (llvm::Function *Existing = getModule().getFunction(Name)) { 807c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner if (Existing->getFunctionType() == Ty && Existing->hasExternalLinkage()) 808c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner return FunctionSlot = Existing; 809c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner assert(Existing == 0 && "FIXME: Name collision"); 810c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner } 811bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 812bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // FIXME: param attributes for sext/zext etc. 8134c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman return FunctionSlot = 8144c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman llvm::Function::Create(Ty, llvm::Function::ExternalLinkage, Name, 8154c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman &getModule()); 816bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner} 817bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 8187acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattnerllvm::Function *CodeGenModule::getIntrinsic(unsigned IID,const llvm::Type **Tys, 8197acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner unsigned NumTys) { 8207acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner return llvm::Intrinsic::getDeclaration(&getModule(), 8217acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner (llvm::Intrinsic::ID)IID, Tys, NumTys); 8227acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner} 823bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 8245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerllvm::Function *CodeGenModule::getMemCpyFn() { 8255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (MemCpyFn) return MemCpyFn; 8265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::Intrinsic::ID IID; 827f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner switch (Context.Target.getPointerWidth(0)) { 8285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer default: assert(0 && "Unknown ptr width"); 8295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case 32: IID = llvm::Intrinsic::memcpy_i32; break; 8305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case 64: IID = llvm::Intrinsic::memcpy_i64; break; 8315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 8327acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner return MemCpyFn = getIntrinsic(IID); 8335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 834c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 8350c99509927a0c7a48490486b9fec287b63e5c09cEli Friedmanllvm::Function *CodeGenModule::getMemMoveFn() { 8360c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman if (MemMoveFn) return MemMoveFn; 8370c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman llvm::Intrinsic::ID IID; 8380c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman switch (Context.Target.getPointerWidth(0)) { 8390c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman default: assert(0 && "Unknown ptr width"); 8400c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman case 32: IID = llvm::Intrinsic::memmove_i32; break; 8410c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman case 64: IID = llvm::Intrinsic::memmove_i64; break; 8420c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman } 8430c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman return MemMoveFn = getIntrinsic(IID); 8440c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman} 8450c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman 84641ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venanciollvm::Function *CodeGenModule::getMemSetFn() { 84741ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio if (MemSetFn) return MemSetFn; 84841ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio llvm::Intrinsic::ID IID; 849f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner switch (Context.Target.getPointerWidth(0)) { 85041ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio default: assert(0 && "Unknown ptr width"); 85141ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio case 32: IID = llvm::Intrinsic::memset_i32; break; 85241ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio case 64: IID = llvm::Intrinsic::memset_i64; break; 85341ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio } 85441ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio return MemSetFn = getIntrinsic(IID); 85541ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio} 8567acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner 85720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov// FIXME: This needs moving into an Apple Objective-C runtime class 858bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattnerllvm::Constant *CodeGenModule:: 859bef20ac367a09555b30d6eb3847a81ec164caf88Chris LattnerGetAddrOfConstantCFString(const std::string &str) { 860c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::StringMapEntry<llvm::Constant *> &Entry = 861c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson CFConstantStringMap.GetOrCreateValue(&str[0], &str[str.length()]); 862c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 863c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson if (Entry.getValue()) 864c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson return Entry.getValue(); 865c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 866c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson std::vector<llvm::Constant*> Fields; 867c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 868c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson if (!CFConstantStringClassRef) { 869c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson const llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy); 870c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Ty = llvm::ArrayType::get(Ty, 0); 871c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 872c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson CFConstantStringClassRef = 873c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson new llvm::GlobalVariable(Ty, false, 874c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::GlobalVariable::ExternalLinkage, 0, 875c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson "__CFConstantStringClassReference", 876c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson &getModule()); 877c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson } 878c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 879c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // Class pointer. 880c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::Constant *Zero = llvm::Constant::getNullValue(llvm::Type::Int32Ty); 881c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::Constant *Zeros[] = { Zero, Zero }; 882c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::Constant *C = 883c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::ConstantExpr::getGetElementPtr(CFConstantStringClassRef, Zeros, 2); 884c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Fields.push_back(C); 885c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 886c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // Flags. 887c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson const llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy); 888c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Fields.push_back(llvm::ConstantInt::get(Ty, 1992)); 889c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 890c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // String pointer. 891c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson C = llvm::ConstantArray::get(str); 892c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson C = new llvm::GlobalVariable(C->getType(), true, 893c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::GlobalValue::InternalLinkage, 894c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson C, ".str", &getModule()); 895c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 896c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson C = llvm::ConstantExpr::getGetElementPtr(C, Zeros, 2); 897c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Fields.push_back(C); 898c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 899c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // String length. 900c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Ty = getTypes().ConvertType(getContext().LongTy); 901c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Fields.push_back(llvm::ConstantInt::get(Ty, str.length())); 902c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 903c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // The struct. 904c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Ty = getTypes().ConvertType(getContext().getCFConstantStringType()); 905c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson C = llvm::ConstantStruct::get(cast<llvm::StructType>(Ty), Fields); 9060c67829763b98bc670062b553897a851fab17401Anders Carlsson llvm::GlobalVariable *GV = 9070c67829763b98bc670062b553897a851fab17401Anders Carlsson new llvm::GlobalVariable(C->getType(), true, 9080c67829763b98bc670062b553897a851fab17401Anders Carlsson llvm::GlobalVariable::InternalLinkage, 9090c67829763b98bc670062b553897a851fab17401Anders Carlsson C, "", &getModule()); 9100c67829763b98bc670062b553897a851fab17401Anders Carlsson GV->setSection("__DATA,__cfstring"); 9110c67829763b98bc670062b553897a851fab17401Anders Carlsson Entry.setValue(GV); 9120c67829763b98bc670062b553897a851fab17401Anders Carlsson return GV; 913c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson} 91445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 9151e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar/// getStringForStringLiteral - Return the appropriate bytes for a 9161e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar/// string literal, properly padded to match the literal type. 9171e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbarstd::string CodeGenModule::getStringForStringLiteral(const StringLiteral *E) { 9181e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar assert(!E->isWide() && "FIXME: Wide strings not supported yet!"); 9191e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar const char *StrData = E->getStrData(); 9201e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar unsigned Len = E->getByteLength(); 9211e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 9221e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar const ConstantArrayType *CAT = 9231e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar getContext().getAsConstantArrayType(E->getType()); 9241e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar assert(CAT && "String isn't pointer or array!"); 9251e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 9261e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar // Resize the string to the right size 9271e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar // FIXME: What about wchar_t strings? 9281e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar std::string Str(StrData, StrData+Len); 9291e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar uint64_t RealLen = CAT->getSize().getZExtValue(); 9301e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar Str.resize(RealLen, '\0'); 9311e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 9321e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar return Str; 9331e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar} 9341e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 935a7ad98ff0919d6a24ea7c46634ea29bea551c1a0Chris Lattner/// GenerateWritableString -- Creates storage for a string literal. 93645e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattnerstatic llvm::Constant *GenerateStringLiteral(const std::string &str, 93745e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner bool constant, 9382c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner CodeGenModule &CGM) { 93945e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner // Create Constant for this string literal 9401e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar llvm::Constant *C = llvm::ConstantArray::get(str); 94145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 94245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner // Create a global variable for this string 94345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner C = new llvm::GlobalVariable(C->getType(), constant, 94445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner llvm::GlobalValue::InternalLinkage, 9452c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner C, ".str", &CGM.getModule()); 94645e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner return C; 94745e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner} 94845e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 949a7ad98ff0919d6a24ea7c46634ea29bea551c1a0Chris Lattner/// CodeGenModule::GetAddrOfConstantString -- returns a pointer to the character 950a7ad98ff0919d6a24ea7c46634ea29bea551c1a0Chris Lattner/// array containing the literal. The result is pointer to array type. 95145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattnerllvm::Constant *CodeGenModule::GetAddrOfConstantString(const std::string &str) { 95245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner // Don't share any string literals if writable-strings is turned on. 95345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner if (Features.WritableStrings) 95445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner return GenerateStringLiteral(str, false, *this); 95545e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 95645e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner llvm::StringMapEntry<llvm::Constant *> &Entry = 95745e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner ConstantStringMap.GetOrCreateValue(&str[0], &str[str.length()]); 95845e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 95945e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner if (Entry.getValue()) 96045e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner return Entry.getValue(); 96145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 96245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner // Create a global variable for this. 96345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner llvm::Constant *C = GenerateStringLiteral(str, true, *this); 96445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner Entry.setValue(C); 96545e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner return C; 96645e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner} 967