CodeGenModule.cpp revision 44b4321feab46299d3f5cfd404680884752a0fcf
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" 170dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "CGCall.h" 18af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar#include "CGObjCRuntime.h" 195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/ASTContext.h" 20c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/AST/DeclObjC.h" 2121ef7ae45c8b91f23cf5eab2263421bb398a644bChris Lattner#include "clang/AST/DeclCXX.h" 222c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner#include "clang/Basic/Diagnostic.h" 238bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman#include "clang/Basic/SourceManager.h" 245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h" 25ec9426ca6039279bcc99bc2c625bb2abe4f0353dNate Begeman#include "llvm/CallingConv.h" 26bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner#include "llvm/Module.h" 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/Intrinsics.h" 2820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov#include "llvm/Target/TargetData.h" 295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace CodeGen; 315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris LattnerCodeGenModule::CodeGenModule(ASTContext &C, const LangOptions &LO, 34fb97b03e42d397405f617be0252be83e77a66f6eChris Lattner llvm::Module &M, const llvm::TargetData &TD, 35f77ac86f4eca528a04b817d7ad7f045a47d52712Daniel Dunbar Diagnostic &diags, bool GenerateDebugInfo) 36fb97b03e42d397405f617be0252be83e77a66f6eChris Lattner : Context(C), Features(LO), TheModule(M), TheTargetData(TD), Diags(diags), 37208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar Types(C, M, TD), Runtime(0), MemCpyFn(0), MemMoveFn(0), MemSetFn(0), 380c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman CFConstantStringClassRef(0) { 39208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar 40208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar if (Features.ObjC1) { 41f77ac86f4eca528a04b817d7ad7f045a47d52712Daniel Dunbar if (Features.NeXTRuntime) { 42208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar Runtime = CreateMacObjCRuntime(*this); 43208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar } else { 44208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar Runtime = CreateGNUObjCRuntime(*this); 45208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar } 46c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel Dunbar } 47e8b9f5b8ea60983c4a74cb8b63879616b914b65aSanjiv Gupta 48e8b9f5b8ea60983c4a74cb8b63879616b914b65aSanjiv Gupta // If debug info generation is enabled, create the CGDebugInfo object. 49815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek DebugInfo = GenerateDebugInfo ? new CGDebugInfo(this) : 0; 502b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris Lattner} 512b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris Lattner 522b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris LattnerCodeGenModule::~CodeGenModule() { 53815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek delete Runtime; 54815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek delete DebugInfo; 55815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek} 56815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek 57815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenekvoid CodeGenModule::Release() { 5820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov EmitStatics(); 59219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar EmitAliases(); 60208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar if (Runtime) 61208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar if (llvm::Function *ObjCInitFunction = Runtime->ModuleInitFunction()) 62208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar AddGlobalCtor(ObjCInitFunction); 636bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar EmitCtorList(GlobalCtors, "llvm.global_ctors"); 646bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar EmitCtorList(GlobalDtors, "llvm.global_dtors"); 65532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman EmitAnnotations(); 66f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar BindRuntimeFunctions(); 672b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris Lattner} 685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 69f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbarvoid CodeGenModule::BindRuntimeFunctions() { 70f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar // Deal with protecting runtime function names. 71f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar for (unsigned i = 0, e = RuntimeFunctions.size(); i < e; ++i) { 72f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar llvm::Function *Fn = RuntimeFunctions[i].first; 73f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar const std::string &Name = RuntimeFunctions[i].second; 74f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar 750293d540baafbe070c1035611787a81001a4118eDaniel Dunbar // Discard unused runtime functions. 760293d540baafbe070c1035611787a81001a4118eDaniel Dunbar if (Fn->use_empty()) { 770293d540baafbe070c1035611787a81001a4118eDaniel Dunbar Fn->eraseFromParent(); 780293d540baafbe070c1035611787a81001a4118eDaniel Dunbar continue; 790293d540baafbe070c1035611787a81001a4118eDaniel Dunbar } 800293d540baafbe070c1035611787a81001a4118eDaniel Dunbar 81f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar // See if there is a conflict against a function. 82f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar llvm::Function *Conflict = TheModule.getFunction(Name); 83f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar if (Conflict) { 84f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar // Decide which version to take. If the conflict is a definition 85f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar // we are forced to take that, otherwise assume the runtime 86f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar // knows best. 87f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar if (!Conflict->isDeclaration()) { 88f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar llvm::Value *Casted = 89f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar llvm::ConstantExpr::getBitCast(Conflict, Fn->getType()); 90f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar Fn->replaceAllUsesWith(Casted); 91f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar Fn->eraseFromParent(); 92f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar } else { 93f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar Fn->takeName(Conflict); 94f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar llvm::Value *Casted = 95f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar llvm::ConstantExpr::getBitCast(Fn, Conflict->getType()); 96f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar Conflict->replaceAllUsesWith(Casted); 97f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar Conflict->eraseFromParent(); 98f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar } 99f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar } else { 100f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar // FIXME: There still may be conflicts with aliases and 101f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar // variables. 102f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar Fn->setName(Name); 103f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar } 104f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar } 105f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar} 106f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar 107488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar/// ErrorUnsupported - Print out an error that codegen doesn't support the 1082c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner/// specified stmt yet. 10990df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbarvoid CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type, 11090df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar bool OmitOnError) { 11190df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar if (OmitOnError && getDiags().hasErrorOccurred()) 11290df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar return; 113488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar unsigned DiagID = getDiags().getCustomDiagID(Diagnostic::Error, 1142c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner "cannot codegen this %0 yet"); 1152c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner std::string Msg = Type; 1160a14eee528a901c16f0e288fbc10a3abc1660d87Chris Lattner getDiags().Report(Context.getFullLoc(S->getLocStart()), DiagID) 1170a14eee528a901c16f0e288fbc10a3abc1660d87Chris Lattner << Msg << S->getSourceRange(); 1182c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner} 11958c3f9ec11cbe852a518bf2f83af46f938b7b852Chris Lattner 120488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar/// ErrorUnsupported - Print out an error that codegen doesn't support the 121c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner/// specified decl yet. 12290df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbarvoid CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type, 12390df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar bool OmitOnError) { 12490df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar if (OmitOnError && getDiags().hasErrorOccurred()) 12590df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar return; 126488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar unsigned DiagID = getDiags().getCustomDiagID(Diagnostic::Error, 127c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner "cannot codegen this %0 yet"); 128c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner std::string Msg = Type; 1290a14eee528a901c16f0e288fbc10a3abc1660d87Chris Lattner getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID) << Msg; 130c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner} 131c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner 13241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar/// setGlobalVisibility - Set the visibility for the given LLVM 13341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar/// GlobalValue according to the given clang AST visibility value. 13441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbarstatic void setGlobalVisibility(llvm::GlobalValue *GV, 13541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar VisibilityAttr::VisibilityTypes Vis) { 1364f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman switch (Vis) { 1374f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman default: assert(0 && "Unknown visibility!"); 1384f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman case VisibilityAttr::DefaultVisibility: 1394f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman GV->setVisibility(llvm::GlobalValue::DefaultVisibility); 1404f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman break; 1414f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman case VisibilityAttr::HiddenVisibility: 1424f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman GV->setVisibility(llvm::GlobalValue::HiddenVisibility); 1434f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman break; 1444f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman case VisibilityAttr::ProtectedVisibility: 1454f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman GV->setVisibility(llvm::GlobalValue::ProtectedVisibility); 1464f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman break; 1474f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman } 1484f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman} 1494f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman 1506d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner/// AddGlobalCtor - Add a function to the list that will be called before 1516d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner/// main() runs. 1526bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::AddGlobalCtor(llvm::Function * Ctor, int Priority) { 1536d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner // TODO: Type coercion of void()* types. 1546bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar GlobalCtors.push_back(std::make_pair(Ctor, Priority)); 1556d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner} 1566d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner 1576bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar/// AddGlobalDtor - Add a function to the list that will be called 1586bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar/// when the module is unloaded. 1596bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::AddGlobalDtor(llvm::Function * Dtor, int Priority) { 1606bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // TODO: Type coercion of void()* types. 1616bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar GlobalDtors.push_back(std::make_pair(Dtor, Priority)); 1626bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar} 1636bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1646bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) { 1656bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // Ctor function type is void()*. 1666bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::FunctionType* CtorFTy = 1676bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::FunctionType::get(llvm::Type::VoidTy, 1686bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar std::vector<const llvm::Type*>(), 1696bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar false); 1706bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy); 1716bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1726bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // Get the type of a ctor entry, { i32, void ()* }. 173572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner llvm::StructType* CtorStructTy = 1746bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::StructType::get(llvm::Type::Int32Ty, 1756bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::PointerType::getUnqual(CtorFTy), NULL); 1766bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1776bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // Construct the constructor and destructor arrays. 1786bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar std::vector<llvm::Constant*> Ctors; 1796bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar for (CtorList::const_iterator I = Fns.begin(), E = Fns.end(); I != E; ++I) { 1806bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar std::vector<llvm::Constant*> S; 1816bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar S.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty, I->second, false)); 1826bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar S.push_back(llvm::ConstantExpr::getBitCast(I->first, CtorPFTy)); 1836bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar Ctors.push_back(llvm::ConstantStruct::get(CtorStructTy, S)); 1846bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar } 1856bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1866bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar if (!Ctors.empty()) { 1876bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::ArrayType *AT = llvm::ArrayType::get(CtorStructTy, Ctors.size()); 1886bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar new llvm::GlobalVariable(AT, false, 189572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner llvm::GlobalValue::AppendingLinkage, 1906bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::ConstantArray::get(AT, Ctors), 1916bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar GlobalName, 192572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner &TheModule); 1936d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner } 1946d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner} 1956d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner 196532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begemanvoid CodeGenModule::EmitAnnotations() { 197532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman if (Annotations.empty()) 198532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman return; 199532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman 200532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman // Create a new global variable for the ConstantStruct in the Module. 201532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::Constant *Array = 202532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::ConstantArray::get(llvm::ArrayType::get(Annotations[0]->getType(), 203532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman Annotations.size()), 204532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman Annotations); 205532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::GlobalValue *gv = 206532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman new llvm::GlobalVariable(Array->getType(), false, 207532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::GlobalValue::AppendingLinkage, Array, 208532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman "llvm.global.annotations", &TheModule); 209532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman gv->setSection("llvm.metadata"); 210532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman} 211532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman 2120dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarstatic void SetGlobalValueAttributes(const Decl *D, 2130dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar bool IsInternal, 2140dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar bool IsInline, 215219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::GlobalValue *GV, 216219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar bool ForDefinition) { 217d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes // TODO: Set up linkage and many other things. Note, this is a simple 218d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes // approximation of what we really want. 219219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar if (!ForDefinition) { 220219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // Only a few attributes are set on declarations. 2210dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar if (D->getAttr<DLLImportAttr>()) 2220dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar GV->setLinkage(llvm::Function::DLLImportLinkage); 223219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } else { 224219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar if (IsInternal) { 225219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar GV->setLinkage(llvm::Function::InternalLinkage); 226219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } else { 227219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar if (D->getAttr<DLLImportAttr>()) 228219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar GV->setLinkage(llvm::Function::DLLImportLinkage); 229219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar else if (D->getAttr<DLLExportAttr>()) 230219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar GV->setLinkage(llvm::Function::DLLExportLinkage); 231219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar else if (D->getAttr<WeakAttr>() || IsInline) 232219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar GV->setLinkage(llvm::Function::WeakLinkage); 233219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } 2340dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar } 235d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 2360dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar if (const VisibilityAttr *attr = D->getAttr<VisibilityAttr>()) 23741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar setGlobalVisibility(GV, attr->getVisibility()); 238d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes // FIXME: else handle -fvisibility 239a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar 2400dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar if (const AsmLabelAttr *ALA = D->getAttr<AsmLabelAttr>()) { 241a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // Prefaced with special LLVM marker to indicate that the name 242a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // should not be munged. 243a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar GV->setName("\01" + ALA->getLabel()); 244a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar } 245d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes} 246d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 247761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patelvoid CodeGenModule::SetFunctionAttributes(const Decl *D, 24845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar const CGFunctionInfo &Info, 249b768807c49a1c7085def099b848631856af766faDaniel Dunbar llvm::Function *F) { 250761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel AttributeListType AttributeList; 251761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel ConstructAttributeList(D, Info.argtypes_begin(), Info.argtypes_end(), 252761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel AttributeList); 253c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman 254761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel F->setAttributes(llvm::AttrListPtr::get(AttributeList.begin(), 255761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel AttributeList.size())); 256ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 257ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman // Set the appropriate calling convention for the Function. 25845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar if (D->getAttr<FastCallAttr>()) 259f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikov F->setCallingConv(llvm::CallingConv::X86_FastCall); 260f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikov 261f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikov if (D->getAttr<StdCallAttr>()) 262f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikov F->setCallingConv(llvm::CallingConv::X86_StdCall); 263f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar} 264f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar 265f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar/// SetFunctionAttributesForDefinition - Set function attributes 266f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar/// specific to a function definition. 267219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbarvoid CodeGenModule::SetFunctionAttributesForDefinition(const Decl *D, 268219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::Function *F) { 269219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar if (isa<ObjCMethodDecl>(D)) { 270219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar SetGlobalValueAttributes(D, true, false, F, true); 271219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } else { 272219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar const FunctionDecl *FD = cast<FunctionDecl>(D); 273219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar SetGlobalValueAttributes(FD, FD->getStorageClass() == FunctionDecl::Static, 274219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar FD->isInline(), F, true); 275219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } 276219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 277f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar if (!Features.Exceptions) 278f93349f3ec4d69eafba42436c33aaa91bfca7e70Daniel Dunbar F->addFnAttr(llvm::Attribute::NoUnwind); 279af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar 280af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar if (D->getAttr<AlwaysInlineAttr>()) 281af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar F->addFnAttr(llvm::Attribute::AlwaysInline); 282f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar} 283f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar 284f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbarvoid CodeGenModule::SetMethodAttributes(const ObjCMethodDecl *MD, 285f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar llvm::Function *F) { 286761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel SetFunctionAttributes(MD, CGFunctionInfo(MD, Context), F); 287f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar 288219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar SetFunctionAttributesForDefinition(MD, F); 289f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar} 290f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar 291f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbarvoid CodeGenModule::SetFunctionAttributes(const FunctionDecl *FD, 292f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar llvm::Function *F) { 293761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel SetFunctionAttributes(FD, CGFunctionInfo(FD), F); 29445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 295219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar SetGlobalValueAttributes(FD, FD->getStorageClass() == FunctionDecl::Static, 296219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar FD->isInline(), F, false); 297219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar} 298219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 29945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 300219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbarvoid CodeGenModule::EmitAliases() { 301219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar for (unsigned i = 0, e = Aliases.size(); i != e; ++i) { 302219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar const FunctionDecl *D = Aliases[i]; 303219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar const AliasAttr *AA = D->getAttr<AliasAttr>(); 304219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 305219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // This is something of a hack, if the FunctionDecl got overridden 306219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // then its attributes will be moved to the new declaration. In 307219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // this case the current decl has no alias attribute, but we will 308219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // eventually see it. 309219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar if (!AA) 310219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar continue; 311219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 312219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar const std::string& aliaseeName = AA->getAliasee(); 313219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::Function *aliasee = getModule().getFunction(aliaseeName); 314219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar if (!aliasee) { 315219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // FIXME: This isn't unsupported, this is just an error, which 316219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // sema should catch, but... 317219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar ErrorUnsupported(D, "alias referencing a missing function"); 318219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar continue; 319219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } 320219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 321219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::GlobalValue *GA = 322219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar new llvm::GlobalAlias(aliasee->getType(), 323219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::Function::ExternalLinkage, 324d9d22dd9c94618490dbffb0e2caf222530ca39d3Chris Lattner D->getNameAsString(), aliasee, &getModule()); 325219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 326219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getIdentifier()]; 327219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar if (Entry) { 328219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // If we created a dummy function for this then replace it. 329219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar GA->takeName(Entry); 330219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 331219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::Value *Casted = 332219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::ConstantExpr::getBitCast(GA, Entry->getType()); 333219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar Entry->replaceAllUsesWith(Casted); 334219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar Entry->eraseFromParent(); 335ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 336219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar Entry = GA; 337219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } 338219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 339219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // Alias should never be internal or inline. 340219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar SetGlobalValueAttributes(D, false, false, GA, true); 341219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } 342ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman} 343ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 3444c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begemanvoid CodeGenModule::EmitStatics() { 3454c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // Emit code for each used static decl encountered. Since a previously unused 3464c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // static decl may become used during the generation of code for a static 3474c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // function, iterate until no changes are made. 3484c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman bool Changed; 3494c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman do { 3504c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman Changed = false; 3514c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman for (unsigned i = 0, e = StaticDecls.size(); i != e; ++i) { 352bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar const ValueDecl *D = StaticDecls[i]; 3536f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman 3546f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman // Check if we have used a decl with the same name 3556f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman // FIXME: The AST should have some sort of aggregate decls or 3566f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman // global symbol map. 357219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // FIXME: This is missing some important cases. For example, we 358219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // need to check for uses in an alias and in a constructor. 35990db88249ac92e6ed515065048a4ead4467e6639Daniel Dunbar if (!GlobalDeclMap.count(D->getIdentifier())) 360a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar continue; 3616f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman 362bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Emit the definition. 363bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalDefinition(D); 364bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 3654c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // Erase the used decl from the list. 3664c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman StaticDecls[i] = StaticDecls.back(); 3674c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman StaticDecls.pop_back(); 3684c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman --i; 3694c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman --e; 3704c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman 3714c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // Remember that we made a change. 3724c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman Changed = true; 3734c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman } 3744c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman } while (Changed); 3755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3778bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// EmitAnnotateAttr - Generate the llvm::ConstantStruct which contains the 3788bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// annotation information for a given GlobalValue. The annotation struct is 3798bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// {i8 *, i8 *, i8 *, i32}. The first field is a constant expression, the 3803c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar/// GlobalValue being annotated. The second field is the constant string 3818bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// created from the AnnotateAttr's annotation. The third field is a constant 3828bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// string containing the name of the translation unit. The fourth field is 3838bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// the line number in the file of the annotated value declaration. 3848bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// 3858bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// FIXME: this does not unique the annotation string constants, as llvm-gcc 3868bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// appears to. 3878bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// 3888bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begemanllvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV, 3898bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman const AnnotateAttr *AA, 3908bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman unsigned LineNo) { 3918bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Module *M = &getModule(); 3928bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 3938bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // get [N x i8] constants for the annotation string, and the filename string 3948bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // which are the 2nd and 3rd elements of the global annotation structure. 3958bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman const llvm::Type *SBP = llvm::PointerType::getUnqual(llvm::Type::Int8Ty); 3968bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Constant *anno = llvm::ConstantArray::get(AA->getAnnotation(), true); 3978bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Constant *unit = llvm::ConstantArray::get(M->getModuleIdentifier(), 3988bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman true); 3998bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 4008bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // Get the two global values corresponding to the ConstantArrays we just 4018bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // created to hold the bytes of the strings. 4028bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue *annoGV = 4038bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman new llvm::GlobalVariable(anno->getType(), false, 4048bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue::InternalLinkage, anno, 4058bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman GV->getName() + ".str", M); 4068bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // translation unit name string, emitted into the llvm.metadata section. 4078bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue *unitGV = 4088bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman new llvm::GlobalVariable(unit->getType(), false, 4098bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue::InternalLinkage, unit, ".str", M); 4108bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 4118bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // Create the ConstantStruct that is the global annotion. 4128bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Constant *Fields[4] = { 4138bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantExpr::getBitCast(GV, SBP), 4148bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantExpr::getBitCast(annoGV, SBP), 4158bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantExpr::getBitCast(unitGV, SBP), 4168bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantInt::get(llvm::Type::Int32Ty, LineNo) 4178bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman }; 4188bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman return llvm::ConstantStruct::get(Fields, 4, false); 4198bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman} 4208bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 421bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobal(const ValueDecl *Global) { 422bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar bool isDef, isStatic; 423bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 424bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Global)) { 425219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // Aliases are deferred until code for everything else has been 426219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // emitted. 427219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar if (FD->getAttr<AliasAttr>()) { 428219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar assert(!FD->isThisDeclarationADefinition() && 429219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar "Function alias cannot have a definition!"); 430219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar Aliases.push_back(FD); 431219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar return; 432219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } 433219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 434219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar isDef = FD->isThisDeclarationADefinition(); 435bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar isStatic = FD->getStorageClass() == FunctionDecl::Static; 436bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else if (const VarDecl *VD = cast<VarDecl>(Global)) { 437bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar assert(VD->isFileVarDecl() && "Cannot emit local var decl as global."); 438bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 439bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar isDef = !(VD->getStorageClass() == VarDecl::Extern && VD->getInit() == 0); 440bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar isStatic = VD->getStorageClass() == VarDecl::Static; 441bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 442bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar assert(0 && "Invalid argument to EmitGlobal"); 4434c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman return; 4444c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman } 4454c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman 446bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Forward declarations are emitted lazily on first use. 447bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (!isDef) 44888a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner return; 449bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 450bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // If the global is a static, defer code generation until later so 451bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // we can easily omit unused statics. 452bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (isStatic) { 453bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar StaticDecls.push_back(Global); 454bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar return; 455bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 456bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 457bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Otherwise emit the definition. 458bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalDefinition(Global); 4594c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman} 4604c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman 461bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalDefinition(const ValueDecl *D) { 462bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 463bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalFunctionDefinition(FD); 464bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 465bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalVarDefinition(VD); 466bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 467bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar assert(0 && "Invalid argument to EmitGlobalDefinition()"); 468bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 469bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 470bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 4719986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D) { 47277ba708819285931932ecd33691a672bb59d221aEli Friedman assert(D->hasGlobalStorage() && "Not a global variable"); 47377ba708819285931932ecd33691a672bb59d221aEli Friedman 474bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar QualType ASTTy = D->getType(); 475bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar const llvm::Type *Ty = getTypes().ConvertTypeForMem(ASTTy); 4769986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar const llvm::Type *PTy = llvm::PointerType::get(Ty, ASTTy.getAddressSpace()); 477bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 4783c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar // Lookup the entry, lazily creating it if necessary. 47990db88249ac92e6ed515065048a4ead4467e6639Daniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getIdentifier()]; 4803c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (!Entry) 4813c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry = new llvm::GlobalVariable(Ty, false, 4823c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue::ExternalLinkage, 483d9d22dd9c94618490dbffb0e2caf222530ca39d3Chris Lattner 0, D->getNameAsString(), &getModule(), 0, 4843c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar ASTTy.getAddressSpace()); 4853c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 4869986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar // Make sure the result is of the correct type. 4879986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar return llvm::ConstantExpr::getBitCast(Entry, PTy); 488bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 489bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 490bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) { 4918f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner llvm::Constant *Init = 0; 49277ba708819285931932ecd33691a672bb59d221aEli Friedman QualType ASTTy = D->getType(); 49377ba708819285931932ecd33691a672bb59d221aEli Friedman const llvm::Type *VarTy = getTypes().ConvertTypeForMem(ASTTy); 49477ba708819285931932ecd33691a672bb59d221aEli Friedman 4958f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner if (D->getInit() == 0) { 496cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // This is a tentative definition; tentative definitions are 497cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // implicitly initialized with { 0 } 498cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman const llvm::Type* InitTy; 499cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman if (ASTTy->isIncompleteArrayType()) { 500cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // An incomplete array is normally [ TYPE x 0 ], but we need 501cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // to fix it to [ TYPE x 1 ]. 502cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman const llvm::ArrayType* ATy = cast<llvm::ArrayType>(VarTy); 503cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman InitTy = llvm::ArrayType::get(ATy->getElementType(), 1); 504cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman } else { 505cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman InitTy = VarTy; 506cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman } 507cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman Init = llvm::Constant::getNullValue(InitTy); 50877ba708819285931932ecd33691a672bb59d221aEli Friedman } else { 509bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar Init = EmitConstantExpr(D->getInit()); 5108f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner } 51177ba708819285931932ecd33691a672bb59d221aEli Friedman const llvm::Type* InitType = Init->getType(); 5128e53e720b3d7c962e91138a130dbd5d6c2def0e5Devang Patel 51390db88249ac92e6ed515065048a4ead4467e6639Daniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getIdentifier()]; 5143c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalVariable *GV = cast_or_null<llvm::GlobalVariable>(Entry); 5153c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 51677ba708819285931932ecd33691a672bb59d221aEli Friedman if (!GV) { 51777ba708819285931932ecd33691a672bb59d221aEli Friedman GV = new llvm::GlobalVariable(InitType, false, 51877ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::GlobalValue::ExternalLinkage, 519d9d22dd9c94618490dbffb0e2caf222530ca39d3Chris Lattner 0, D->getNameAsString(), &getModule(), 0, 52077ba708819285931932ecd33691a672bb59d221aEli Friedman ASTTy.getAddressSpace()); 5213c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar } else if (GV->getType() != 5223c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::PointerType::get(InitType, ASTTy.getAddressSpace())) { 52377ba708819285931932ecd33691a672bb59d221aEli Friedman // We have a definition after a prototype with the wrong type. 52477ba708819285931932ecd33691a672bb59d221aEli Friedman // We must make a new GlobalVariable* and update everything that used OldGV 52577ba708819285931932ecd33691a672bb59d221aEli Friedman // (a declaration or tentative definition) with the new GlobalVariable* 52677ba708819285931932ecd33691a672bb59d221aEli Friedman // (which will be a definition). 52777ba708819285931932ecd33691a672bb59d221aEli Friedman // 52877ba708819285931932ecd33691a672bb59d221aEli Friedman // This happens if there is a prototype for a global (e.g. "extern int x[];") 52977ba708819285931932ecd33691a672bb59d221aEli Friedman // and then a definition of a different type (e.g. "int x[10];"). This also 53077ba708819285931932ecd33691a672bb59d221aEli Friedman // happens when an initializer has a different type from the type of the 53177ba708819285931932ecd33691a672bb59d221aEli Friedman // global (this happens with unions). 532cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // 533cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // FIXME: This also ends up happening if there's a definition followed by 534cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // a tentative definition! (Although Sema rejects that construct 535cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // at the moment.) 53677ba708819285931932ecd33691a672bb59d221aEli Friedman 53777ba708819285931932ecd33691a672bb59d221aEli Friedman // Save the old global 53877ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::GlobalVariable *OldGV = GV; 53977ba708819285931932ecd33691a672bb59d221aEli Friedman 54077ba708819285931932ecd33691a672bb59d221aEli Friedman // Make a new global with the correct type 54177ba708819285931932ecd33691a672bb59d221aEli Friedman GV = new llvm::GlobalVariable(InitType, false, 54277ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::GlobalValue::ExternalLinkage, 543d9d22dd9c94618490dbffb0e2caf222530ca39d3Chris Lattner 0, D->getNameAsString(), &getModule(), 0, 54477ba708819285931932ecd33691a672bb59d221aEli Friedman ASTTy.getAddressSpace()); 54577ba708819285931932ecd33691a672bb59d221aEli Friedman // Steal the name of the old global 54677ba708819285931932ecd33691a672bb59d221aEli Friedman GV->takeName(OldGV); 54777ba708819285931932ecd33691a672bb59d221aEli Friedman 54877ba708819285931932ecd33691a672bb59d221aEli Friedman // Replace all uses of the old global with the new global 54977ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::Constant *NewPtrForOldDecl = 55077ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::ConstantExpr::getBitCast(GV, OldGV->getType()); 55177ba708819285931932ecd33691a672bb59d221aEli Friedman OldGV->replaceAllUsesWith(NewPtrForOldDecl); 55277ba708819285931932ecd33691a672bb59d221aEli Friedman 55377ba708819285931932ecd33691a672bb59d221aEli Friedman // Erase the old global, since it is no longer used. 55477ba708819285931932ecd33691a672bb59d221aEli Friedman OldGV->eraseFromParent(); 55577ba708819285931932ecd33691a672bb59d221aEli Friedman } 55677ba708819285931932ecd33691a672bb59d221aEli Friedman 5573c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry = GV; 5589e32d4b4a7270a9701b7cb454381eeaa4cc42a77Devang Patel 5598bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman if (const AnnotateAttr *AA = D->getAttr<AnnotateAttr>()) { 5608bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman SourceManager &SM = Context.getSourceManager(); 5618bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman AddAnnotation(EmitAnnotateAttr(GV, AA, 5628bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman SM.getLogicalLineNumber(D->getLocation()))); 5638bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman } 5648bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 56588a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner GV->setInitializer(Init); 566b381aac9bae6d608c72267dd0ed08ec6369e94e4Nuno Lopes GV->setConstant(D->getType().isConstant(Context)); 567ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 568cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // FIXME: This is silly; getTypeAlign should just work for incomplete arrays 569cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman unsigned Align; 570c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const IncompleteArrayType* IAT = 571c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner Context.getAsIncompleteArrayType(D->getType())) 572cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman Align = Context.getTypeAlign(IAT->getElementType()); 573cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman else 574cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman Align = Context.getTypeAlign(D->getType()); 57508d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman if (const AlignedAttr* AA = D->getAttr<AlignedAttr>()) { 57608d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman Align = std::max(Align, AA->getAlignment()); 57708d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman } 57808d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman GV->setAlignment(Align / 8); 57908d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman 580ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner if (const VisibilityAttr *attr = D->getAttr<VisibilityAttr>()) 58141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar setGlobalVisibility(GV, attr->getVisibility()); 582ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // FIXME: else handle -fvisibility 583a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar 584a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar if (const AsmLabelAttr *ALA = D->getAttr<AsmLabelAttr>()) { 585a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // Prefaced with special LLVM marker to indicate that the name 586a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // should not be munged. 587a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar GV->setName("\01" + ALA->getLabel()); 588a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar } 58988a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner 59088a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner // Set the llvm linkage type as appropriate. 5918fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner if (D->getStorageClass() == VarDecl::Static) 5928fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner GV->setLinkage(llvm::Function::InternalLinkage); 5938fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner else if (D->getAttr<DLLImportAttr>()) 594ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner GV->setLinkage(llvm::Function::DLLImportLinkage); 595ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner else if (D->getAttr<DLLExportAttr>()) 596ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner GV->setLinkage(llvm::Function::DLLExportLinkage); 5978fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner else if (D->getAttr<WeakAttr>()) 598ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner GV->setLinkage(llvm::GlobalVariable::WeakLinkage); 5998fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner else { 600ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // FIXME: This isn't right. This should handle common linkage and other 601ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // stuff. 602ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner switch (D->getStorageClass()) { 6038fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner case VarDecl::Static: assert(0 && "This case handled above"); 604ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::Auto: 605ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::Register: 606ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner assert(0 && "Can't have auto or register globals"); 607ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::None: 608ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner if (!D->getInit()) 609a07b76419a03f126c22949dce2e546ba4df0e415Eli Friedman GV->setLinkage(llvm::GlobalVariable::CommonLinkage); 61098883e1e699457697fb8d5ac6d175dd3ee078774Anders Carlsson else 61198883e1e699457697fb8d5ac6d175dd3ee078774Anders Carlsson GV->setLinkage(llvm::GlobalVariable::ExternalLinkage); 612ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner break; 613ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::Extern: 614ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::PrivateExtern: 615ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // todo: common 616ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner break; 617ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner } 61888a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner } 619686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta 620686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta // Emit global variable debug information. 621686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta CGDebugInfo *DI = getDebugInfo(); 622686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta if(DI) { 62366031a5594bc9a7dc0dc5137c3e7955f835e4639Daniel Dunbar DI->setLocation(D->getLocation()); 624686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta DI->EmitGlobalVariable(GV, D); 625686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta } 62688a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner} 6275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 628bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarllvm::GlobalValue * 629bd012ff1fa088181646a784f385b28867372d434Daniel DunbarCodeGenModule::EmitForwardFunctionDefinition(const FunctionDecl *D) { 630219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar const llvm::Type *Ty = getTypes().ConvertType(D->getType()); 631219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::Function *F = llvm::Function::Create(cast<llvm::FunctionType>(Ty), 632219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::Function::ExternalLinkage, 633d9d22dd9c94618490dbffb0e2caf222530ca39d3Chris Lattner D->getNameAsString(),&getModule()); 634219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar SetFunctionAttributes(D, F); 635219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar return F; 636bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 637bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 638bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarllvm::Constant *CodeGenModule::GetAddrOfFunction(const FunctionDecl *D) { 6399986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar QualType ASTTy = D->getType(); 6409986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar const llvm::Type *Ty = getTypes().ConvertTypeForMem(ASTTy); 6419986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar const llvm::Type *PTy = llvm::PointerType::get(Ty, ASTTy.getAddressSpace()); 6423c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 6433c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar // Lookup the entry, lazily creating it if necessary. 64490db88249ac92e6ed515065048a4ead4467e6639Daniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getIdentifier()]; 6453c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (!Entry) 6463c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry = EmitForwardFunctionDefinition(D); 647bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 6489986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar return llvm::ConstantExpr::getBitCast(Entry, PTy); 649bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 650bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 651bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalFunctionDefinition(const FunctionDecl *D) { 65290db88249ac92e6ed515065048a4ead4467e6639Daniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getIdentifier()]; 6533c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (!Entry) { 654bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar Entry = EmitForwardFunctionDefinition(D); 655bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 6563c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar // If the types mismatch then we have to rewrite the definition. 6573c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar const llvm::Type *Ty = getTypes().ConvertType(D->getType()); 6583c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (Entry->getType() != llvm::PointerType::getUnqual(Ty)) { 659bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Otherwise, we have a definition after a prototype with the wrong type. 660bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // F is the Function* for the one with the wrong type, we must make a new 661bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Function* and update everything that used F (a declaration) with the new 662bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Function* (which will be a definition). 663bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // 664bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // This happens if there is a prototype for a function (e.g. "int f()") and 665bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // then a definition of a different type (e.g. "int f(int x)"). Start by 666bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // making a new function of the correct type, RAUW, then steal the name. 6673c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue *NewFn = EmitForwardFunctionDefinition(D); 6683c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar NewFn->takeName(Entry); 669bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 670bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Replace uses of F with the Function we will endow with a body. 671bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Constant *NewPtrForOldDecl = 6723c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::ConstantExpr::getBitCast(NewFn, Entry->getType()); 6733c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry->replaceAllUsesWith(NewPtrForOldDecl); 6743c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 675bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Ok, delete the old function now, which is dead. 6763c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar assert(Entry->isDeclaration() && "Shouldn't replace non-declaration"); 677219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar Entry->eraseFromParent(); 678bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 679bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar Entry = NewFn; 680bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 681bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 682bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 683219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::Function *Fn = cast<llvm::Function>(Entry); 684219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar CodeGenFunction(*this).GenerateCode(D, Fn); 6856379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar 686219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar SetFunctionAttributesForDefinition(D, Fn); 687219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 688219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar if (const ConstructorAttr *CA = D->getAttr<ConstructorAttr>()) { 689219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar AddGlobalCtor(Fn, CA->getPriority()); 690219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } else if (const DestructorAttr *DA = D->getAttr<DestructorAttr>()) { 691219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar AddGlobalDtor(Fn, DA->getPriority()); 692bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 693bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 694bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 695f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbarllvm::Function * 696f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel DunbarCodeGenModule::CreateRuntimeFunction(const llvm::FunctionType *FTy, 697f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar const std::string &Name) { 698f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar llvm::Function *Fn = llvm::Function::Create(FTy, 699f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar llvm::Function::ExternalLinkage, 700f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar "", &TheModule); 701f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar RuntimeFunctions.push_back(std::make_pair(Fn, Name)); 702f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar return Fn; 703f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar} 704f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar 705c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattnervoid CodeGenModule::UpdateCompletedType(const TagDecl *TD) { 706c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattner // Make sure that this type is translated. 707c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattner Types.UpdateCompletedType(TD); 708d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner} 709d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner 710d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner 711bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner/// getBuiltinLibFunction 712bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattnerllvm::Function *CodeGenModule::getBuiltinLibFunction(unsigned BuiltinID) { 7131426fecdf90dd1986751b9940422e675880ff671Chris Lattner if (BuiltinID > BuiltinFunctions.size()) 7141426fecdf90dd1986751b9940422e675880ff671Chris Lattner BuiltinFunctions.resize(BuiltinID); 715bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 7161426fecdf90dd1986751b9940422e675880ff671Chris Lattner // Cache looked up functions. Since builtin id #0 is invalid we don't reserve 7171426fecdf90dd1986751b9940422e675880ff671Chris Lattner // a slot for it. 7181426fecdf90dd1986751b9940422e675880ff671Chris Lattner assert(BuiltinID && "Invalid Builtin ID"); 7191426fecdf90dd1986751b9940422e675880ff671Chris Lattner llvm::Function *&FunctionSlot = BuiltinFunctions[BuiltinID-1]; 720bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner if (FunctionSlot) 721bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner return FunctionSlot; 722bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 723bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner assert(Context.BuiltinInfo.isLibFunction(BuiltinID) && "isn't a lib fn"); 724bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 725bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // Get the name, skip over the __builtin_ prefix. 726bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner const char *Name = Context.BuiltinInfo.GetName(BuiltinID)+10; 727bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 728bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // Get the type for the builtin. 729bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner QualType Type = Context.BuiltinInfo.GetBuiltinType(BuiltinID, Context); 730bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner const llvm::FunctionType *Ty = 731bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner cast<llvm::FunctionType>(getTypes().ConvertType(Type)); 732bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 733bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // FIXME: This has a serious problem with code like this: 734bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // void abs() {} 735bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // ... __builtin_abs(x); 736bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // The two versions of abs will collide. The fix is for the builtin to win, 737bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // and for the existing one to be turned into a constantexpr cast of the 738bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // builtin. In the case where the existing one is a static function, it 739bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // should just be renamed. 740c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner if (llvm::Function *Existing = getModule().getFunction(Name)) { 741c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner if (Existing->getFunctionType() == Ty && Existing->hasExternalLinkage()) 742c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner return FunctionSlot = Existing; 743c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner assert(Existing == 0 && "FIXME: Name collision"); 744c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner } 745bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 746bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // FIXME: param attributes for sext/zext etc. 7474c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman return FunctionSlot = 7484c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman llvm::Function::Create(Ty, llvm::Function::ExternalLinkage, Name, 7494c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman &getModule()); 750bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner} 751bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 7527acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattnerllvm::Function *CodeGenModule::getIntrinsic(unsigned IID,const llvm::Type **Tys, 7537acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner unsigned NumTys) { 7547acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner return llvm::Intrinsic::getDeclaration(&getModule(), 7557acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner (llvm::Intrinsic::ID)IID, Tys, NumTys); 7567acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner} 757bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 7585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerllvm::Function *CodeGenModule::getMemCpyFn() { 7595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (MemCpyFn) return MemCpyFn; 7604e8a9e8640a6717120394ee2ee5f27989757754dChris Lattner const llvm::Type *IntPtr = TheTargetData.getIntPtrType(); 7614e8a9e8640a6717120394ee2ee5f27989757754dChris Lattner return MemCpyFn = getIntrinsic(llvm::Intrinsic::memcpy, &IntPtr, 1); 7625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 763c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 7640c99509927a0c7a48490486b9fec287b63e5c09cEli Friedmanllvm::Function *CodeGenModule::getMemMoveFn() { 7650c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman if (MemMoveFn) return MemMoveFn; 7664e8a9e8640a6717120394ee2ee5f27989757754dChris Lattner const llvm::Type *IntPtr = TheTargetData.getIntPtrType(); 7674e8a9e8640a6717120394ee2ee5f27989757754dChris Lattner return MemMoveFn = getIntrinsic(llvm::Intrinsic::memmove, &IntPtr, 1); 7680c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman} 7690c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman 77041ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venanciollvm::Function *CodeGenModule::getMemSetFn() { 77141ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio if (MemSetFn) return MemSetFn; 7724e8a9e8640a6717120394ee2ee5f27989757754dChris Lattner const llvm::Type *IntPtr = TheTargetData.getIntPtrType(); 7734e8a9e8640a6717120394ee2ee5f27989757754dChris Lattner return MemSetFn = getIntrinsic(llvm::Intrinsic::memset, &IntPtr, 1); 77441ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio} 7757acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner 776e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlssonstatic void appendFieldAndPadding(CodeGenModule &CGM, 777e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson std::vector<llvm::Constant*>& Fields, 77844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor FieldDecl *FieldD, FieldDecl *NextFieldD, 77944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor llvm::Constant* Field, 780e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson RecordDecl* RD, const llvm::StructType *STy) 781e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson{ 782e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson // Append the field. 783e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson Fields.push_back(Field); 784e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson 78544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor int StructFieldNo = CGM.getTypes().getLLVMFieldNo(FieldD); 786e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson 787e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson int NextStructFieldNo; 78844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (!NextFieldD) { 789e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson NextStructFieldNo = STy->getNumElements(); 790e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson } else { 79144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor NextStructFieldNo = CGM.getTypes().getLLVMFieldNo(NextFieldD); 792e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson } 793e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson 794e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson // Append padding 795e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson for (int i = StructFieldNo + 1; i < NextStructFieldNo; i++) { 796e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson llvm::Constant *C = 797e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson llvm::Constant::getNullValue(STy->getElementType(StructFieldNo + 1)); 798e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson 799e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson Fields.push_back(C); 800e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson } 801e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson} 802e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson 8033e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar// We still need to work out the details of handling UTF-16. 8043e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar// See: <rdr://2996215> 805bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattnerllvm::Constant *CodeGenModule:: 806bef20ac367a09555b30d6eb3847a81ec164caf88Chris LattnerGetAddrOfConstantCFString(const std::string &str) { 807c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::StringMapEntry<llvm::Constant *> &Entry = 808c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson CFConstantStringMap.GetOrCreateValue(&str[0], &str[str.length()]); 809c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 810c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson if (Entry.getValue()) 811c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson return Entry.getValue(); 812c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 8133e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar llvm::Constant *Zero = llvm::Constant::getNullValue(llvm::Type::Int32Ty); 8143e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar llvm::Constant *Zeros[] = { Zero, Zero }; 815c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 816c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson if (!CFConstantStringClassRef) { 817c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson const llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy); 818c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Ty = llvm::ArrayType::get(Ty, 0); 8193e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar 8203e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar // FIXME: This is fairly broken if 8213e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar // __CFConstantStringClassReference is already defined, in that it 8223e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar // will get renamed and the user will most likely see an opaque 8233e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar // error message. This is a general issue with relying on 8243e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar // particular names. 8253e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar llvm::GlobalVariable *GV = 826c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson new llvm::GlobalVariable(Ty, false, 827c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::GlobalVariable::ExternalLinkage, 0, 828c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson "__CFConstantStringClassReference", 829c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson &getModule()); 8303e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar 8313e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar // Decay array -> ptr 8323e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar CFConstantStringClassRef = 8333e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar llvm::ConstantExpr::getGetElementPtr(GV, Zeros, 2); 834c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson } 835c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 836e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson QualType CFTy = getContext().getCFConstantStringType(); 837e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson RecordDecl *CFRD = CFTy->getAsRecordType()->getDecl(); 8383e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar 839e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson const llvm::StructType *STy = 840e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson cast<llvm::StructType>(getTypes().ConvertType(CFTy)); 841e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson 842e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson std::vector<llvm::Constant*> Fields; 84344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor RecordDecl::field_iterator Field = CFRD->field_begin(); 84444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 845c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // Class pointer. 84644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor FieldDecl *CurField = *Field++; 84744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor FieldDecl *NextField = *Field++; 84844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor appendFieldAndPadding(*this, Fields, CurField, NextField, 84944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor CFConstantStringClassRef, CFRD, STy); 850c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 851c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // Flags. 85244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor CurField = NextField; 85344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor NextField = *Field++; 8543e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar const llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy); 85544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor appendFieldAndPadding(*this, Fields, CurField, NextField, 85644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor llvm::ConstantInt::get(Ty, 0x07C8), CFRD, STy); 857c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 858c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // String pointer. 85944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor CurField = NextField; 86044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor NextField = *Field++; 8613e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar llvm::Constant *C = llvm::ConstantArray::get(str); 862c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson C = new llvm::GlobalVariable(C->getType(), true, 863c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::GlobalValue::InternalLinkage, 864e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson C, ".str", &getModule()); 86544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor appendFieldAndPadding(*this, Fields, CurField, NextField, 866e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson llvm::ConstantExpr::getGetElementPtr(C, Zeros, 2), 867e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson CFRD, STy); 868c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 869c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // String length. 87044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor CurField = NextField; 87144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor NextField = 0; 872c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Ty = getTypes().ConvertType(getContext().LongTy); 87344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor appendFieldAndPadding(*this, Fields, CurField, NextField, 87444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor llvm::ConstantInt::get(Ty, str.length()), CFRD, STy); 875c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 876c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // The struct. 877e3daa761061982f2267f7c8fb847ea02abad0aa9Anders Carlsson C = llvm::ConstantStruct::get(STy, Fields); 8780c67829763b98bc670062b553897a851fab17401Anders Carlsson llvm::GlobalVariable *GV = 8790c67829763b98bc670062b553897a851fab17401Anders Carlsson new llvm::GlobalVariable(C->getType(), true, 8800c67829763b98bc670062b553897a851fab17401Anders Carlsson llvm::GlobalVariable::InternalLinkage, 8810c67829763b98bc670062b553897a851fab17401Anders Carlsson C, "", &getModule()); 8823e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar 8830c67829763b98bc670062b553897a851fab17401Anders Carlsson GV->setSection("__DATA,__cfstring"); 8840c67829763b98bc670062b553897a851fab17401Anders Carlsson Entry.setValue(GV); 8853e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar 8860c67829763b98bc670062b553897a851fab17401Anders Carlsson return GV; 887c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson} 88845e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 8896143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// GetStringForStringLiteral - Return the appropriate bytes for a 8901e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar/// string literal, properly padded to match the literal type. 8916143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbarstd::string CodeGenModule::GetStringForStringLiteral(const StringLiteral *E) { 892662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar if (E->isWide()) { 893662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar ErrorUnsupported(E, "wide string"); 894662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar return "FIXME"; 895662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar } 896662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar 8971e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar const char *StrData = E->getStrData(); 8981e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar unsigned Len = E->getByteLength(); 8991e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 9001e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar const ConstantArrayType *CAT = 9011e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar getContext().getAsConstantArrayType(E->getType()); 9021e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar assert(CAT && "String isn't pointer or array!"); 9031e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 9041e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar // Resize the string to the right size 9051e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar // FIXME: What about wchar_t strings? 9061e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar std::string Str(StrData, StrData+Len); 9071e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar uint64_t RealLen = CAT->getSize().getZExtValue(); 9081e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar Str.resize(RealLen, '\0'); 9091e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 9101e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar return Str; 9111e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar} 9121e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 9136143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// GetAddrOfConstantStringFromLiteral - Return a pointer to a 9146143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// constant array for the given string literal. 9156143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbarllvm::Constant * 9166143293fa4366ee95d7e47e61bd030a34bf68b55Daniel DunbarCodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S) { 9176143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar // FIXME: This can be more efficient. 9186143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar return GetAddrOfConstantString(GetStringForStringLiteral(S)); 9196143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar} 9206143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar 921a7ad98ff0919d6a24ea7c46634ea29bea551c1a0Chris Lattner/// GenerateWritableString -- Creates storage for a string literal. 92245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattnerstatic llvm::Constant *GenerateStringLiteral(const std::string &str, 92345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner bool constant, 9245fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbar CodeGenModule &CGM, 9255fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbar const char *GlobalName) { 9266143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar // Create Constant for this string literal. Don't add a '\0'. 9276143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar llvm::Constant *C = llvm::ConstantArray::get(str, false); 92845e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 92945e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner // Create a global variable for this string 93045e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner C = new llvm::GlobalVariable(C->getType(), constant, 93145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner llvm::GlobalValue::InternalLinkage, 9325fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbar C, 9335fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbar GlobalName ? GlobalName : ".str", 9345fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbar &CGM.getModule()); 9356143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar 93645e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner return C; 93745e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner} 93845e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 9396143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// GetAddrOfConstantString - Returns a pointer to a character array 9406143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// containing the literal. This contents are exactly that of the 9416143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// given string, i.e. it will not be null terminated automatically; 9426143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// see GetAddrOfConstantCString. Note that whether the result is 9436143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// actually a pointer to an LLVM constant depends on 9446143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// Feature.WriteableStrings. 9456143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// 9466143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// The result has pointer to array type. 9475fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbarllvm::Constant *CodeGenModule::GetAddrOfConstantString(const std::string &str, 9485fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbar const char *GlobalName) { 94945e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner // Don't share any string literals if writable-strings is turned on. 95045e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner if (Features.WritableStrings) 9515fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbar return GenerateStringLiteral(str, false, *this, GlobalName); 95245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 95345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner llvm::StringMapEntry<llvm::Constant *> &Entry = 95445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner ConstantStringMap.GetOrCreateValue(&str[0], &str[str.length()]); 95545e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 95645e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner if (Entry.getValue()) 95745e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner return Entry.getValue(); 95845e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 95945e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner // Create a global variable for this. 9605fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbar llvm::Constant *C = GenerateStringLiteral(str, true, *this, GlobalName); 96145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner Entry.setValue(C); 96245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner return C; 96345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner} 9646143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar 9656143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// GetAddrOfConstantCString - Returns a pointer to a character 9666143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// array containing the literal and a terminating '\-' 9676143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// character. The result has pointer to array type. 9685fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbarllvm::Constant *CodeGenModule::GetAddrOfConstantCString(const std::string &str, 9695fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbar const char *GlobalName){ 970c9f29c61856ffb5f643cedbe87ac076f21a1381aChris Lattner return GetAddrOfConstantString(str + '\0', GlobalName); 9716143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar} 97241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 973af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar/// EmitObjCPropertyImplementations - Emit information for synthesized 974af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar/// properties for an implementation. 975af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbarvoid CodeGenModule::EmitObjCPropertyImplementations(const 976af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar ObjCImplementationDecl *D) { 977af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar for (ObjCImplementationDecl::propimpl_iterator i = D->propimpl_begin(), 978af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar e = D->propimpl_end(); i != e; ++i) { 979af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar ObjCPropertyImplDecl *PID = *i; 980af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar 981af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar // Dynamic is just for type-checking. 982af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) { 983af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar ObjCPropertyDecl *PD = PID->getPropertyDecl(); 984af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar 985af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar // Determine which methods need to be implemented, some may have 986af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar // been overridden. Note that ::isSynthesized is not the method 987af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar // we want, that just indicates if the decl came from a 988af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar // property. What we want to know is if the method is defined in 989af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar // this implementation. 990af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar if (!D->getInstanceMethod(PD->getGetterName())) 991fef30b55230064d334a669a065a1c9acdb87cdfeFariborz Jahanian CodeGenFunction(*this).GenerateObjCGetter( 992fef30b55230064d334a669a065a1c9acdb87cdfeFariborz Jahanian const_cast<ObjCImplementationDecl *>(D), PID); 993af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar if (!PD->isReadOnly() && 994af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar !D->getInstanceMethod(PD->getSetterName())) 995fef30b55230064d334a669a065a1c9acdb87cdfeFariborz Jahanian CodeGenFunction(*this).GenerateObjCSetter( 996fef30b55230064d334a669a065a1c9acdb87cdfeFariborz Jahanian const_cast<ObjCImplementationDecl *>(D), PID); 997af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar } 998af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar } 999af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar} 1000af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar 100141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar/// EmitTopLevelDecl - Emit code for a single top level declaration. 100241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbarvoid CodeGenModule::EmitTopLevelDecl(Decl *D) { 100341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // If an error has occurred, stop code generation, but continue 100441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // parsing and semantic analysis (to ensure all warnings and errors 100541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // are emitted). 100641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar if (Diags.hasErrorOccurred()) 100741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar return; 100841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 100941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar switch (D->getKind()) { 101041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::Function: 101141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::Var: 101241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar EmitGlobal(cast<ValueDecl>(D)); 101341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 101441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 101541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::Namespace: 1016662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar ErrorUnsupported(D, "namespace"); 101741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 101841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 101941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // Objective-C Decls 102041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 102141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // Forward declarations, no (immediate) code generation. 102241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::ObjCClass: 102341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::ObjCCategory: 102441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::ObjCForwardProtocol: 102541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::ObjCInterface: 102641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 102741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 102841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::ObjCProtocol: 102941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar Runtime->GenerateProtocol(cast<ObjCProtocolDecl>(D)); 103041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 103141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 103241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::ObjCCategoryImpl: 1033af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar // Categories have properties but don't support synthesize so we 1034af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar // can ignore them here. 1035af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar 103641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar Runtime->GenerateCategory(cast<ObjCCategoryImplDecl>(D)); 103741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 103841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 1039af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar case Decl::ObjCImplementation: { 1040af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar ObjCImplementationDecl *OMD = cast<ObjCImplementationDecl>(D); 1041af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar EmitObjCPropertyImplementations(OMD); 1042af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar Runtime->GenerateClass(OMD); 104341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 1044af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar } 104541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::ObjCMethod: { 104641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(D); 104741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // If this is not a prototype, emit the body. 104841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar if (OMD->getBody()) 104941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar CodeGenFunction(*this).GenerateObjCMethod(OMD); 105041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 105141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar } 105241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::ObjCCompatibleAlias: 1053662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar ErrorUnsupported(D, "Objective-C compatible alias"); 105441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 105541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 105641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::LinkageSpec: { 105741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar LinkageSpecDecl *LSD = cast<LinkageSpecDecl>(D); 105841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar if (LSD->getLanguage() == LinkageSpecDecl::lang_cxx) 1059488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar ErrorUnsupported(LSD, "linkage spec"); 106041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // FIXME: implement C++ linkage, C linkage works mostly by C 106141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // language reuse already. 106241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 106341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar } 106441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 106541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::FileScopeAsm: { 106641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar FileScopeAsmDecl *AD = cast<FileScopeAsmDecl>(D); 106741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar std::string AsmString(AD->getAsmString()->getStrData(), 106841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar AD->getAsmString()->getByteLength()); 106941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 107041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar const std::string &S = getModule().getModuleInlineAsm(); 107141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar if (S.empty()) 107241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar getModule().setModuleInlineAsm(AsmString); 107341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar else 107441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar getModule().setModuleInlineAsm(S + '\n' + AsmString); 107541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 107641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar } 107741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 107841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar default: 107941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // Make sure we handled everything we should, every other kind is 108041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // a non-top-level decl. FIXME: Would be nice to have an 108141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // isTopLevelDeclKind function. Need to recode Decl::Kind to do 108241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // that easily. 108341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar assert(isa<TypeDecl>(D) && "Unsupported decl kind"); 108441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar } 108541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar} 108641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 1087