CodeGenModule.cpp revision f77ac86f4eca528a04b817d7ad7f045a47d52712
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, 33f77ac86f4eca528a04b817d7ad7f045a47d52712Daniel Dunbar Diagnostic &diags, bool GenerateDebugInfo) 34fb97b03e42d397405f617be0252be83e77a66f6eChris Lattner : Context(C), Features(LO), TheModule(M), TheTargetData(TD), Diags(diags), 35208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar Types(C, M, TD), Runtime(0), MemCpyFn(0), MemMoveFn(0), MemSetFn(0), 360c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman CFConstantStringClassRef(0) { 37208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar 38208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar if (Features.ObjC1) { 39f77ac86f4eca528a04b817d7ad7f045a47d52712Daniel Dunbar if (Features.NeXTRuntime) { 40208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar Runtime = CreateMacObjCRuntime(*this); 41208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar } else { 42208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar Runtime = CreateGNUObjCRuntime(*this); 43208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar } 44c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel Dunbar } 45e8b9f5b8ea60983c4a74cb8b63879616b914b65aSanjiv Gupta 46e8b9f5b8ea60983c4a74cb8b63879616b914b65aSanjiv Gupta // If debug info generation is enabled, create the CGDebugInfo object. 47815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek DebugInfo = GenerateDebugInfo ? new CGDebugInfo(this) : 0; 482b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris Lattner} 492b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris Lattner 502b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris LattnerCodeGenModule::~CodeGenModule() { 51815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek delete Runtime; 52815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek delete DebugInfo; 53815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek} 54815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek 55815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenekvoid CodeGenModule::Release() { 5620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov EmitStatics(); 57208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar if (Runtime) 58208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar if (llvm::Function *ObjCInitFunction = Runtime->ModuleInitFunction()) 59208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar AddGlobalCtor(ObjCInitFunction); 606bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar EmitCtorList(GlobalCtors, "llvm.global_ctors"); 616bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar EmitCtorList(GlobalDtors, "llvm.global_dtors"); 62532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman EmitAnnotations(); 63a1945fa74d04098d7e22d7c31585342555eca928Chris Lattner // Run the verifier to check that the generated code is consistent. 64a1945fa74d04098d7e22d7c31585342555eca928Chris Lattner assert(!verifyModule(TheModule)); 652b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris Lattner} 665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 672c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner/// WarnUnsupported - Print out a warning that codegen doesn't support the 682c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner/// specified stmt yet. 692c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattnervoid CodeGenModule::WarnUnsupported(const Stmt *S, const char *Type) { 702c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner unsigned DiagID = getDiags().getCustomDiagID(Diagnostic::Warning, 712c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner "cannot codegen this %0 yet"); 722c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner SourceRange Range = S->getSourceRange(); 732c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner std::string Msg = Type; 749c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek getDiags().Report(Context.getFullLoc(S->getLocStart()), DiagID, 757a9d49fd2bfac00e905b361ba76d26ab5b6c3b09Ted Kremenek &Msg, 1, &Range, 1); 762c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner} 7758c3f9ec11cbe852a518bf2f83af46f938b7b852Chris Lattner 78c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner/// WarnUnsupported - Print out a warning that codegen doesn't support the 79c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner/// specified decl yet. 80c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattnervoid CodeGenModule::WarnUnsupported(const Decl *D, const char *Type) { 81c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner unsigned DiagID = getDiags().getCustomDiagID(Diagnostic::Warning, 82c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner "cannot codegen this %0 yet"); 83c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner std::string Msg = Type; 84c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID, 85c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner &Msg, 1); 86c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner} 87c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner 884f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman/// setVisibility - Set the visibility for the given LLVM GlobalValue 894f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman/// according to the given clang AST visibility value. 904f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanvoid CodeGenModule::setVisibility(llvm::GlobalValue *GV, 914f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman VisibilityAttr::VisibilityTypes Vis) { 924f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman switch (Vis) { 934f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman default: assert(0 && "Unknown visibility!"); 944f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman case VisibilityAttr::DefaultVisibility: 954f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman GV->setVisibility(llvm::GlobalValue::DefaultVisibility); 964f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman break; 974f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman case VisibilityAttr::HiddenVisibility: 984f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman GV->setVisibility(llvm::GlobalValue::HiddenVisibility); 994f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman break; 1004f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman case VisibilityAttr::ProtectedVisibility: 1014f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman GV->setVisibility(llvm::GlobalValue::ProtectedVisibility); 1024f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman break; 1034f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman } 1044f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman} 1054f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman 1066d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner/// AddGlobalCtor - Add a function to the list that will be called before 1076d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner/// main() runs. 1086bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::AddGlobalCtor(llvm::Function * Ctor, int Priority) { 1096d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner // TODO: Type coercion of void()* types. 1106bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar GlobalCtors.push_back(std::make_pair(Ctor, Priority)); 1116d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner} 1126d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner 1136bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar/// AddGlobalDtor - Add a function to the list that will be called 1146bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar/// when the module is unloaded. 1156bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::AddGlobalDtor(llvm::Function * Dtor, int Priority) { 1166bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // TODO: Type coercion of void()* types. 1176bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar GlobalDtors.push_back(std::make_pair(Dtor, Priority)); 1186bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar} 1196bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1206bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) { 1216bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // Ctor function type is void()*. 1226bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::FunctionType* CtorFTy = 1236bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::FunctionType::get(llvm::Type::VoidTy, 1246bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar std::vector<const llvm::Type*>(), 1256bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar false); 1266bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy); 1276bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1286bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // Get the type of a ctor entry, { i32, void ()* }. 129572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner llvm::StructType* CtorStructTy = 1306bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::StructType::get(llvm::Type::Int32Ty, 1316bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::PointerType::getUnqual(CtorFTy), NULL); 1326bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1336bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // Construct the constructor and destructor arrays. 1346bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar std::vector<llvm::Constant*> Ctors; 1356bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar for (CtorList::const_iterator I = Fns.begin(), E = Fns.end(); I != E; ++I) { 1366bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar std::vector<llvm::Constant*> S; 1376bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar S.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty, I->second, false)); 1386bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar S.push_back(llvm::ConstantExpr::getBitCast(I->first, CtorPFTy)); 1396bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar Ctors.push_back(llvm::ConstantStruct::get(CtorStructTy, S)); 1406bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar } 1416bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1426bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar if (!Ctors.empty()) { 1436bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::ArrayType *AT = llvm::ArrayType::get(CtorStructTy, Ctors.size()); 1446bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar new llvm::GlobalVariable(AT, false, 145572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner llvm::GlobalValue::AppendingLinkage, 1466bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::ConstantArray::get(AT, Ctors), 1476bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar GlobalName, 148572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner &TheModule); 1496d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner } 1506d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner} 1516d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner 152532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begemanvoid CodeGenModule::EmitAnnotations() { 153532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman if (Annotations.empty()) 154532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman return; 155532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman 156532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman // Create a new global variable for the ConstantStruct in the Module. 157532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::Constant *Array = 158532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::ConstantArray::get(llvm::ArrayType::get(Annotations[0]->getType(), 159532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman Annotations.size()), 160532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman Annotations); 161532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::GlobalValue *gv = 162532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman new llvm::GlobalVariable(Array->getType(), false, 163532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::GlobalValue::AppendingLinkage, Array, 164532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman "llvm.global.annotations", &TheModule); 165532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman gv->setSection("llvm.metadata"); 166532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman} 167532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman 168ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedmanbool hasAggregateLLVMType(QualType T) { 169ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman return !T->isRealType() && !T->isPointerLikeType() && 170ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman !T->isVoidType() && !T->isVectorType() && !T->isFunctionType(); 171ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman} 172ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 173d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopesvoid CodeGenModule::SetGlobalValueAttributes(const FunctionDecl *FD, 174d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes llvm::GlobalValue *GV) { 175d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes // TODO: Set up linkage and many other things. Note, this is a simple 176d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes // approximation of what we really want. 177d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes if (FD->getStorageClass() == FunctionDecl::Static) 178d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes GV->setLinkage(llvm::Function::InternalLinkage); 179d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes else if (FD->getAttr<DLLImportAttr>()) 180d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes GV->setLinkage(llvm::Function::DLLImportLinkage); 181d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes else if (FD->getAttr<DLLExportAttr>()) 182d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes GV->setLinkage(llvm::Function::DLLExportLinkage); 183d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes else if (FD->getAttr<WeakAttr>() || FD->isInline()) 184d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes GV->setLinkage(llvm::Function::WeakLinkage); 185d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 186d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes if (const VisibilityAttr *attr = FD->getAttr<VisibilityAttr>()) 187d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes CodeGenModule::setVisibility(GV, attr->getVisibility()); 188d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes // FIXME: else handle -fvisibility 189a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar 190a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar if (const AsmLabelAttr *ALA = FD->getAttr<AsmLabelAttr>()) { 191a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // Prefaced with special LLVM marker to indicate that the name 192a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // should not be munged. 193a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar GV->setName("\01" + ALA->getLabel()); 194a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar } 195d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes} 196d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 197ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedmanvoid CodeGenModule::SetFunctionAttributes(const FunctionDecl *FD, 198ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman llvm::Function *F, 199ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman const llvm::FunctionType *FTy) { 200ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman unsigned FuncAttrs = 0; 201ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman if (FD->getAttr<NoThrowAttr>()) 202ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman FuncAttrs |= llvm::ParamAttr::NoUnwind; 203ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman if (FD->getAttr<NoReturnAttr>()) 204ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman FuncAttrs |= llvm::ParamAttr::NoReturn; 205ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 206ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman llvm::SmallVector<llvm::ParamAttrsWithIndex, 8> ParamAttrList; 207ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman if (FuncAttrs) 208ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman ParamAttrList.push_back(llvm::ParamAttrsWithIndex::get(0, FuncAttrs)); 209ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman // Note that there is parallel code in CodeGenFunction::EmitCallExpr 210ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman bool AggregateReturn = hasAggregateLLVMType(FD->getResultType()); 211ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman if (AggregateReturn) 212ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman ParamAttrList.push_back( 213ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman llvm::ParamAttrsWithIndex::get(1, llvm::ParamAttr::StructRet)); 214ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman unsigned increment = AggregateReturn ? 2 : 1; 215c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman const FunctionTypeProto* FTP = dyn_cast<FunctionTypeProto>(FD->getType()); 216c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman if (FTP) { 217c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman for (unsigned i = 0; i < FTP->getNumArgs(); i++) { 218c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman QualType ParamType = FTP->getArgType(i); 219c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman unsigned ParamAttrs = 0; 220c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman if (ParamType->isRecordType()) 221c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman ParamAttrs |= llvm::ParamAttr::ByVal; 222a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner if (ParamType->isSignedIntegerType() && 223a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner ParamType->isPromotableIntegerType()) 224c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman ParamAttrs |= llvm::ParamAttr::SExt; 225a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner if (ParamType->isUnsignedIntegerType() && 226a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner ParamType->isPromotableIntegerType()) 227c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman ParamAttrs |= llvm::ParamAttr::ZExt; 228c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman if (ParamAttrs) 229c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman ParamAttrList.push_back(llvm::ParamAttrsWithIndex::get(i + increment, 230c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman ParamAttrs)); 231c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman } 232ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman } 233c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman 234ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman F->setParamAttrs(llvm::PAListPtr::get(ParamAttrList.begin(), 235ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman ParamAttrList.size())); 236ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 237ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman // Set the appropriate calling convention for the Function. 238ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman if (FD->getAttr<FastCallAttr>()) 239ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman F->setCallingConv(llvm::CallingConv::Fast); 240ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 241d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes SetGlobalValueAttributes(FD, F); 242ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman} 243ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 244391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattnervoid CodeGenModule::EmitObjCMethod(const ObjCMethodDecl *OMD) { 245391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // If this is not a prototype, emit the body. 246391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner if (OMD->getBody()) 247391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner CodeGenFunction(*this).GenerateObjCMethod(OMD); 248391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner} 24920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikovvoid CodeGenModule::EmitObjCProtocolImplementation(const ObjCProtocolDecl *PD){ 25020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<std::string, 16> Protocols; 251780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner for (ObjCProtocolDecl::protocol_iterator PI = PD->protocol_begin(), 252780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner E = PD->protocol_end(); PI != E; ++PI) 253780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner Protocols.push_back((*PI)->getName()); 25420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> InstanceMethodNames; 25520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> InstanceMethodTypes; 25620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCProtocolDecl::instmeth_iterator iter = PD->instmeth_begin(), 257780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner E = PD->instmeth_end(); iter != E; iter++) { 25820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 259780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner Context.getObjCEncodingForMethodDecl(*iter, TypeStr); 26020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov InstanceMethodNames.push_back( 26120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov GetAddrOfConstantString((*iter)->getSelector().getName())); 26220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov InstanceMethodTypes.push_back(GetAddrOfConstantString(TypeStr)); 26320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 26420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect information about class methods: 26520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> ClassMethodNames; 26620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> ClassMethodTypes; 26720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCProtocolDecl::classmeth_iterator iter = PD->classmeth_begin(), 26820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov endIter = PD->classmeth_end() ; iter != endIter ; iter++) { 26920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 27020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Context.getObjCEncodingForMethodDecl((*iter),TypeStr); 27120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ClassMethodNames.push_back( 27220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov GetAddrOfConstantString((*iter)->getSelector().getName())); 27320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ClassMethodTypes.push_back(GetAddrOfConstantString(TypeStr)); 27420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 27520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Runtime->GenerateProtocol(PD->getName(), Protocols, InstanceMethodNames, 27620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov InstanceMethodTypes, ClassMethodNames, ClassMethodTypes); 27720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov} 27820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 27920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikovvoid CodeGenModule::EmitObjCCategoryImpl(const ObjCCategoryImplDecl *OCD) { 28020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 28120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect information about instance methods 282a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner llvm::SmallVector<Selector, 16> InstanceMethodSels; 28320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> InstanceMethodTypes; 28420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCCategoryDecl::instmeth_iterator iter = OCD->instmeth_begin(), 28520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov endIter = OCD->instmeth_end() ; iter != endIter ; iter++) { 286a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner InstanceMethodSels.push_back((*iter)->getSelector()); 28720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 288fba676396703e87a5034e5f308aa30a633468f66Chris Lattner Context.getObjCEncodingForMethodDecl(*iter,TypeStr); 28920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov InstanceMethodTypes.push_back(GetAddrOfConstantString(TypeStr)); 29020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 29120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 29220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect information about class methods 293a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner llvm::SmallVector<Selector, 16> ClassMethodSels; 29420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> ClassMethodTypes; 29520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCCategoryDecl::classmeth_iterator iter = OCD->classmeth_begin(), 29620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov endIter = OCD->classmeth_end() ; iter != endIter ; iter++) { 297a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner ClassMethodSels.push_back((*iter)->getSelector()); 29820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 299fba676396703e87a5034e5f308aa30a633468f66Chris Lattner Context.getObjCEncodingForMethodDecl(*iter,TypeStr); 30020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ClassMethodTypes.push_back(GetAddrOfConstantString(TypeStr)); 30120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 30220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 30320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect the names of referenced protocols 30420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<std::string, 16> Protocols; 3053db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner const ObjCInterfaceDecl *ClassDecl = OCD->getClassInterface(); 3063db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner const ObjCList<ObjCProtocolDecl> &Protos =ClassDecl->getReferencedProtocols(); 3073db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner for (ObjCList<ObjCProtocolDecl>::iterator I = Protos.begin(), 3083db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner E = Protos.end(); I != E; ++I) 3093db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner Protocols.push_back((*I)->getName()); 31020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 31120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Generate the category 31220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Runtime->GenerateCategory(OCD->getClassInterface()->getName(), 313a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner OCD->getName(), InstanceMethodSels, InstanceMethodTypes, 314a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner ClassMethodSels, ClassMethodTypes, Protocols); 31520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov} 31620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 31720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikovvoid CodeGenModule::EmitObjCClassImplementation( 31820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov const ObjCImplementationDecl *OID) { 31920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Get the superclass name. 32020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov const ObjCInterfaceDecl * SCDecl = OID->getClassInterface()->getSuperClass(); 32120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov const char * SCName = NULL; 32220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov if (SCDecl) { 32320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov SCName = SCDecl->getName(); 32420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 32520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 32620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Get the class name 32720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ObjCInterfaceDecl * ClassDecl = (ObjCInterfaceDecl*)OID->getClassInterface(); 32820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov const char * ClassName = ClassDecl->getName(); 32920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 33020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Get the size of instances. For runtimes that support late-bound instances 33120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // this should probably be something different (size just of instance 33220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // varaibles in this class, not superclasses?). 33320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov int instanceSize = 0; 33420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov const llvm::Type *ObjTy; 33520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov if (!Runtime->LateBoundIVars()) { 33620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ObjTy = getTypes().ConvertType(Context.getObjCInterfaceType(ClassDecl)); 33720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov instanceSize = TheTargetData.getABITypeSize(ObjTy); 33820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 33920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 34020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect information about instance variables. 34120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> IvarNames; 34220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> IvarTypes; 34320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> IvarOffsets; 34420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov const llvm::StructLayout *Layout = 34520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov TheTargetData.getStructLayout(cast<llvm::StructType>(ObjTy)); 34620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ObjTy = llvm::PointerType::getUnqual(ObjTy); 34720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCInterfaceDecl::ivar_iterator iter = ClassDecl->ivar_begin(), 34820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov endIter = ClassDecl->ivar_end() ; iter != endIter ; iter++) { 34920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Store the name 35020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov IvarNames.push_back(GetAddrOfConstantString((*iter)->getName())); 35120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Get the type encoding for this ivar 35220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 35320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<const RecordType *, 8> EncodingRecordTypes; 35420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Context.getObjCEncodingForType((*iter)->getType(), TypeStr, 35520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov EncodingRecordTypes); 35620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov IvarTypes.push_back(GetAddrOfConstantString(TypeStr)); 35720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Get the offset 35820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov int offset = 35920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov (int)Layout->getElementOffset(getTypes().getLLVMFieldNo(*iter)); 36020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov IvarOffsets.push_back( 36120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::ConstantInt::get(llvm::Type::Int32Ty, offset)); 36220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 36320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 36420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect information about instance methods 365a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner llvm::SmallVector<Selector, 16> InstanceMethodSels; 36620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> InstanceMethodTypes; 36720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCImplementationDecl::instmeth_iterator iter = OID->instmeth_begin(), 36820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov endIter = OID->instmeth_end() ; iter != endIter ; iter++) { 369a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner InstanceMethodSels.push_back((*iter)->getSelector()); 37020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 37120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Context.getObjCEncodingForMethodDecl((*iter),TypeStr); 37220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov InstanceMethodTypes.push_back(GetAddrOfConstantString(TypeStr)); 37320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 37420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 37520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect information about class methods 376a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner llvm::SmallVector<Selector, 16> ClassMethodSels; 37720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> ClassMethodTypes; 37820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCImplementationDecl::classmeth_iterator iter = OID->classmeth_begin(), 37920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov endIter = OID->classmeth_end() ; iter != endIter ; iter++) { 380a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner ClassMethodSels.push_back((*iter)->getSelector()); 38120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 38220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Context.getObjCEncodingForMethodDecl((*iter),TypeStr); 38320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ClassMethodTypes.push_back(GetAddrOfConstantString(TypeStr)); 38420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 38520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect the names of referenced protocols 38620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<std::string, 16> Protocols; 3873db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner const ObjCList<ObjCProtocolDecl> &Protos =ClassDecl->getReferencedProtocols(); 3883db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner for (ObjCList<ObjCProtocolDecl>::iterator I = Protos.begin(), 3893db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner E = Protos.end(); I != E; ++I) 3903db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner Protocols.push_back((*I)->getName()); 39120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 39220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Generate the category 39320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Runtime->GenerateClass(ClassName, SCName, instanceSize, IvarNames, IvarTypes, 394a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner IvarOffsets, InstanceMethodSels, InstanceMethodTypes, 395a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner ClassMethodSels, ClassMethodTypes, Protocols); 39620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov} 39720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 3984c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begemanvoid CodeGenModule::EmitStatics() { 3994c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // Emit code for each used static decl encountered. Since a previously unused 4004c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // static decl may become used during the generation of code for a static 4014c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // function, iterate until no changes are made. 4024c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman bool Changed; 4034c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman do { 4044c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman Changed = false; 4054c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman for (unsigned i = 0, e = StaticDecls.size(); i != e; ++i) { 406bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar const ValueDecl *D = StaticDecls[i]; 4076f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman 4086f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman // Check if we have used a decl with the same name 4096f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman // FIXME: The AST should have some sort of aggregate decls or 4106f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman // global symbol map. 411a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar if (!GlobalDeclMap.count(D->getName())) 412a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar continue; 4136f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman 414bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Emit the definition. 415bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalDefinition(D); 416bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 4174c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // Erase the used decl from the list. 4184c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman StaticDecls[i] = StaticDecls.back(); 4194c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman StaticDecls.pop_back(); 4204c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman --i; 4214c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman --e; 4224c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman 4234c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // Remember that we made a change. 4244c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman Changed = true; 4254c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman } 4264c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman } while (Changed); 4275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 4285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4298bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// EmitAnnotateAttr - Generate the llvm::ConstantStruct which contains the 4308bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// annotation information for a given GlobalValue. The annotation struct is 4318bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// {i8 *, i8 *, i8 *, i32}. The first field is a constant expression, the 4323c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar/// GlobalValue being annotated. The second field is the constant string 4338bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// created from the AnnotateAttr's annotation. The third field is a constant 4348bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// string containing the name of the translation unit. The fourth field is 4358bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// the line number in the file of the annotated value declaration. 4368bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// 4378bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// FIXME: this does not unique the annotation string constants, as llvm-gcc 4388bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// appears to. 4398bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// 4408bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begemanllvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV, 4418bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman const AnnotateAttr *AA, 4428bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman unsigned LineNo) { 4438bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Module *M = &getModule(); 4448bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 4458bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // get [N x i8] constants for the annotation string, and the filename string 4468bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // which are the 2nd and 3rd elements of the global annotation structure. 4478bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman const llvm::Type *SBP = llvm::PointerType::getUnqual(llvm::Type::Int8Ty); 4488bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Constant *anno = llvm::ConstantArray::get(AA->getAnnotation(), true); 4498bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Constant *unit = llvm::ConstantArray::get(M->getModuleIdentifier(), 4508bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman true); 4518bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 4528bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // Get the two global values corresponding to the ConstantArrays we just 4538bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // created to hold the bytes of the strings. 4548bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue *annoGV = 4558bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman new llvm::GlobalVariable(anno->getType(), false, 4568bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue::InternalLinkage, anno, 4578bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman GV->getName() + ".str", M); 4588bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // translation unit name string, emitted into the llvm.metadata section. 4598bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue *unitGV = 4608bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman new llvm::GlobalVariable(unit->getType(), false, 4618bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue::InternalLinkage, unit, ".str", M); 4628bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 4638bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // Create the ConstantStruct that is the global annotion. 4648bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Constant *Fields[4] = { 4658bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantExpr::getBitCast(GV, SBP), 4668bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantExpr::getBitCast(annoGV, SBP), 4678bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantExpr::getBitCast(unitGV, SBP), 4688bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantInt::get(llvm::Type::Int32Ty, LineNo) 4698bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman }; 4708bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman return llvm::ConstantStruct::get(Fields, 4, false); 4718bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman} 4728bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 473bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobal(const ValueDecl *Global) { 474bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar bool isDef, isStatic; 475bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 476bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Global)) { 477bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar isDef = (FD->isThisDeclarationADefinition() || 478bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar FD->getAttr<AliasAttr>()); 479bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar isStatic = FD->getStorageClass() == FunctionDecl::Static; 480bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else if (const VarDecl *VD = cast<VarDecl>(Global)) { 481bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar assert(VD->isFileVarDecl() && "Cannot emit local var decl as global."); 482bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 483bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar isDef = !(VD->getStorageClass() == VarDecl::Extern && VD->getInit() == 0); 484bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar isStatic = VD->getStorageClass() == VarDecl::Static; 485bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 486bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar assert(0 && "Invalid argument to EmitGlobal"); 4874c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman return; 4884c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman } 4894c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman 490bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Forward declarations are emitted lazily on first use. 491bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (!isDef) 49288a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner return; 493bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 494bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // If the global is a static, defer code generation until later so 495bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // we can easily omit unused statics. 496bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (isStatic) { 497bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar StaticDecls.push_back(Global); 498bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar return; 499bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 500bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 501bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Otherwise emit the definition. 502bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalDefinition(Global); 5034c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman} 5044c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman 505bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalDefinition(const ValueDecl *D) { 506bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 507bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalFunctionDefinition(FD); 508bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 509bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalVarDefinition(VD); 510bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 511bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar assert(0 && "Invalid argument to EmitGlobalDefinition()"); 512bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 513bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 514bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 5159986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D) { 51677ba708819285931932ecd33691a672bb59d221aEli Friedman assert(D->hasGlobalStorage() && "Not a global variable"); 51777ba708819285931932ecd33691a672bb59d221aEli Friedman 518bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar QualType ASTTy = D->getType(); 519bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar const llvm::Type *Ty = getTypes().ConvertTypeForMem(ASTTy); 5209986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar const llvm::Type *PTy = llvm::PointerType::get(Ty, ASTTy.getAddressSpace()); 521bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 5223c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar // Lookup the entry, lazily creating it if necessary. 5233c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getName()]; 5243c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (!Entry) 5253c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry = new llvm::GlobalVariable(Ty, false, 5263c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue::ExternalLinkage, 5273c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 0, D->getName(), &getModule(), 0, 5283c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar ASTTy.getAddressSpace()); 5293c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 5309986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar // Make sure the result is of the correct type. 5319986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar return llvm::ConstantExpr::getBitCast(Entry, PTy); 532bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 533bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 534bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) { 5358f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner llvm::Constant *Init = 0; 53677ba708819285931932ecd33691a672bb59d221aEli Friedman QualType ASTTy = D->getType(); 53777ba708819285931932ecd33691a672bb59d221aEli Friedman const llvm::Type *VarTy = getTypes().ConvertTypeForMem(ASTTy); 53877ba708819285931932ecd33691a672bb59d221aEli Friedman 5398f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner if (D->getInit() == 0) { 540cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // This is a tentative definition; tentative definitions are 541cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // implicitly initialized with { 0 } 542cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman const llvm::Type* InitTy; 543cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman if (ASTTy->isIncompleteArrayType()) { 544cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // An incomplete array is normally [ TYPE x 0 ], but we need 545cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // to fix it to [ TYPE x 1 ]. 546cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman const llvm::ArrayType* ATy = cast<llvm::ArrayType>(VarTy); 547cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman InitTy = llvm::ArrayType::get(ATy->getElementType(), 1); 548cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman } else { 549cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman InitTy = VarTy; 550cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman } 551cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman Init = llvm::Constant::getNullValue(InitTy); 55277ba708819285931932ecd33691a672bb59d221aEli Friedman } else { 553bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar Init = EmitConstantExpr(D->getInit()); 5548f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner } 55577ba708819285931932ecd33691a672bb59d221aEli Friedman const llvm::Type* InitType = Init->getType(); 5568e53e720b3d7c962e91138a130dbd5d6c2def0e5Devang Patel 5573c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getName()]; 5583c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalVariable *GV = cast_or_null<llvm::GlobalVariable>(Entry); 5593c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 56077ba708819285931932ecd33691a672bb59d221aEli Friedman if (!GV) { 56177ba708819285931932ecd33691a672bb59d221aEli Friedman GV = new llvm::GlobalVariable(InitType, false, 56277ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::GlobalValue::ExternalLinkage, 56377ba708819285931932ecd33691a672bb59d221aEli Friedman 0, D->getName(), &getModule(), 0, 56477ba708819285931932ecd33691a672bb59d221aEli Friedman ASTTy.getAddressSpace()); 5653c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar } else if (GV->getType() != 5663c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::PointerType::get(InitType, ASTTy.getAddressSpace())) { 56777ba708819285931932ecd33691a672bb59d221aEli Friedman // We have a definition after a prototype with the wrong type. 56877ba708819285931932ecd33691a672bb59d221aEli Friedman // We must make a new GlobalVariable* and update everything that used OldGV 56977ba708819285931932ecd33691a672bb59d221aEli Friedman // (a declaration or tentative definition) with the new GlobalVariable* 57077ba708819285931932ecd33691a672bb59d221aEli Friedman // (which will be a definition). 57177ba708819285931932ecd33691a672bb59d221aEli Friedman // 57277ba708819285931932ecd33691a672bb59d221aEli Friedman // This happens if there is a prototype for a global (e.g. "extern int x[];") 57377ba708819285931932ecd33691a672bb59d221aEli Friedman // and then a definition of a different type (e.g. "int x[10];"). This also 57477ba708819285931932ecd33691a672bb59d221aEli Friedman // happens when an initializer has a different type from the type of the 57577ba708819285931932ecd33691a672bb59d221aEli Friedman // global (this happens with unions). 576cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // 577cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // FIXME: This also ends up happening if there's a definition followed by 578cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // a tentative definition! (Although Sema rejects that construct 579cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // at the moment.) 58077ba708819285931932ecd33691a672bb59d221aEli Friedman 58177ba708819285931932ecd33691a672bb59d221aEli Friedman // Save the old global 58277ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::GlobalVariable *OldGV = GV; 58377ba708819285931932ecd33691a672bb59d221aEli Friedman 58477ba708819285931932ecd33691a672bb59d221aEli Friedman // Make a new global with the correct type 58577ba708819285931932ecd33691a672bb59d221aEli Friedman GV = new llvm::GlobalVariable(InitType, false, 58677ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::GlobalValue::ExternalLinkage, 58777ba708819285931932ecd33691a672bb59d221aEli Friedman 0, D->getName(), &getModule(), 0, 58877ba708819285931932ecd33691a672bb59d221aEli Friedman ASTTy.getAddressSpace()); 58977ba708819285931932ecd33691a672bb59d221aEli Friedman // Steal the name of the old global 59077ba708819285931932ecd33691a672bb59d221aEli Friedman GV->takeName(OldGV); 59177ba708819285931932ecd33691a672bb59d221aEli Friedman 59277ba708819285931932ecd33691a672bb59d221aEli Friedman // Replace all uses of the old global with the new global 59377ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::Constant *NewPtrForOldDecl = 59477ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::ConstantExpr::getBitCast(GV, OldGV->getType()); 59577ba708819285931932ecd33691a672bb59d221aEli Friedman OldGV->replaceAllUsesWith(NewPtrForOldDecl); 59677ba708819285931932ecd33691a672bb59d221aEli Friedman 59777ba708819285931932ecd33691a672bb59d221aEli Friedman // Erase the old global, since it is no longer used. 59877ba708819285931932ecd33691a672bb59d221aEli Friedman OldGV->eraseFromParent(); 59977ba708819285931932ecd33691a672bb59d221aEli Friedman } 60077ba708819285931932ecd33691a672bb59d221aEli Friedman 6013c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry = GV; 6029e32d4b4a7270a9701b7cb454381eeaa4cc42a77Devang Patel 6038bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman if (const AnnotateAttr *AA = D->getAttr<AnnotateAttr>()) { 6048bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman SourceManager &SM = Context.getSourceManager(); 6058bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman AddAnnotation(EmitAnnotateAttr(GV, AA, 6068bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman SM.getLogicalLineNumber(D->getLocation()))); 6078bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman } 6088bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 60988a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner GV->setInitializer(Init); 610ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 611cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // FIXME: This is silly; getTypeAlign should just work for incomplete arrays 612cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman unsigned Align; 613c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const IncompleteArrayType* IAT = 614c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner Context.getAsIncompleteArrayType(D->getType())) 615cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman Align = Context.getTypeAlign(IAT->getElementType()); 616cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman else 617cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman Align = Context.getTypeAlign(D->getType()); 61808d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman if (const AlignedAttr* AA = D->getAttr<AlignedAttr>()) { 61908d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman Align = std::max(Align, AA->getAlignment()); 62008d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman } 62108d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman GV->setAlignment(Align / 8); 62208d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman 623ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner if (const VisibilityAttr *attr = D->getAttr<VisibilityAttr>()) 6244f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman setVisibility(GV, attr->getVisibility()); 625ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // FIXME: else handle -fvisibility 626a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar 627a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar if (const AsmLabelAttr *ALA = D->getAttr<AsmLabelAttr>()) { 628a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // Prefaced with special LLVM marker to indicate that the name 629a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // should not be munged. 630a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar GV->setName("\01" + ALA->getLabel()); 631a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar } 63288a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner 63388a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner // Set the llvm linkage type as appropriate. 6348fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner if (D->getStorageClass() == VarDecl::Static) 6358fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner GV->setLinkage(llvm::Function::InternalLinkage); 6368fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner else if (D->getAttr<DLLImportAttr>()) 637ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner GV->setLinkage(llvm::Function::DLLImportLinkage); 638ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner else if (D->getAttr<DLLExportAttr>()) 639ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner GV->setLinkage(llvm::Function::DLLExportLinkage); 6408fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner else if (D->getAttr<WeakAttr>()) 641ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner GV->setLinkage(llvm::GlobalVariable::WeakLinkage); 6428fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner else { 643ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // FIXME: This isn't right. This should handle common linkage and other 644ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // stuff. 645ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner switch (D->getStorageClass()) { 6468fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner case VarDecl::Static: assert(0 && "This case handled above"); 647ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::Auto: 648ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::Register: 649ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner assert(0 && "Can't have auto or register globals"); 650ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::None: 651ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner if (!D->getInit()) 652a07b76419a03f126c22949dce2e546ba4df0e415Eli Friedman GV->setLinkage(llvm::GlobalVariable::CommonLinkage); 653ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner break; 654ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::Extern: 655ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::PrivateExtern: 656ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // todo: common 657ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner break; 658ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner } 65988a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner } 660686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta 661686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta // Emit global variable debug information. 662686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta CGDebugInfo *DI = getDebugInfo(); 663686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta if(DI) { 664686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta if(D->getLocation().isValid()) 665686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta DI->setLocation(D->getLocation()); 666686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta DI->EmitGlobalVariable(GV, D); 667686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta } 66888a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner} 6695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 670bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarllvm::GlobalValue * 671bd012ff1fa088181646a784f385b28867372d434Daniel DunbarCodeGenModule::EmitForwardFunctionDefinition(const FunctionDecl *D) { 672bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // FIXME: param attributes for sext/zext etc. 673bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (const AliasAttr *AA = D->getAttr<AliasAttr>()) { 674bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar assert(!D->getBody() && "Unexpected alias attr on function with body."); 675bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 676bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar const std::string& aliaseeName = AA->getAliasee(); 677bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Function *aliasee = getModule().getFunction(aliaseeName); 678bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::GlobalValue *alias = new llvm::GlobalAlias(aliasee->getType(), 679bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Function::ExternalLinkage, 680bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar D->getName(), 681bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar aliasee, 682bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar &getModule()); 683bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar SetGlobalValueAttributes(D, alias); 684bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar return alias; 685bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 686bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar const llvm::Type *Ty = getTypes().ConvertType(D->getType()); 687bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar const llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty); 688bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Function *F = llvm::Function::Create(FTy, 689bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Function::ExternalLinkage, 690bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar D->getName(), &getModule()); 691bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 692bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar SetFunctionAttributes(D, F, FTy); 693bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar return F; 694bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 695bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 696bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 697bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarllvm::Constant *CodeGenModule::GetAddrOfFunction(const FunctionDecl *D) { 6989986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar QualType ASTTy = D->getType(); 6999986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar const llvm::Type *Ty = getTypes().ConvertTypeForMem(ASTTy); 7009986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar const llvm::Type *PTy = llvm::PointerType::get(Ty, ASTTy.getAddressSpace()); 7013c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 7023c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar // Lookup the entry, lazily creating it if necessary. 7033c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getName()]; 7043c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (!Entry) 7053c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry = EmitForwardFunctionDefinition(D); 706bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 7079986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar return llvm::ConstantExpr::getBitCast(Entry, PTy); 708bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 709bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 710bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalFunctionDefinition(const FunctionDecl *D) { 7113c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getName()]; 7123c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (!Entry) { 713bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar Entry = EmitForwardFunctionDefinition(D); 714bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 7153c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar // If the types mismatch then we have to rewrite the definition. 7163c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar const llvm::Type *Ty = getTypes().ConvertType(D->getType()); 7173c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (Entry->getType() != llvm::PointerType::getUnqual(Ty)) { 718bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Otherwise, we have a definition after a prototype with the wrong type. 719bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // F is the Function* for the one with the wrong type, we must make a new 720bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Function* and update everything that used F (a declaration) with the new 721bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Function* (which will be a definition). 722bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // 723bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // This happens if there is a prototype for a function (e.g. "int f()") and 724bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // then a definition of a different type (e.g. "int f(int x)"). Start by 725bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // making a new function of the correct type, RAUW, then steal the name. 7263c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue *NewFn = EmitForwardFunctionDefinition(D); 7273c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar NewFn->takeName(Entry); 728bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 729bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Replace uses of F with the Function we will endow with a body. 730bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Constant *NewPtrForOldDecl = 7313c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::ConstantExpr::getBitCast(NewFn, Entry->getType()); 7323c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry->replaceAllUsesWith(NewPtrForOldDecl); 7333c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 734bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Ok, delete the old function now, which is dead. 7353c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar // FIXME: Add GlobalValue->eraseFromParent(). 7363c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar assert(Entry->isDeclaration() && "Shouldn't replace non-declaration"); 7373c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (llvm::Function *F = dyn_cast<llvm::Function>(Entry)) { 7383c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar F->eraseFromParent(); 7393c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar } else if (llvm::GlobalAlias *GA = dyn_cast<llvm::GlobalAlias>(Entry)) { 7403c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar GA->eraseFromParent(); 7413c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar } else { 7423c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar assert(0 && "Invalid global variable type."); 7433c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar } 744bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 745bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar Entry = NewFn; 746bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 747bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 748bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 749bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (D->getAttr<AliasAttr>()) { 750bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar ; 751bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 752bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Function *Fn = cast<llvm::Function>(Entry); 753bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar CodeGenFunction(*this).GenerateCode(D, Fn); 7546bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 7556379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar // Set attributes specific to definition. 7566379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar // FIXME: This needs to be cleaned up by clearly emitting the 7576379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar // declaration / definition at separate times. 7586379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar if (!Features.Exceptions) 7596379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar Fn->addParamAttr(0, llvm::ParamAttr::NoUnwind); 7606379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar 7616bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar if (const ConstructorAttr *CA = D->getAttr<ConstructorAttr>()) { 7626bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar AddGlobalCtor(Fn, CA->getPriority()); 7636bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar } else if (const DestructorAttr *DA = D->getAttr<DestructorAttr>()) { 7646bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar AddGlobalDtor(Fn, DA->getPriority()); 7656bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar } 766bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 767bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 768bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 769c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattnervoid CodeGenModule::UpdateCompletedType(const TagDecl *TD) { 770c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattner // Make sure that this type is translated. 771c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattner Types.UpdateCompletedType(TD); 772d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner} 773d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner 774d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner 775bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner/// getBuiltinLibFunction 776bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattnerllvm::Function *CodeGenModule::getBuiltinLibFunction(unsigned BuiltinID) { 7771426fecdf90dd1986751b9940422e675880ff671Chris Lattner if (BuiltinID > BuiltinFunctions.size()) 7781426fecdf90dd1986751b9940422e675880ff671Chris Lattner BuiltinFunctions.resize(BuiltinID); 779bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 7801426fecdf90dd1986751b9940422e675880ff671Chris Lattner // Cache looked up functions. Since builtin id #0 is invalid we don't reserve 7811426fecdf90dd1986751b9940422e675880ff671Chris Lattner // a slot for it. 7821426fecdf90dd1986751b9940422e675880ff671Chris Lattner assert(BuiltinID && "Invalid Builtin ID"); 7831426fecdf90dd1986751b9940422e675880ff671Chris Lattner llvm::Function *&FunctionSlot = BuiltinFunctions[BuiltinID-1]; 784bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner if (FunctionSlot) 785bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner return FunctionSlot; 786bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 787bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner assert(Context.BuiltinInfo.isLibFunction(BuiltinID) && "isn't a lib fn"); 788bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 789bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // Get the name, skip over the __builtin_ prefix. 790bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner const char *Name = Context.BuiltinInfo.GetName(BuiltinID)+10; 791bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 792bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // Get the type for the builtin. 793bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner QualType Type = Context.BuiltinInfo.GetBuiltinType(BuiltinID, Context); 794bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner const llvm::FunctionType *Ty = 795bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner cast<llvm::FunctionType>(getTypes().ConvertType(Type)); 796bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 797bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // FIXME: This has a serious problem with code like this: 798bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // void abs() {} 799bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // ... __builtin_abs(x); 800bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // The two versions of abs will collide. The fix is for the builtin to win, 801bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // and for the existing one to be turned into a constantexpr cast of the 802bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // builtin. In the case where the existing one is a static function, it 803bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // should just be renamed. 804c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner if (llvm::Function *Existing = getModule().getFunction(Name)) { 805c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner if (Existing->getFunctionType() == Ty && Existing->hasExternalLinkage()) 806c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner return FunctionSlot = Existing; 807c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner assert(Existing == 0 && "FIXME: Name collision"); 808c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner } 809bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 810bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // FIXME: param attributes for sext/zext etc. 8114c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman return FunctionSlot = 8124c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman llvm::Function::Create(Ty, llvm::Function::ExternalLinkage, Name, 8134c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman &getModule()); 814bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner} 815bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 8167acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattnerllvm::Function *CodeGenModule::getIntrinsic(unsigned IID,const llvm::Type **Tys, 8177acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner unsigned NumTys) { 8187acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner return llvm::Intrinsic::getDeclaration(&getModule(), 8197acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner (llvm::Intrinsic::ID)IID, Tys, NumTys); 8207acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner} 821bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 8225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerllvm::Function *CodeGenModule::getMemCpyFn() { 8235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (MemCpyFn) return MemCpyFn; 8245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::Intrinsic::ID IID; 825f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner switch (Context.Target.getPointerWidth(0)) { 8265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer default: assert(0 && "Unknown ptr width"); 8275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case 32: IID = llvm::Intrinsic::memcpy_i32; break; 8285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case 64: IID = llvm::Intrinsic::memcpy_i64; break; 8295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 8307acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner return MemCpyFn = getIntrinsic(IID); 8315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 832c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 8330c99509927a0c7a48490486b9fec287b63e5c09cEli Friedmanllvm::Function *CodeGenModule::getMemMoveFn() { 8340c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman if (MemMoveFn) return MemMoveFn; 8350c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman llvm::Intrinsic::ID IID; 8360c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman switch (Context.Target.getPointerWidth(0)) { 8370c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman default: assert(0 && "Unknown ptr width"); 8380c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman case 32: IID = llvm::Intrinsic::memmove_i32; break; 8390c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman case 64: IID = llvm::Intrinsic::memmove_i64; break; 8400c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman } 8410c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman return MemMoveFn = getIntrinsic(IID); 8420c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman} 8430c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman 84441ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venanciollvm::Function *CodeGenModule::getMemSetFn() { 84541ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio if (MemSetFn) return MemSetFn; 84641ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio llvm::Intrinsic::ID IID; 847f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner switch (Context.Target.getPointerWidth(0)) { 84841ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio default: assert(0 && "Unknown ptr width"); 84941ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio case 32: IID = llvm::Intrinsic::memset_i32; break; 85041ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio case 64: IID = llvm::Intrinsic::memset_i64; break; 85141ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio } 85241ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio return MemSetFn = getIntrinsic(IID); 85341ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio} 8547acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner 85520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov// FIXME: This needs moving into an Apple Objective-C runtime class 856bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattnerllvm::Constant *CodeGenModule:: 857bef20ac367a09555b30d6eb3847a81ec164caf88Chris LattnerGetAddrOfConstantCFString(const std::string &str) { 858c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::StringMapEntry<llvm::Constant *> &Entry = 859c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson CFConstantStringMap.GetOrCreateValue(&str[0], &str[str.length()]); 860c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 861c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson if (Entry.getValue()) 862c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson return Entry.getValue(); 863c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 864c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson std::vector<llvm::Constant*> Fields; 865c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 866c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson if (!CFConstantStringClassRef) { 867c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson const llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy); 868c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Ty = llvm::ArrayType::get(Ty, 0); 869c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 870c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson CFConstantStringClassRef = 871c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson new llvm::GlobalVariable(Ty, false, 872c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::GlobalVariable::ExternalLinkage, 0, 873c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson "__CFConstantStringClassReference", 874c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson &getModule()); 875c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson } 876c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 877c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // Class pointer. 878c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::Constant *Zero = llvm::Constant::getNullValue(llvm::Type::Int32Ty); 879c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::Constant *Zeros[] = { Zero, Zero }; 880c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::Constant *C = 881c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::ConstantExpr::getGetElementPtr(CFConstantStringClassRef, Zeros, 2); 882c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Fields.push_back(C); 883c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 884c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // Flags. 885c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson const llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy); 886c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Fields.push_back(llvm::ConstantInt::get(Ty, 1992)); 887c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 888c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // String pointer. 889c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson C = llvm::ConstantArray::get(str); 890c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson C = new llvm::GlobalVariable(C->getType(), true, 891c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::GlobalValue::InternalLinkage, 892c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson C, ".str", &getModule()); 893c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 894c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson C = llvm::ConstantExpr::getGetElementPtr(C, Zeros, 2); 895c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Fields.push_back(C); 896c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 897c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // String length. 898c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Ty = getTypes().ConvertType(getContext().LongTy); 899c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Fields.push_back(llvm::ConstantInt::get(Ty, str.length())); 900c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 901c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // The struct. 902c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Ty = getTypes().ConvertType(getContext().getCFConstantStringType()); 903c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson C = llvm::ConstantStruct::get(cast<llvm::StructType>(Ty), Fields); 9040c67829763b98bc670062b553897a851fab17401Anders Carlsson llvm::GlobalVariable *GV = 9050c67829763b98bc670062b553897a851fab17401Anders Carlsson new llvm::GlobalVariable(C->getType(), true, 9060c67829763b98bc670062b553897a851fab17401Anders Carlsson llvm::GlobalVariable::InternalLinkage, 9070c67829763b98bc670062b553897a851fab17401Anders Carlsson C, "", &getModule()); 9080c67829763b98bc670062b553897a851fab17401Anders Carlsson GV->setSection("__DATA,__cfstring"); 9090c67829763b98bc670062b553897a851fab17401Anders Carlsson Entry.setValue(GV); 9100c67829763b98bc670062b553897a851fab17401Anders Carlsson return GV; 911c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson} 91245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 9131e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar/// getStringForStringLiteral - Return the appropriate bytes for a 9141e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar/// string literal, properly padded to match the literal type. 9151e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbarstd::string CodeGenModule::getStringForStringLiteral(const StringLiteral *E) { 9161e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar assert(!E->isWide() && "FIXME: Wide strings not supported yet!"); 9171e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar const char *StrData = E->getStrData(); 9181e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar unsigned Len = E->getByteLength(); 9191e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 9201e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar const ConstantArrayType *CAT = 9211e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar getContext().getAsConstantArrayType(E->getType()); 9221e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar assert(CAT && "String isn't pointer or array!"); 9231e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 9241e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar // Resize the string to the right size 9251e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar // FIXME: What about wchar_t strings? 9261e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar std::string Str(StrData, StrData+Len); 9271e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar uint64_t RealLen = CAT->getSize().getZExtValue(); 9281e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar Str.resize(RealLen, '\0'); 9291e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 9301e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar return Str; 9311e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar} 9321e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 933a7ad98ff0919d6a24ea7c46634ea29bea551c1a0Chris Lattner/// GenerateWritableString -- Creates storage for a string literal. 93445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattnerstatic llvm::Constant *GenerateStringLiteral(const std::string &str, 93545e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner bool constant, 9362c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner CodeGenModule &CGM) { 93745e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner // Create Constant for this string literal 9381e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar llvm::Constant *C = llvm::ConstantArray::get(str); 93945e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 94045e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner // Create a global variable for this string 94145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner C = new llvm::GlobalVariable(C->getType(), constant, 94245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner llvm::GlobalValue::InternalLinkage, 9432c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner C, ".str", &CGM.getModule()); 94445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner return C; 94545e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner} 94645e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 947a7ad98ff0919d6a24ea7c46634ea29bea551c1a0Chris Lattner/// CodeGenModule::GetAddrOfConstantString -- returns a pointer to the character 948a7ad98ff0919d6a24ea7c46634ea29bea551c1a0Chris Lattner/// array containing the literal. The result is pointer to array type. 94945e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattnerllvm::Constant *CodeGenModule::GetAddrOfConstantString(const std::string &str) { 95045e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner // Don't share any string literals if writable-strings is turned on. 95145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner if (Features.WritableStrings) 95245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner return GenerateStringLiteral(str, false, *this); 95345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 95445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner llvm::StringMapEntry<llvm::Constant *> &Entry = 95545e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner ConstantStringMap.GetOrCreateValue(&str[0], &str[str.length()]); 95645e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 95745e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner if (Entry.getValue()) 95845e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner return Entry.getValue(); 95945e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 96045e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner // Create a global variable for this. 96145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner llvm::Constant *C = GenerateStringLiteral(str, true, *this); 96245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner Entry.setValue(C); 96345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner return C; 96445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner} 965