CodeGenModule.cpp revision c4a1dea2dc56bd1357ec91b829a0b9e68229a13e
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" 185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/Decl.h" 19c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/AST/DeclObjC.h" 202c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner#include "clang/Basic/Diagnostic.h" 2145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner#include "clang/Basic/LangOptions.h" 228bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman#include "clang/Basic/SourceManager.h" 235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h" 24ec9426ca6039279bcc99bc2c625bb2abe4f0353dNate Begeman#include "llvm/CallingConv.h" 258f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner#include "llvm/Constants.h" 265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/DerivedTypes.h" 27bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner#include "llvm/Module.h" 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/Intrinsics.h" 2920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov#include "llvm/Target/TargetData.h" 30a1945fa74d04098d7e22d7c31585342555eca928Chris Lattner#include "llvm/Analysis/Verifier.h" 31ce39faa836d0fe2f3be9ff11865c6433f734b2c6Christopher Lamb#include <algorithm> 325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace CodeGen; 345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3645e8cbdce25c2e16c7aac2036a591f6190097ae6Chris LattnerCodeGenModule::CodeGenModule(ASTContext &C, const LangOptions &LO, 37fb97b03e42d397405f617be0252be83e77a66f6eChris Lattner llvm::Module &M, const llvm::TargetData &TD, 38c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel Dunbar Diagnostic &diags, bool GenerateDebugInfo, 39c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel Dunbar bool UseMacObjCRuntime) 40fb97b03e42d397405f617be0252be83e77a66f6eChris Lattner : Context(C), Features(LO), TheModule(M), TheTargetData(TD), Diags(diags), 410c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman Types(C, M, TD), MemCpyFn(0), MemMoveFn(0), MemSetFn(0), 420c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman CFConstantStringClassRef(0) { 432b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris Lattner //TODO: Make this selectable at runtime 44c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel Dunbar if (UseMacObjCRuntime) { 45c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel Dunbar Runtime = CreateMacObjCRuntime(*this); 46c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel Dunbar } else { 47c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel Dunbar Runtime = CreateGNUObjCRuntime(*this); 48c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel Dunbar } 49e8b9f5b8ea60983c4a74cb8b63879616b914b65aSanjiv Gupta 50e8b9f5b8ea60983c4a74cb8b63879616b914b65aSanjiv Gupta // If debug info generation is enabled, create the CGDebugInfo object. 51815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek DebugInfo = GenerateDebugInfo ? new CGDebugInfo(this) : 0; 522b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris Lattner} 532b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris Lattner 542b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris LattnerCodeGenModule::~CodeGenModule() { 55815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek delete Runtime; 56815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek delete DebugInfo; 57815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek} 58815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek 59815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenekvoid CodeGenModule::Release() { 6020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov EmitStatics(); 61391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner llvm::Function *ObjCInitFunction = Runtime->ModuleInitFunction(); 62ce5605ecf76d8cde6372138f830bb144d174ced9Chris Lattner if (ObjCInitFunction) 63391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner AddGlobalCtor(ObjCInitFunction); 646bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar EmitCtorList(GlobalCtors, "llvm.global_ctors"); 656bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar EmitCtorList(GlobalDtors, "llvm.global_dtors"); 66532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman EmitAnnotations(); 67a1945fa74d04098d7e22d7c31585342555eca928Chris Lattner // Run the verifier to check that the generated code is consistent. 68a1945fa74d04098d7e22d7c31585342555eca928Chris Lattner assert(!verifyModule(TheModule)); 692b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris Lattner} 705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 712c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner/// WarnUnsupported - Print out a warning that codegen doesn't support the 722c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner/// specified stmt yet. 732c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattnervoid CodeGenModule::WarnUnsupported(const Stmt *S, const char *Type) { 742c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner unsigned DiagID = getDiags().getCustomDiagID(Diagnostic::Warning, 752c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner "cannot codegen this %0 yet"); 762c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner SourceRange Range = S->getSourceRange(); 772c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner std::string Msg = Type; 789c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek getDiags().Report(Context.getFullLoc(S->getLocStart()), DiagID, 797a9d49fd2bfac00e905b361ba76d26ab5b6c3b09Ted Kremenek &Msg, 1, &Range, 1); 802c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner} 8158c3f9ec11cbe852a518bf2f83af46f938b7b852Chris Lattner 82c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner/// WarnUnsupported - Print out a warning that codegen doesn't support the 83c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner/// specified decl yet. 84c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattnervoid CodeGenModule::WarnUnsupported(const Decl *D, const char *Type) { 85c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner unsigned DiagID = getDiags().getCustomDiagID(Diagnostic::Warning, 86c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner "cannot codegen this %0 yet"); 87c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner std::string Msg = Type; 88c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID, 89c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner &Msg, 1); 90c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner} 91c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner 924f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman/// setVisibility - Set the visibility for the given LLVM GlobalValue 934f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman/// according to the given clang AST visibility value. 944f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanvoid CodeGenModule::setVisibility(llvm::GlobalValue *GV, 954f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman VisibilityAttr::VisibilityTypes Vis) { 964f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman switch (Vis) { 974f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman default: assert(0 && "Unknown visibility!"); 984f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman case VisibilityAttr::DefaultVisibility: 994f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman GV->setVisibility(llvm::GlobalValue::DefaultVisibility); 1004f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman break; 1014f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman case VisibilityAttr::HiddenVisibility: 1024f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman GV->setVisibility(llvm::GlobalValue::HiddenVisibility); 1034f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman break; 1044f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman case VisibilityAttr::ProtectedVisibility: 1054f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman GV->setVisibility(llvm::GlobalValue::ProtectedVisibility); 1064f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman break; 1074f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman } 1084f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman} 1094f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman 1106d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner/// AddGlobalCtor - Add a function to the list that will be called before 1116d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner/// main() runs. 1126bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::AddGlobalCtor(llvm::Function * Ctor, int Priority) { 1136d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner // TODO: Type coercion of void()* types. 1146bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar GlobalCtors.push_back(std::make_pair(Ctor, Priority)); 1156d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner} 1166d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner 1176bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar/// AddGlobalDtor - Add a function to the list that will be called 1186bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar/// when the module is unloaded. 1196bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::AddGlobalDtor(llvm::Function * Dtor, int Priority) { 1206bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // TODO: Type coercion of void()* types. 1216bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar GlobalDtors.push_back(std::make_pair(Dtor, Priority)); 1226bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar} 1236bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1246bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) { 1256bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // Ctor function type is void()*. 1266bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::FunctionType* CtorFTy = 1276bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::FunctionType::get(llvm::Type::VoidTy, 1286bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar std::vector<const llvm::Type*>(), 1296bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar false); 1306bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy); 1316bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1326bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // Get the type of a ctor entry, { i32, void ()* }. 133572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner llvm::StructType* CtorStructTy = 1346bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::StructType::get(llvm::Type::Int32Ty, 1356bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::PointerType::getUnqual(CtorFTy), NULL); 1366bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1376bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // Construct the constructor and destructor arrays. 1386bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar std::vector<llvm::Constant*> Ctors; 1396bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar for (CtorList::const_iterator I = Fns.begin(), E = Fns.end(); I != E; ++I) { 1406bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar std::vector<llvm::Constant*> S; 1416bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar S.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty, I->second, false)); 1426bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar S.push_back(llvm::ConstantExpr::getBitCast(I->first, CtorPFTy)); 1436bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar Ctors.push_back(llvm::ConstantStruct::get(CtorStructTy, S)); 1446bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar } 1456bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1466bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar if (!Ctors.empty()) { 1476bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::ArrayType *AT = llvm::ArrayType::get(CtorStructTy, Ctors.size()); 1486bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar new llvm::GlobalVariable(AT, false, 149572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner llvm::GlobalValue::AppendingLinkage, 1506bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::ConstantArray::get(AT, Ctors), 1516bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar GlobalName, 152572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner &TheModule); 1536d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner } 1546d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner} 1556d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner 156532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begemanvoid CodeGenModule::EmitAnnotations() { 157532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman if (Annotations.empty()) 158532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman return; 159532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman 160532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman // Create a new global variable for the ConstantStruct in the Module. 161532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::Constant *Array = 162532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::ConstantArray::get(llvm::ArrayType::get(Annotations[0]->getType(), 163532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman Annotations.size()), 164532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman Annotations); 165532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::GlobalValue *gv = 166532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman new llvm::GlobalVariable(Array->getType(), false, 167532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::GlobalValue::AppendingLinkage, Array, 168532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman "llvm.global.annotations", &TheModule); 169532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman gv->setSection("llvm.metadata"); 170532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman} 171532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman 172ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedmanbool hasAggregateLLVMType(QualType T) { 173ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman return !T->isRealType() && !T->isPointerLikeType() && 174ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman !T->isVoidType() && !T->isVectorType() && !T->isFunctionType(); 175ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman} 176ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 177d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopesvoid CodeGenModule::SetGlobalValueAttributes(const FunctionDecl *FD, 178d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes llvm::GlobalValue *GV) { 179d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes // TODO: Set up linkage and many other things. Note, this is a simple 180d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes // approximation of what we really want. 181d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes if (FD->getStorageClass() == FunctionDecl::Static) 182d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes GV->setLinkage(llvm::Function::InternalLinkage); 183d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes else if (FD->getAttr<DLLImportAttr>()) 184d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes GV->setLinkage(llvm::Function::DLLImportLinkage); 185d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes else if (FD->getAttr<DLLExportAttr>()) 186d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes GV->setLinkage(llvm::Function::DLLExportLinkage); 187d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes else if (FD->getAttr<WeakAttr>() || FD->isInline()) 188d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes GV->setLinkage(llvm::Function::WeakLinkage); 189d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 190d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes if (const VisibilityAttr *attr = FD->getAttr<VisibilityAttr>()) 191d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes CodeGenModule::setVisibility(GV, attr->getVisibility()); 192d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes // FIXME: else handle -fvisibility 193a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar 194a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar if (const AsmLabelAttr *ALA = FD->getAttr<AsmLabelAttr>()) { 195a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // Prefaced with special LLVM marker to indicate that the name 196a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // should not be munged. 197a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar GV->setName("\01" + ALA->getLabel()); 198a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar } 199d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes} 200d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 201ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedmanvoid CodeGenModule::SetFunctionAttributes(const FunctionDecl *FD, 202ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman llvm::Function *F, 203ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman const llvm::FunctionType *FTy) { 204ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman unsigned FuncAttrs = 0; 205ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman if (FD->getAttr<NoThrowAttr>()) 206ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman FuncAttrs |= llvm::ParamAttr::NoUnwind; 207ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman if (FD->getAttr<NoReturnAttr>()) 208ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman FuncAttrs |= llvm::ParamAttr::NoReturn; 209ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 210ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman llvm::SmallVector<llvm::ParamAttrsWithIndex, 8> ParamAttrList; 211ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman if (FuncAttrs) 212ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman ParamAttrList.push_back(llvm::ParamAttrsWithIndex::get(0, FuncAttrs)); 213ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman // Note that there is parallel code in CodeGenFunction::EmitCallExpr 214ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman bool AggregateReturn = hasAggregateLLVMType(FD->getResultType()); 215ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman if (AggregateReturn) 216ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman ParamAttrList.push_back( 217ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman llvm::ParamAttrsWithIndex::get(1, llvm::ParamAttr::StructRet)); 218ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman unsigned increment = AggregateReturn ? 2 : 1; 219c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman const FunctionTypeProto* FTP = dyn_cast<FunctionTypeProto>(FD->getType()); 220c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman if (FTP) { 221c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman for (unsigned i = 0; i < FTP->getNumArgs(); i++) { 222c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman QualType ParamType = FTP->getArgType(i); 223c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman unsigned ParamAttrs = 0; 224c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman if (ParamType->isRecordType()) 225c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman ParamAttrs |= llvm::ParamAttr::ByVal; 226a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner if (ParamType->isSignedIntegerType() && 227a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner ParamType->isPromotableIntegerType()) 228c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman ParamAttrs |= llvm::ParamAttr::SExt; 229a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner if (ParamType->isUnsignedIntegerType() && 230a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner ParamType->isPromotableIntegerType()) 231c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman ParamAttrs |= llvm::ParamAttr::ZExt; 232c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman if (ParamAttrs) 233c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman ParamAttrList.push_back(llvm::ParamAttrsWithIndex::get(i + increment, 234c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman ParamAttrs)); 235c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman } 236ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman } 237c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman 238ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman F->setParamAttrs(llvm::PAListPtr::get(ParamAttrList.begin(), 239ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman ParamAttrList.size())); 240ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 241ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman // Set the appropriate calling convention for the Function. 242ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman if (FD->getAttr<FastCallAttr>()) 243ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman F->setCallingConv(llvm::CallingConv::Fast); 244ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 245d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes SetGlobalValueAttributes(FD, F); 246ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman} 247ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 248391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattnervoid CodeGenModule::EmitObjCMethod(const ObjCMethodDecl *OMD) { 249391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // If this is not a prototype, emit the body. 250391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner if (OMD->getBody()) 251391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner CodeGenFunction(*this).GenerateObjCMethod(OMD); 252391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner} 25320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikovvoid CodeGenModule::EmitObjCProtocolImplementation(const ObjCProtocolDecl *PD){ 25420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<std::string, 16> Protocols; 255780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner for (ObjCProtocolDecl::protocol_iterator PI = PD->protocol_begin(), 256780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner E = PD->protocol_end(); PI != E; ++PI) 257780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner Protocols.push_back((*PI)->getName()); 25820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> InstanceMethodNames; 25920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> InstanceMethodTypes; 26020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCProtocolDecl::instmeth_iterator iter = PD->instmeth_begin(), 261780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner E = PD->instmeth_end(); iter != E; iter++) { 26220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 263780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner Context.getObjCEncodingForMethodDecl(*iter, TypeStr); 26420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov InstanceMethodNames.push_back( 26520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov GetAddrOfConstantString((*iter)->getSelector().getName())); 26620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov InstanceMethodTypes.push_back(GetAddrOfConstantString(TypeStr)); 26720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 26820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect information about class methods: 26920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> ClassMethodNames; 27020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> ClassMethodTypes; 27120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCProtocolDecl::classmeth_iterator iter = PD->classmeth_begin(), 27220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov endIter = PD->classmeth_end() ; iter != endIter ; iter++) { 27320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 27420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Context.getObjCEncodingForMethodDecl((*iter),TypeStr); 27520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ClassMethodNames.push_back( 27620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov GetAddrOfConstantString((*iter)->getSelector().getName())); 27720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ClassMethodTypes.push_back(GetAddrOfConstantString(TypeStr)); 27820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 27920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Runtime->GenerateProtocol(PD->getName(), Protocols, InstanceMethodNames, 28020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov InstanceMethodTypes, ClassMethodNames, ClassMethodTypes); 28120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov} 28220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 28320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikovvoid CodeGenModule::EmitObjCCategoryImpl(const ObjCCategoryImplDecl *OCD) { 28420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 28520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect information about instance methods 286a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner llvm::SmallVector<Selector, 16> InstanceMethodSels; 28720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> InstanceMethodTypes; 28820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCCategoryDecl::instmeth_iterator iter = OCD->instmeth_begin(), 28920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov endIter = OCD->instmeth_end() ; iter != endIter ; iter++) { 290a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner InstanceMethodSels.push_back((*iter)->getSelector()); 29120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 292fba676396703e87a5034e5f308aa30a633468f66Chris Lattner Context.getObjCEncodingForMethodDecl(*iter,TypeStr); 29320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov InstanceMethodTypes.push_back(GetAddrOfConstantString(TypeStr)); 29420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 29520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 29620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect information about class methods 297a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner llvm::SmallVector<Selector, 16> ClassMethodSels; 29820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> ClassMethodTypes; 29920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCCategoryDecl::classmeth_iterator iter = OCD->classmeth_begin(), 30020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov endIter = OCD->classmeth_end() ; iter != endIter ; iter++) { 301a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner ClassMethodSels.push_back((*iter)->getSelector()); 30220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 303fba676396703e87a5034e5f308aa30a633468f66Chris Lattner Context.getObjCEncodingForMethodDecl(*iter,TypeStr); 30420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ClassMethodTypes.push_back(GetAddrOfConstantString(TypeStr)); 30520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 30620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 30720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect the names of referenced protocols 30820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<std::string, 16> Protocols; 3093db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner const ObjCInterfaceDecl *ClassDecl = OCD->getClassInterface(); 3103db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner const ObjCList<ObjCProtocolDecl> &Protos =ClassDecl->getReferencedProtocols(); 3113db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner for (ObjCList<ObjCProtocolDecl>::iterator I = Protos.begin(), 3123db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner E = Protos.end(); I != E; ++I) 3133db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner Protocols.push_back((*I)->getName()); 31420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 31520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Generate the category 31620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Runtime->GenerateCategory(OCD->getClassInterface()->getName(), 317a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner OCD->getName(), InstanceMethodSels, InstanceMethodTypes, 318a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner ClassMethodSels, ClassMethodTypes, Protocols); 31920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov} 32020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 32120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikovvoid CodeGenModule::EmitObjCClassImplementation( 32220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov const ObjCImplementationDecl *OID) { 32320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Get the superclass name. 32420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov const ObjCInterfaceDecl * SCDecl = OID->getClassInterface()->getSuperClass(); 32520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov const char * SCName = NULL; 32620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov if (SCDecl) { 32720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov SCName = SCDecl->getName(); 32820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 32920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 33020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Get the class name 33120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ObjCInterfaceDecl * ClassDecl = (ObjCInterfaceDecl*)OID->getClassInterface(); 33220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov const char * ClassName = ClassDecl->getName(); 33320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 33420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Get the size of instances. For runtimes that support late-bound instances 33520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // this should probably be something different (size just of instance 33620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // varaibles in this class, not superclasses?). 33720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov int instanceSize = 0; 33820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov const llvm::Type *ObjTy; 33920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov if (!Runtime->LateBoundIVars()) { 34020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ObjTy = getTypes().ConvertType(Context.getObjCInterfaceType(ClassDecl)); 34120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov instanceSize = TheTargetData.getABITypeSize(ObjTy); 34220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 34320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 34420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect information about instance variables. 34520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> IvarNames; 34620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> IvarTypes; 34720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> IvarOffsets; 34820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov const llvm::StructLayout *Layout = 34920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov TheTargetData.getStructLayout(cast<llvm::StructType>(ObjTy)); 35020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ObjTy = llvm::PointerType::getUnqual(ObjTy); 35120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCInterfaceDecl::ivar_iterator iter = ClassDecl->ivar_begin(), 35220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov endIter = ClassDecl->ivar_end() ; iter != endIter ; iter++) { 35320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Store the name 35420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov IvarNames.push_back(GetAddrOfConstantString((*iter)->getName())); 35520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Get the type encoding for this ivar 35620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 35720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<const RecordType *, 8> EncodingRecordTypes; 35820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Context.getObjCEncodingForType((*iter)->getType(), TypeStr, 35920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov EncodingRecordTypes); 36020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov IvarTypes.push_back(GetAddrOfConstantString(TypeStr)); 36120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Get the offset 36220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov int offset = 36320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov (int)Layout->getElementOffset(getTypes().getLLVMFieldNo(*iter)); 36420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov IvarOffsets.push_back( 36520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::ConstantInt::get(llvm::Type::Int32Ty, offset)); 36620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 36720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 36820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect information about instance methods 369a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner llvm::SmallVector<Selector, 16> InstanceMethodSels; 37020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> InstanceMethodTypes; 37120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCImplementationDecl::instmeth_iterator iter = OID->instmeth_begin(), 37220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov endIter = OID->instmeth_end() ; iter != endIter ; iter++) { 373a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner InstanceMethodSels.push_back((*iter)->getSelector()); 37420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 37520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Context.getObjCEncodingForMethodDecl((*iter),TypeStr); 37620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov InstanceMethodTypes.push_back(GetAddrOfConstantString(TypeStr)); 37720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 37820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 37920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect information about class methods 380a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner llvm::SmallVector<Selector, 16> ClassMethodSels; 38120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<llvm::Constant*, 16> ClassMethodTypes; 38220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov for (ObjCImplementationDecl::classmeth_iterator iter = OID->classmeth_begin(), 38320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov endIter = OID->classmeth_end() ; iter != endIter ; iter++) { 384a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner ClassMethodSels.push_back((*iter)->getSelector()); 38520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov std::string TypeStr; 38620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Context.getObjCEncodingForMethodDecl((*iter),TypeStr); 38720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov ClassMethodTypes.push_back(GetAddrOfConstantString(TypeStr)); 38820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov } 38920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Collect the names of referenced protocols 39020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov llvm::SmallVector<std::string, 16> Protocols; 3913db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner const ObjCList<ObjCProtocolDecl> &Protos =ClassDecl->getReferencedProtocols(); 3923db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner for (ObjCList<ObjCProtocolDecl>::iterator I = Protos.begin(), 3933db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner E = Protos.end(); I != E; ++I) 3943db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner Protocols.push_back((*I)->getName()); 39520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 39620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov // Generate the category 39720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov Runtime->GenerateClass(ClassName, SCName, instanceSize, IvarNames, IvarTypes, 398a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner IvarOffsets, InstanceMethodSels, InstanceMethodTypes, 399a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner ClassMethodSels, ClassMethodTypes, Protocols); 40020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov} 40120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 4024c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begemanvoid CodeGenModule::EmitStatics() { 4034c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // Emit code for each used static decl encountered. Since a previously unused 4044c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // static decl may become used during the generation of code for a static 4054c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // function, iterate until no changes are made. 4064c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman bool Changed; 4074c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman do { 4084c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman Changed = false; 4094c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman for (unsigned i = 0, e = StaticDecls.size(); i != e; ++i) { 410bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar const ValueDecl *D = StaticDecls[i]; 4116f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman 4126f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman // Check if we have used a decl with the same name 4136f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman // FIXME: The AST should have some sort of aggregate decls or 4146f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman // global symbol map. 415a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar if (!GlobalDeclMap.count(D->getName())) 416a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar continue; 4176f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman 418bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Emit the definition. 419bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalDefinition(D); 420bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 4214c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // Erase the used decl from the list. 4224c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman StaticDecls[i] = StaticDecls.back(); 4234c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman StaticDecls.pop_back(); 4244c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman --i; 4254c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman --e; 4264c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman 4274c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // Remember that we made a change. 4284c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman Changed = true; 4294c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman } 4304c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman } while (Changed); 4315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 4325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4338bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// EmitAnnotateAttr - Generate the llvm::ConstantStruct which contains the 4348bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// annotation information for a given GlobalValue. The annotation struct is 4358bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// {i8 *, i8 *, i8 *, i32}. The first field is a constant expression, the 4363c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar/// GlobalValue being annotated. The second field is the constant string 4378bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// created from the AnnotateAttr's annotation. The third field is a constant 4388bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// string containing the name of the translation unit. The fourth field is 4398bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// the line number in the file of the annotated value declaration. 4408bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// 4418bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// FIXME: this does not unique the annotation string constants, as llvm-gcc 4428bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// appears to. 4438bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// 4448bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begemanllvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV, 4458bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman const AnnotateAttr *AA, 4468bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman unsigned LineNo) { 4478bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Module *M = &getModule(); 4488bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 4498bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // get [N x i8] constants for the annotation string, and the filename string 4508bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // which are the 2nd and 3rd elements of the global annotation structure. 4518bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman const llvm::Type *SBP = llvm::PointerType::getUnqual(llvm::Type::Int8Ty); 4528bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Constant *anno = llvm::ConstantArray::get(AA->getAnnotation(), true); 4538bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Constant *unit = llvm::ConstantArray::get(M->getModuleIdentifier(), 4548bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman true); 4558bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 4568bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // Get the two global values corresponding to the ConstantArrays we just 4578bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // created to hold the bytes of the strings. 4588bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue *annoGV = 4598bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman new llvm::GlobalVariable(anno->getType(), false, 4608bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue::InternalLinkage, anno, 4618bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman GV->getName() + ".str", M); 4628bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // translation unit name string, emitted into the llvm.metadata section. 4638bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue *unitGV = 4648bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman new llvm::GlobalVariable(unit->getType(), false, 4658bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue::InternalLinkage, unit, ".str", M); 4668bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 4678bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // Create the ConstantStruct that is the global annotion. 4688bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Constant *Fields[4] = { 4698bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantExpr::getBitCast(GV, SBP), 4708bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantExpr::getBitCast(annoGV, SBP), 4718bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantExpr::getBitCast(unitGV, SBP), 4728bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantInt::get(llvm::Type::Int32Ty, LineNo) 4738bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman }; 4748bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman return llvm::ConstantStruct::get(Fields, 4, false); 4758bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman} 4768bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 477bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobal(const ValueDecl *Global) { 478bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar bool isDef, isStatic; 479bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 480bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Global)) { 481bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar isDef = (FD->isThisDeclarationADefinition() || 482bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar FD->getAttr<AliasAttr>()); 483bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar isStatic = FD->getStorageClass() == FunctionDecl::Static; 484bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else if (const VarDecl *VD = cast<VarDecl>(Global)) { 485bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar assert(VD->isFileVarDecl() && "Cannot emit local var decl as global."); 486bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 487bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar isDef = !(VD->getStorageClass() == VarDecl::Extern && VD->getInit() == 0); 488bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar isStatic = VD->getStorageClass() == VarDecl::Static; 489bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 490bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar assert(0 && "Invalid argument to EmitGlobal"); 4914c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman return; 4924c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman } 4934c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman 494bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Forward declarations are emitted lazily on first use. 495bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (!isDef) 49688a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner return; 497bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 498bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // If the global is a static, defer code generation until later so 499bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // we can easily omit unused statics. 500bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (isStatic) { 501bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar StaticDecls.push_back(Global); 502bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar return; 503bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 504bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 505bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Otherwise emit the definition. 506bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalDefinition(Global); 5074c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman} 5084c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman 509bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalDefinition(const ValueDecl *D) { 510bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 511bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalFunctionDefinition(FD); 512bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 513bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalVarDefinition(VD); 514bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 515bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar assert(0 && "Invalid argument to EmitGlobalDefinition()"); 516bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 517bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 518bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 5199986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D) { 52077ba708819285931932ecd33691a672bb59d221aEli Friedman assert(D->hasGlobalStorage() && "Not a global variable"); 52177ba708819285931932ecd33691a672bb59d221aEli Friedman 522bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar QualType ASTTy = D->getType(); 523bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar const llvm::Type *Ty = getTypes().ConvertTypeForMem(ASTTy); 5249986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar const llvm::Type *PTy = llvm::PointerType::get(Ty, ASTTy.getAddressSpace()); 525bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 5263c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar // Lookup the entry, lazily creating it if necessary. 5273c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getName()]; 5283c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (!Entry) 5293c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry = new llvm::GlobalVariable(Ty, false, 5303c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue::ExternalLinkage, 5313c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 0, D->getName(), &getModule(), 0, 5323c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar ASTTy.getAddressSpace()); 5333c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 5349986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar // Make sure the result is of the correct type. 5359986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar return llvm::ConstantExpr::getBitCast(Entry, PTy); 536bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 537bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 538bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) { 5398f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner llvm::Constant *Init = 0; 54077ba708819285931932ecd33691a672bb59d221aEli Friedman QualType ASTTy = D->getType(); 54177ba708819285931932ecd33691a672bb59d221aEli Friedman const llvm::Type *VarTy = getTypes().ConvertTypeForMem(ASTTy); 54277ba708819285931932ecd33691a672bb59d221aEli Friedman 5438f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner if (D->getInit() == 0) { 544cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // This is a tentative definition; tentative definitions are 545cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // implicitly initialized with { 0 } 546cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman const llvm::Type* InitTy; 547cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman if (ASTTy->isIncompleteArrayType()) { 548cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // An incomplete array is normally [ TYPE x 0 ], but we need 549cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // to fix it to [ TYPE x 1 ]. 550cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman const llvm::ArrayType* ATy = cast<llvm::ArrayType>(VarTy); 551cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman InitTy = llvm::ArrayType::get(ATy->getElementType(), 1); 552cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman } else { 553cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman InitTy = VarTy; 554cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman } 555cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman Init = llvm::Constant::getNullValue(InitTy); 55677ba708819285931932ecd33691a672bb59d221aEli Friedman } else { 557bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar Init = EmitConstantExpr(D->getInit()); 5588f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner } 55977ba708819285931932ecd33691a672bb59d221aEli Friedman const llvm::Type* InitType = Init->getType(); 5608e53e720b3d7c962e91138a130dbd5d6c2def0e5Devang Patel 5613c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getName()]; 5623c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalVariable *GV = cast_or_null<llvm::GlobalVariable>(Entry); 5633c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 56477ba708819285931932ecd33691a672bb59d221aEli Friedman if (!GV) { 56577ba708819285931932ecd33691a672bb59d221aEli Friedman GV = new llvm::GlobalVariable(InitType, false, 56677ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::GlobalValue::ExternalLinkage, 56777ba708819285931932ecd33691a672bb59d221aEli Friedman 0, D->getName(), &getModule(), 0, 56877ba708819285931932ecd33691a672bb59d221aEli Friedman ASTTy.getAddressSpace()); 5693c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar } else if (GV->getType() != 5703c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::PointerType::get(InitType, ASTTy.getAddressSpace())) { 57177ba708819285931932ecd33691a672bb59d221aEli Friedman // We have a definition after a prototype with the wrong type. 57277ba708819285931932ecd33691a672bb59d221aEli Friedman // We must make a new GlobalVariable* and update everything that used OldGV 57377ba708819285931932ecd33691a672bb59d221aEli Friedman // (a declaration or tentative definition) with the new GlobalVariable* 57477ba708819285931932ecd33691a672bb59d221aEli Friedman // (which will be a definition). 57577ba708819285931932ecd33691a672bb59d221aEli Friedman // 57677ba708819285931932ecd33691a672bb59d221aEli Friedman // This happens if there is a prototype for a global (e.g. "extern int x[];") 57777ba708819285931932ecd33691a672bb59d221aEli Friedman // and then a definition of a different type (e.g. "int x[10];"). This also 57877ba708819285931932ecd33691a672bb59d221aEli Friedman // happens when an initializer has a different type from the type of the 57977ba708819285931932ecd33691a672bb59d221aEli Friedman // global (this happens with unions). 580cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // 581cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // FIXME: This also ends up happening if there's a definition followed by 582cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // a tentative definition! (Although Sema rejects that construct 583cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // at the moment.) 58477ba708819285931932ecd33691a672bb59d221aEli Friedman 58577ba708819285931932ecd33691a672bb59d221aEli Friedman // Save the old global 58677ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::GlobalVariable *OldGV = GV; 58777ba708819285931932ecd33691a672bb59d221aEli Friedman 58877ba708819285931932ecd33691a672bb59d221aEli Friedman // Make a new global with the correct type 58977ba708819285931932ecd33691a672bb59d221aEli Friedman GV = new llvm::GlobalVariable(InitType, false, 59077ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::GlobalValue::ExternalLinkage, 59177ba708819285931932ecd33691a672bb59d221aEli Friedman 0, D->getName(), &getModule(), 0, 59277ba708819285931932ecd33691a672bb59d221aEli Friedman ASTTy.getAddressSpace()); 59377ba708819285931932ecd33691a672bb59d221aEli Friedman // Steal the name of the old global 59477ba708819285931932ecd33691a672bb59d221aEli Friedman GV->takeName(OldGV); 59577ba708819285931932ecd33691a672bb59d221aEli Friedman 59677ba708819285931932ecd33691a672bb59d221aEli Friedman // Replace all uses of the old global with the new global 59777ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::Constant *NewPtrForOldDecl = 59877ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::ConstantExpr::getBitCast(GV, OldGV->getType()); 59977ba708819285931932ecd33691a672bb59d221aEli Friedman OldGV->replaceAllUsesWith(NewPtrForOldDecl); 60077ba708819285931932ecd33691a672bb59d221aEli Friedman 60177ba708819285931932ecd33691a672bb59d221aEli Friedman // Erase the old global, since it is no longer used. 60277ba708819285931932ecd33691a672bb59d221aEli Friedman OldGV->eraseFromParent(); 60377ba708819285931932ecd33691a672bb59d221aEli Friedman } 60477ba708819285931932ecd33691a672bb59d221aEli Friedman 6053c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry = GV; 6069e32d4b4a7270a9701b7cb454381eeaa4cc42a77Devang Patel 6078bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman if (const AnnotateAttr *AA = D->getAttr<AnnotateAttr>()) { 6088bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman SourceManager &SM = Context.getSourceManager(); 6098bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman AddAnnotation(EmitAnnotateAttr(GV, AA, 6108bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman SM.getLogicalLineNumber(D->getLocation()))); 6118bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman } 6128bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 61388a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner GV->setInitializer(Init); 614ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 615cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // FIXME: This is silly; getTypeAlign should just work for incomplete arrays 616cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman unsigned Align; 617c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const IncompleteArrayType* IAT = 618c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner Context.getAsIncompleteArrayType(D->getType())) 619cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman Align = Context.getTypeAlign(IAT->getElementType()); 620cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman else 621cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman Align = Context.getTypeAlign(D->getType()); 62208d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman if (const AlignedAttr* AA = D->getAttr<AlignedAttr>()) { 62308d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman Align = std::max(Align, AA->getAlignment()); 62408d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman } 62508d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman GV->setAlignment(Align / 8); 62608d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman 627ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner if (const VisibilityAttr *attr = D->getAttr<VisibilityAttr>()) 6284f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman setVisibility(GV, attr->getVisibility()); 629ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // FIXME: else handle -fvisibility 630a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar 631a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar if (const AsmLabelAttr *ALA = D->getAttr<AsmLabelAttr>()) { 632a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // Prefaced with special LLVM marker to indicate that the name 633a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // should not be munged. 634a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar GV->setName("\01" + ALA->getLabel()); 635a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar } 63688a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner 63788a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner // Set the llvm linkage type as appropriate. 6388fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner if (D->getStorageClass() == VarDecl::Static) 6398fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner GV->setLinkage(llvm::Function::InternalLinkage); 6408fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner else if (D->getAttr<DLLImportAttr>()) 641ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner GV->setLinkage(llvm::Function::DLLImportLinkage); 642ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner else if (D->getAttr<DLLExportAttr>()) 643ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner GV->setLinkage(llvm::Function::DLLExportLinkage); 6448fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner else if (D->getAttr<WeakAttr>()) 645ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner GV->setLinkage(llvm::GlobalVariable::WeakLinkage); 6468fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner else { 647ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // FIXME: This isn't right. This should handle common linkage and other 648ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // stuff. 649ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner switch (D->getStorageClass()) { 6508fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner case VarDecl::Static: assert(0 && "This case handled above"); 651ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::Auto: 652ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::Register: 653ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner assert(0 && "Can't have auto or register globals"); 654ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::None: 655ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner if (!D->getInit()) 656a07b76419a03f126c22949dce2e546ba4df0e415Eli Friedman GV->setLinkage(llvm::GlobalVariable::CommonLinkage); 657ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner break; 658ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::Extern: 659ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::PrivateExtern: 660ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // todo: common 661ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner break; 662ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner } 66388a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner } 664686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta 665686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta // Emit global variable debug information. 666686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta CGDebugInfo *DI = getDebugInfo(); 667686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta if(DI) { 668686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta if(D->getLocation().isValid()) 669686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta DI->setLocation(D->getLocation()); 670686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta DI->EmitGlobalVariable(GV, D); 671686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta } 67288a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner} 6735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 674bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarllvm::GlobalValue * 675bd012ff1fa088181646a784f385b28867372d434Daniel DunbarCodeGenModule::EmitForwardFunctionDefinition(const FunctionDecl *D) { 676bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // FIXME: param attributes for sext/zext etc. 677bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (const AliasAttr *AA = D->getAttr<AliasAttr>()) { 678bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar assert(!D->getBody() && "Unexpected alias attr on function with body."); 679bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 680bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar const std::string& aliaseeName = AA->getAliasee(); 681bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Function *aliasee = getModule().getFunction(aliaseeName); 682bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::GlobalValue *alias = new llvm::GlobalAlias(aliasee->getType(), 683bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Function::ExternalLinkage, 684bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar D->getName(), 685bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar aliasee, 686bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar &getModule()); 687bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar SetGlobalValueAttributes(D, alias); 688bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar return alias; 689bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 690bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar const llvm::Type *Ty = getTypes().ConvertType(D->getType()); 691bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar const llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty); 692bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Function *F = llvm::Function::Create(FTy, 693bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Function::ExternalLinkage, 694bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar D->getName(), &getModule()); 695bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 696bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar SetFunctionAttributes(D, F, FTy); 697bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar return F; 698bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 699bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 700bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 701bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarllvm::Constant *CodeGenModule::GetAddrOfFunction(const FunctionDecl *D) { 7029986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar QualType ASTTy = D->getType(); 7039986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar const llvm::Type *Ty = getTypes().ConvertTypeForMem(ASTTy); 7049986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar const llvm::Type *PTy = llvm::PointerType::get(Ty, ASTTy.getAddressSpace()); 7053c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 7063c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar // Lookup the entry, lazily creating it if necessary. 7073c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getName()]; 7083c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (!Entry) 7093c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry = EmitForwardFunctionDefinition(D); 710bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 7119986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar return llvm::ConstantExpr::getBitCast(Entry, PTy); 712bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 713bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 714bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalFunctionDefinition(const FunctionDecl *D) { 7153c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getName()]; 7163c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (!Entry) { 717bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar Entry = EmitForwardFunctionDefinition(D); 718bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 7193c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar // If the types mismatch then we have to rewrite the definition. 7203c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar const llvm::Type *Ty = getTypes().ConvertType(D->getType()); 7213c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (Entry->getType() != llvm::PointerType::getUnqual(Ty)) { 722bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Otherwise, we have a definition after a prototype with the wrong type. 723bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // F is the Function* for the one with the wrong type, we must make a new 724bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Function* and update everything that used F (a declaration) with the new 725bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Function* (which will be a definition). 726bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // 727bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // This happens if there is a prototype for a function (e.g. "int f()") and 728bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // then a definition of a different type (e.g. "int f(int x)"). Start by 729bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // making a new function of the correct type, RAUW, then steal the name. 7303c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue *NewFn = EmitForwardFunctionDefinition(D); 7313c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar NewFn->takeName(Entry); 732bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 733bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Replace uses of F with the Function we will endow with a body. 734bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Constant *NewPtrForOldDecl = 7353c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::ConstantExpr::getBitCast(NewFn, Entry->getType()); 7363c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry->replaceAllUsesWith(NewPtrForOldDecl); 7373c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 738bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Ok, delete the old function now, which is dead. 7393c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar // FIXME: Add GlobalValue->eraseFromParent(). 7403c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar assert(Entry->isDeclaration() && "Shouldn't replace non-declaration"); 7413c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (llvm::Function *F = dyn_cast<llvm::Function>(Entry)) { 7423c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar F->eraseFromParent(); 7433c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar } else if (llvm::GlobalAlias *GA = dyn_cast<llvm::GlobalAlias>(Entry)) { 7443c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar GA->eraseFromParent(); 7453c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar } else { 7463c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar assert(0 && "Invalid global variable type."); 7473c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar } 748bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 749bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar Entry = NewFn; 750bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 751bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 752bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 753bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (D->getAttr<AliasAttr>()) { 754bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar ; 755bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 756bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Function *Fn = cast<llvm::Function>(Entry); 757bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar CodeGenFunction(*this).GenerateCode(D, Fn); 7586bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 7596bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar if (const ConstructorAttr *CA = D->getAttr<ConstructorAttr>()) { 7606bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar AddGlobalCtor(Fn, CA->getPriority()); 7616bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar } else if (const DestructorAttr *DA = D->getAttr<DestructorAttr>()) { 7626bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar AddGlobalDtor(Fn, DA->getPriority()); 7636bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar } 764bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 765bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 766bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 767c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattnervoid CodeGenModule::UpdateCompletedType(const TagDecl *TD) { 768c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattner // Make sure that this type is translated. 769c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattner Types.UpdateCompletedType(TD); 770d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner} 771d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner 772d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner 773bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner/// getBuiltinLibFunction 774bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattnerllvm::Function *CodeGenModule::getBuiltinLibFunction(unsigned BuiltinID) { 7751426fecdf90dd1986751b9940422e675880ff671Chris Lattner if (BuiltinID > BuiltinFunctions.size()) 7761426fecdf90dd1986751b9940422e675880ff671Chris Lattner BuiltinFunctions.resize(BuiltinID); 777bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 7781426fecdf90dd1986751b9940422e675880ff671Chris Lattner // Cache looked up functions. Since builtin id #0 is invalid we don't reserve 7791426fecdf90dd1986751b9940422e675880ff671Chris Lattner // a slot for it. 7801426fecdf90dd1986751b9940422e675880ff671Chris Lattner assert(BuiltinID && "Invalid Builtin ID"); 7811426fecdf90dd1986751b9940422e675880ff671Chris Lattner llvm::Function *&FunctionSlot = BuiltinFunctions[BuiltinID-1]; 782bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner if (FunctionSlot) 783bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner return FunctionSlot; 784bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 785bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner assert(Context.BuiltinInfo.isLibFunction(BuiltinID) && "isn't a lib fn"); 786bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 787bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // Get the name, skip over the __builtin_ prefix. 788bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner const char *Name = Context.BuiltinInfo.GetName(BuiltinID)+10; 789bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 790bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // Get the type for the builtin. 791bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner QualType Type = Context.BuiltinInfo.GetBuiltinType(BuiltinID, Context); 792bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner const llvm::FunctionType *Ty = 793bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner cast<llvm::FunctionType>(getTypes().ConvertType(Type)); 794bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 795bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // FIXME: This has a serious problem with code like this: 796bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // void abs() {} 797bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // ... __builtin_abs(x); 798bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // The two versions of abs will collide. The fix is for the builtin to win, 799bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // and for the existing one to be turned into a constantexpr cast of the 800bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // builtin. In the case where the existing one is a static function, it 801bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // should just be renamed. 802c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner if (llvm::Function *Existing = getModule().getFunction(Name)) { 803c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner if (Existing->getFunctionType() == Ty && Existing->hasExternalLinkage()) 804c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner return FunctionSlot = Existing; 805c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner assert(Existing == 0 && "FIXME: Name collision"); 806c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner } 807bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 808bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // FIXME: param attributes for sext/zext etc. 8094c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman return FunctionSlot = 8104c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman llvm::Function::Create(Ty, llvm::Function::ExternalLinkage, Name, 8114c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman &getModule()); 812bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner} 813bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 8147acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattnerllvm::Function *CodeGenModule::getIntrinsic(unsigned IID,const llvm::Type **Tys, 8157acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner unsigned NumTys) { 8167acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner return llvm::Intrinsic::getDeclaration(&getModule(), 8177acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner (llvm::Intrinsic::ID)IID, Tys, NumTys); 8187acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner} 819bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 8205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerllvm::Function *CodeGenModule::getMemCpyFn() { 8215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (MemCpyFn) return MemCpyFn; 8225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::Intrinsic::ID IID; 823f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner switch (Context.Target.getPointerWidth(0)) { 8245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer default: assert(0 && "Unknown ptr width"); 8255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case 32: IID = llvm::Intrinsic::memcpy_i32; break; 8265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case 64: IID = llvm::Intrinsic::memcpy_i64; break; 8275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 8287acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner return MemCpyFn = getIntrinsic(IID); 8295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 830c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 8310c99509927a0c7a48490486b9fec287b63e5c09cEli Friedmanllvm::Function *CodeGenModule::getMemMoveFn() { 8320c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman if (MemMoveFn) return MemMoveFn; 8330c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman llvm::Intrinsic::ID IID; 8340c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman switch (Context.Target.getPointerWidth(0)) { 8350c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman default: assert(0 && "Unknown ptr width"); 8360c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman case 32: IID = llvm::Intrinsic::memmove_i32; break; 8370c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman case 64: IID = llvm::Intrinsic::memmove_i64; break; 8380c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman } 8390c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman return MemMoveFn = getIntrinsic(IID); 8400c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman} 8410c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman 84241ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venanciollvm::Function *CodeGenModule::getMemSetFn() { 84341ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio if (MemSetFn) return MemSetFn; 84441ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio llvm::Intrinsic::ID IID; 845f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner switch (Context.Target.getPointerWidth(0)) { 84641ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio default: assert(0 && "Unknown ptr width"); 84741ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio case 32: IID = llvm::Intrinsic::memset_i32; break; 84841ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio case 64: IID = llvm::Intrinsic::memset_i64; break; 84941ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio } 85041ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio return MemSetFn = getIntrinsic(IID); 85141ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio} 8527acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner 85320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov// FIXME: This needs moving into an Apple Objective-C runtime class 854bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattnerllvm::Constant *CodeGenModule:: 855bef20ac367a09555b30d6eb3847a81ec164caf88Chris LattnerGetAddrOfConstantCFString(const std::string &str) { 856c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::StringMapEntry<llvm::Constant *> &Entry = 857c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson CFConstantStringMap.GetOrCreateValue(&str[0], &str[str.length()]); 858c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 859c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson if (Entry.getValue()) 860c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson return Entry.getValue(); 861c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 862c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson std::vector<llvm::Constant*> Fields; 863c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 864c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson if (!CFConstantStringClassRef) { 865c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson const llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy); 866c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Ty = llvm::ArrayType::get(Ty, 0); 867c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 868c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson CFConstantStringClassRef = 869c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson new llvm::GlobalVariable(Ty, false, 870c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::GlobalVariable::ExternalLinkage, 0, 871c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson "__CFConstantStringClassReference", 872c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson &getModule()); 873c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson } 874c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 875c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // Class pointer. 876c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::Constant *Zero = llvm::Constant::getNullValue(llvm::Type::Int32Ty); 877c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::Constant *Zeros[] = { Zero, Zero }; 878c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::Constant *C = 879c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::ConstantExpr::getGetElementPtr(CFConstantStringClassRef, Zeros, 2); 880c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Fields.push_back(C); 881c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 882c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // Flags. 883c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson const llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy); 884c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Fields.push_back(llvm::ConstantInt::get(Ty, 1992)); 885c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 886c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // String pointer. 887c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson C = llvm::ConstantArray::get(str); 888c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson C = new llvm::GlobalVariable(C->getType(), true, 889c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::GlobalValue::InternalLinkage, 890c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson C, ".str", &getModule()); 891c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 892c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson C = llvm::ConstantExpr::getGetElementPtr(C, Zeros, 2); 893c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Fields.push_back(C); 894c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 895c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // String length. 896c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Ty = getTypes().ConvertType(getContext().LongTy); 897c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Fields.push_back(llvm::ConstantInt::get(Ty, str.length())); 898c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 899c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // The struct. 900c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Ty = getTypes().ConvertType(getContext().getCFConstantStringType()); 901c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson C = llvm::ConstantStruct::get(cast<llvm::StructType>(Ty), Fields); 9020c67829763b98bc670062b553897a851fab17401Anders Carlsson llvm::GlobalVariable *GV = 9030c67829763b98bc670062b553897a851fab17401Anders Carlsson new llvm::GlobalVariable(C->getType(), true, 9040c67829763b98bc670062b553897a851fab17401Anders Carlsson llvm::GlobalVariable::InternalLinkage, 9050c67829763b98bc670062b553897a851fab17401Anders Carlsson C, "", &getModule()); 9060c67829763b98bc670062b553897a851fab17401Anders Carlsson GV->setSection("__DATA,__cfstring"); 9070c67829763b98bc670062b553897a851fab17401Anders Carlsson Entry.setValue(GV); 9080c67829763b98bc670062b553897a851fab17401Anders Carlsson return GV; 909c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson} 91045e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 9111e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar/// getStringForStringLiteral - Return the appropriate bytes for a 9121e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar/// string literal, properly padded to match the literal type. 9131e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbarstd::string CodeGenModule::getStringForStringLiteral(const StringLiteral *E) { 9141e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar assert(!E->isWide() && "FIXME: Wide strings not supported yet!"); 9151e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar const char *StrData = E->getStrData(); 9161e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar unsigned Len = E->getByteLength(); 9171e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 9181e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar const ConstantArrayType *CAT = 9191e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar getContext().getAsConstantArrayType(E->getType()); 9201e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar assert(CAT && "String isn't pointer or array!"); 9211e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 9221e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar // Resize the string to the right size 9231e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar // FIXME: What about wchar_t strings? 9241e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar std::string Str(StrData, StrData+Len); 9251e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar uint64_t RealLen = CAT->getSize().getZExtValue(); 9261e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar Str.resize(RealLen, '\0'); 9271e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 9281e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar return Str; 9291e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar} 9301e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 931a7ad98ff0919d6a24ea7c46634ea29bea551c1a0Chris Lattner/// GenerateWritableString -- Creates storage for a string literal. 93245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattnerstatic llvm::Constant *GenerateStringLiteral(const std::string &str, 93345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner bool constant, 9342c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner CodeGenModule &CGM) { 93545e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner // Create Constant for this string literal 9361e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar llvm::Constant *C = llvm::ConstantArray::get(str); 93745e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 93845e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner // Create a global variable for this string 93945e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner C = new llvm::GlobalVariable(C->getType(), constant, 94045e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner llvm::GlobalValue::InternalLinkage, 9412c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner C, ".str", &CGM.getModule()); 94245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner return C; 94345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner} 94445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 945a7ad98ff0919d6a24ea7c46634ea29bea551c1a0Chris Lattner/// CodeGenModule::GetAddrOfConstantString -- returns a pointer to the character 946a7ad98ff0919d6a24ea7c46634ea29bea551c1a0Chris Lattner/// array containing the literal. The result is pointer to array type. 94745e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattnerllvm::Constant *CodeGenModule::GetAddrOfConstantString(const std::string &str) { 94845e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner // Don't share any string literals if writable-strings is turned on. 94945e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner if (Features.WritableStrings) 95045e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner return GenerateStringLiteral(str, false, *this); 95145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 95245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner llvm::StringMapEntry<llvm::Constant *> &Entry = 95345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner ConstantStringMap.GetOrCreateValue(&str[0], &str[str.length()]); 95445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 95545e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner if (Entry.getValue()) 95645e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner return Entry.getValue(); 95745e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 95845e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner // Create a global variable for this. 95945e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner llvm::Constant *C = GenerateStringLiteral(str, true, *this); 96045e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner Entry.setValue(C); 96145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner return C; 96245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner} 963