CodeGenModule.cpp revision f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80
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 75f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar // See if there is a conflict against a function. 76f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar llvm::Function *Conflict = TheModule.getFunction(Name); 77f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar if (Conflict) { 78f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar // Decide which version to take. If the conflict is a definition 79f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar // we are forced to take that, otherwise assume the runtime 80f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar // knows best. 81f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar if (!Conflict->isDeclaration()) { 82f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar llvm::Value *Casted = 83f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar llvm::ConstantExpr::getBitCast(Conflict, Fn->getType()); 84f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar Fn->replaceAllUsesWith(Casted); 85f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar Fn->eraseFromParent(); 86f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar } else { 87f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar Fn->takeName(Conflict); 88f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar llvm::Value *Casted = 89f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar llvm::ConstantExpr::getBitCast(Fn, Conflict->getType()); 90f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar Conflict->replaceAllUsesWith(Casted); 91f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar Conflict->eraseFromParent(); 92f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar } 93f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar } else { 94f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar // FIXME: There still may be conflicts with aliases and 95f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar // variables. 96f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar Fn->setName(Name); 97f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar } 98f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar } 99f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar} 100f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar 101488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar/// ErrorUnsupported - Print out an error that codegen doesn't support the 1022c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner/// specified stmt yet. 10390df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbarvoid CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type, 10490df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar bool OmitOnError) { 10590df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar if (OmitOnError && getDiags().hasErrorOccurred()) 10690df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar return; 107488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar unsigned DiagID = getDiags().getCustomDiagID(Diagnostic::Error, 1082c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner "cannot codegen this %0 yet"); 1092c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner SourceRange Range = S->getSourceRange(); 1102c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner std::string Msg = Type; 1119c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek getDiags().Report(Context.getFullLoc(S->getLocStart()), DiagID, 1127a9d49fd2bfac00e905b361ba76d26ab5b6c3b09Ted Kremenek &Msg, 1, &Range, 1); 1132c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner} 11458c3f9ec11cbe852a518bf2f83af46f938b7b852Chris Lattner 115488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar/// ErrorUnsupported - Print out an error that codegen doesn't support the 116c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner/// specified decl yet. 11790df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbarvoid CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type, 11890df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar bool OmitOnError) { 11990df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar if (OmitOnError && getDiags().hasErrorOccurred()) 12090df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar return; 121488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar unsigned DiagID = getDiags().getCustomDiagID(Diagnostic::Error, 122c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner "cannot codegen this %0 yet"); 123c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner std::string Msg = Type; 124c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID, 125c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner &Msg, 1); 126c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner} 127c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner 12841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar/// setGlobalVisibility - Set the visibility for the given LLVM 12941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar/// GlobalValue according to the given clang AST visibility value. 13041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbarstatic void setGlobalVisibility(llvm::GlobalValue *GV, 13141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar VisibilityAttr::VisibilityTypes Vis) { 1324f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman switch (Vis) { 1334f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman default: assert(0 && "Unknown visibility!"); 1344f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman case VisibilityAttr::DefaultVisibility: 1354f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman GV->setVisibility(llvm::GlobalValue::DefaultVisibility); 1364f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman break; 1374f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman case VisibilityAttr::HiddenVisibility: 1384f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman GV->setVisibility(llvm::GlobalValue::HiddenVisibility); 1394f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman break; 1404f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman case VisibilityAttr::ProtectedVisibility: 1414f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman GV->setVisibility(llvm::GlobalValue::ProtectedVisibility); 1424f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman break; 1434f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman } 1444f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman} 1454f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman 1466d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner/// AddGlobalCtor - Add a function to the list that will be called before 1476d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner/// main() runs. 1486bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::AddGlobalCtor(llvm::Function * Ctor, int Priority) { 1496d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner // TODO: Type coercion of void()* types. 1506bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar GlobalCtors.push_back(std::make_pair(Ctor, Priority)); 1516d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner} 1526d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner 1536bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar/// AddGlobalDtor - Add a function to the list that will be called 1546bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar/// when the module is unloaded. 1556bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::AddGlobalDtor(llvm::Function * Dtor, int Priority) { 1566bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // TODO: Type coercion of void()* types. 1576bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar GlobalDtors.push_back(std::make_pair(Dtor, Priority)); 1586bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar} 1596bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1606bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) { 1616bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // Ctor function type is void()*. 1626bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::FunctionType* CtorFTy = 1636bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::FunctionType::get(llvm::Type::VoidTy, 1646bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar std::vector<const llvm::Type*>(), 1656bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar false); 1666bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy); 1676bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1686bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // Get the type of a ctor entry, { i32, void ()* }. 169572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner llvm::StructType* CtorStructTy = 1706bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::StructType::get(llvm::Type::Int32Ty, 1716bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::PointerType::getUnqual(CtorFTy), NULL); 1726bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1736bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar // Construct the constructor and destructor arrays. 1746bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar std::vector<llvm::Constant*> Ctors; 1756bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar for (CtorList::const_iterator I = Fns.begin(), E = Fns.end(); I != E; ++I) { 1766bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar std::vector<llvm::Constant*> S; 1776bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar S.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty, I->second, false)); 1786bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar S.push_back(llvm::ConstantExpr::getBitCast(I->first, CtorPFTy)); 1796bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar Ctors.push_back(llvm::ConstantStruct::get(CtorStructTy, S)); 1806bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar } 1816bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1826bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar if (!Ctors.empty()) { 1836bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::ArrayType *AT = llvm::ArrayType::get(CtorStructTy, Ctors.size()); 1846bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar new llvm::GlobalVariable(AT, false, 185572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner llvm::GlobalValue::AppendingLinkage, 1866bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar llvm::ConstantArray::get(AT, Ctors), 1876bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar GlobalName, 188572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner &TheModule); 1896d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner } 1906d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner} 1916d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner 192532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begemanvoid CodeGenModule::EmitAnnotations() { 193532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman if (Annotations.empty()) 194532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman return; 195532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman 196532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman // Create a new global variable for the ConstantStruct in the Module. 197532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::Constant *Array = 198532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::ConstantArray::get(llvm::ArrayType::get(Annotations[0]->getType(), 199532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman Annotations.size()), 200532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman Annotations); 201532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::GlobalValue *gv = 202532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman new llvm::GlobalVariable(Array->getType(), false, 203532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman llvm::GlobalValue::AppendingLinkage, Array, 204532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman "llvm.global.annotations", &TheModule); 205532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman gv->setSection("llvm.metadata"); 206532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman} 207532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman 2080dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarstatic void SetGlobalValueAttributes(const Decl *D, 2090dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar bool IsInternal, 2100dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar bool IsInline, 211219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::GlobalValue *GV, 212219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar bool ForDefinition) { 213d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes // TODO: Set up linkage and many other things. Note, this is a simple 214d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes // approximation of what we really want. 215219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar if (!ForDefinition) { 216219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // Only a few attributes are set on declarations. 2170dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar if (D->getAttr<DLLImportAttr>()) 2180dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar GV->setLinkage(llvm::Function::DLLImportLinkage); 219219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } else { 220219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar if (IsInternal) { 221219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar GV->setLinkage(llvm::Function::InternalLinkage); 222219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } else { 223219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar if (D->getAttr<DLLImportAttr>()) 224219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar GV->setLinkage(llvm::Function::DLLImportLinkage); 225219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar else if (D->getAttr<DLLExportAttr>()) 226219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar GV->setLinkage(llvm::Function::DLLExportLinkage); 227219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar else if (D->getAttr<WeakAttr>() || IsInline) 228219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar GV->setLinkage(llvm::Function::WeakLinkage); 229219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } 2300dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar } 231d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 2320dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar if (const VisibilityAttr *attr = D->getAttr<VisibilityAttr>()) 23341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar setGlobalVisibility(GV, attr->getVisibility()); 234d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes // FIXME: else handle -fvisibility 235a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar 2360dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar if (const AsmLabelAttr *ALA = D->getAttr<AsmLabelAttr>()) { 237a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // Prefaced with special LLVM marker to indicate that the name 238a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // should not be munged. 239a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar GV->setName("\01" + ALA->getLabel()); 240a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar } 241d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes} 242d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 243761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patelvoid CodeGenModule::SetFunctionAttributes(const Decl *D, 24445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar const CGFunctionInfo &Info, 245b768807c49a1c7085def099b848631856af766faDaniel Dunbar llvm::Function *F) { 246761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel AttributeListType AttributeList; 247761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel ConstructAttributeList(D, Info.argtypes_begin(), Info.argtypes_end(), 248761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel AttributeList); 249c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman 250761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel F->setAttributes(llvm::AttrListPtr::get(AttributeList.begin(), 251761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel AttributeList.size())); 252ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 253ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman // Set the appropriate calling convention for the Function. 25445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar if (D->getAttr<FastCallAttr>()) 255f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikov F->setCallingConv(llvm::CallingConv::X86_FastCall); 256f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikov 257f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikov if (D->getAttr<StdCallAttr>()) 258f1c9c09e2e2220e4bbfb7e9d8adf9bf2c2406b80Anton Korobeynikov F->setCallingConv(llvm::CallingConv::X86_StdCall); 259f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar} 260f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar 261f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar/// SetFunctionAttributesForDefinition - Set function attributes 262f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar/// specific to a function definition. 263219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbarvoid CodeGenModule::SetFunctionAttributesForDefinition(const Decl *D, 264219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::Function *F) { 265219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar if (isa<ObjCMethodDecl>(D)) { 266219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar SetGlobalValueAttributes(D, true, false, F, true); 267219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } else { 268219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar const FunctionDecl *FD = cast<FunctionDecl>(D); 269219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar SetGlobalValueAttributes(FD, FD->getStorageClass() == FunctionDecl::Static, 270219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar FD->isInline(), F, true); 271219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } 272219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 273f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar if (!Features.Exceptions) 274f93349f3ec4d69eafba42436c33aaa91bfca7e70Daniel Dunbar F->addFnAttr(llvm::Attribute::NoUnwind); 275af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar 276af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar if (D->getAttr<AlwaysInlineAttr>()) 277af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar F->addFnAttr(llvm::Attribute::AlwaysInline); 278f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar} 279f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar 280f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbarvoid CodeGenModule::SetMethodAttributes(const ObjCMethodDecl *MD, 281f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar llvm::Function *F) { 282761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel SetFunctionAttributes(MD, CGFunctionInfo(MD, Context), F); 283f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar 284219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar SetFunctionAttributesForDefinition(MD, F); 285f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar} 286f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar 287f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbarvoid CodeGenModule::SetFunctionAttributes(const FunctionDecl *FD, 288f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar llvm::Function *F) { 289761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel SetFunctionAttributes(FD, CGFunctionInfo(FD), F); 29045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 291219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar SetGlobalValueAttributes(FD, FD->getStorageClass() == FunctionDecl::Static, 292219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar FD->isInline(), F, false); 293219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar} 294219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 29545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 296219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbarvoid CodeGenModule::EmitAliases() { 297219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar for (unsigned i = 0, e = Aliases.size(); i != e; ++i) { 298219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar const FunctionDecl *D = Aliases[i]; 299219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar const AliasAttr *AA = D->getAttr<AliasAttr>(); 300219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 301219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // This is something of a hack, if the FunctionDecl got overridden 302219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // then its attributes will be moved to the new declaration. In 303219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // this case the current decl has no alias attribute, but we will 304219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // eventually see it. 305219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar if (!AA) 306219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar continue; 307219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 308219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar const std::string& aliaseeName = AA->getAliasee(); 309219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::Function *aliasee = getModule().getFunction(aliaseeName); 310219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar if (!aliasee) { 311219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // FIXME: This isn't unsupported, this is just an error, which 312219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // sema should catch, but... 313219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar ErrorUnsupported(D, "alias referencing a missing function"); 314219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar continue; 315219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } 316219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 317219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::GlobalValue *GA = 318219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar new llvm::GlobalAlias(aliasee->getType(), 319219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::Function::ExternalLinkage, 320219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar D->getName(), 321219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar aliasee, 322219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar &getModule()); 323219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 324219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getIdentifier()]; 325219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar if (Entry) { 326219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // If we created a dummy function for this then replace it. 327219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar GA->takeName(Entry); 328219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 329219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::Value *Casted = 330219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::ConstantExpr::getBitCast(GA, Entry->getType()); 331219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar Entry->replaceAllUsesWith(Casted); 332219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar Entry->eraseFromParent(); 333ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 334219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar Entry = GA; 335219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } 336219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 337219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // Alias should never be internal or inline. 338219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar SetGlobalValueAttributes(D, false, false, GA, true); 339219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } 340ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman} 341ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman 3424c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begemanvoid CodeGenModule::EmitStatics() { 3434c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // Emit code for each used static decl encountered. Since a previously unused 3444c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // static decl may become used during the generation of code for a static 3454c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // function, iterate until no changes are made. 3464c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman bool Changed; 3474c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman do { 3484c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman Changed = false; 3494c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman for (unsigned i = 0, e = StaticDecls.size(); i != e; ++i) { 350bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar const ValueDecl *D = StaticDecls[i]; 3516f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman 3526f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman // Check if we have used a decl with the same name 3536f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman // FIXME: The AST should have some sort of aggregate decls or 3546f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman // global symbol map. 355219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // FIXME: This is missing some important cases. For example, we 356219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // need to check for uses in an alias and in a constructor. 35790db88249ac92e6ed515065048a4ead4467e6639Daniel Dunbar if (!GlobalDeclMap.count(D->getIdentifier())) 358a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar continue; 3596f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman 360bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Emit the definition. 361bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalDefinition(D); 362bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 3634c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // Erase the used decl from the list. 3644c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman StaticDecls[i] = StaticDecls.back(); 3654c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman StaticDecls.pop_back(); 3664c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman --i; 3674c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman --e; 3684c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman 3694c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman // Remember that we made a change. 3704c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman Changed = true; 3714c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman } 3724c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman } while (Changed); 3735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3758bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// EmitAnnotateAttr - Generate the llvm::ConstantStruct which contains the 3768bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// annotation information for a given GlobalValue. The annotation struct is 3778bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// {i8 *, i8 *, i8 *, i32}. The first field is a constant expression, the 3783c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar/// GlobalValue being annotated. The second field is the constant string 3798bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// created from the AnnotateAttr's annotation. The third field is a constant 3808bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// string containing the name of the translation unit. The fourth field is 3818bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// the line number in the file of the annotated value declaration. 3828bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// 3838bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// FIXME: this does not unique the annotation string constants, as llvm-gcc 3848bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// appears to. 3858bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// 3868bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begemanllvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV, 3878bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman const AnnotateAttr *AA, 3888bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman unsigned LineNo) { 3898bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Module *M = &getModule(); 3908bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 3918bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // get [N x i8] constants for the annotation string, and the filename string 3928bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // which are the 2nd and 3rd elements of the global annotation structure. 3938bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman const llvm::Type *SBP = llvm::PointerType::getUnqual(llvm::Type::Int8Ty); 3948bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Constant *anno = llvm::ConstantArray::get(AA->getAnnotation(), true); 3958bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Constant *unit = llvm::ConstantArray::get(M->getModuleIdentifier(), 3968bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman true); 3978bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 3988bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // Get the two global values corresponding to the ConstantArrays we just 3998bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // created to hold the bytes of the strings. 4008bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue *annoGV = 4018bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman new llvm::GlobalVariable(anno->getType(), false, 4028bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue::InternalLinkage, anno, 4038bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman GV->getName() + ".str", M); 4048bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // translation unit name string, emitted into the llvm.metadata section. 4058bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue *unitGV = 4068bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman new llvm::GlobalVariable(unit->getType(), false, 4078bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::GlobalValue::InternalLinkage, unit, ".str", M); 4088bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 4098bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman // Create the ConstantStruct that is the global annotion. 4108bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::Constant *Fields[4] = { 4118bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantExpr::getBitCast(GV, SBP), 4128bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantExpr::getBitCast(annoGV, SBP), 4138bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantExpr::getBitCast(unitGV, SBP), 4148bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman llvm::ConstantInt::get(llvm::Type::Int32Ty, LineNo) 4158bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman }; 4168bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman return llvm::ConstantStruct::get(Fields, 4, false); 4178bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman} 4188bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 419bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobal(const ValueDecl *Global) { 420bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar bool isDef, isStatic; 421bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 422bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Global)) { 423219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // Aliases are deferred until code for everything else has been 424219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar // emitted. 425219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar if (FD->getAttr<AliasAttr>()) { 426219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar assert(!FD->isThisDeclarationADefinition() && 427219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar "Function alias cannot have a definition!"); 428219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar Aliases.push_back(FD); 429219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar return; 430219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } 431219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 432219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar isDef = FD->isThisDeclarationADefinition(); 433bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar isStatic = FD->getStorageClass() == FunctionDecl::Static; 434bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else if (const VarDecl *VD = cast<VarDecl>(Global)) { 435bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar assert(VD->isFileVarDecl() && "Cannot emit local var decl as global."); 436bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 437bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar isDef = !(VD->getStorageClass() == VarDecl::Extern && VD->getInit() == 0); 438bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar isStatic = VD->getStorageClass() == VarDecl::Static; 439bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 440bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar assert(0 && "Invalid argument to EmitGlobal"); 4414c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman return; 4424c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman } 4434c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman 444bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Forward declarations are emitted lazily on first use. 445bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (!isDef) 44688a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner return; 447bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 448bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // If the global is a static, defer code generation until later so 449bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // we can easily omit unused statics. 450bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (isStatic) { 451bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar StaticDecls.push_back(Global); 452bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar return; 453bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 454bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 455bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Otherwise emit the definition. 456bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalDefinition(Global); 4574c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman} 4584c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman 459bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalDefinition(const ValueDecl *D) { 460bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 461bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalFunctionDefinition(FD); 462bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 463bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar EmitGlobalVarDefinition(VD); 464bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 465bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar assert(0 && "Invalid argument to EmitGlobalDefinition()"); 466bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 467bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 468bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 4699986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D) { 47077ba708819285931932ecd33691a672bb59d221aEli Friedman assert(D->hasGlobalStorage() && "Not a global variable"); 47177ba708819285931932ecd33691a672bb59d221aEli Friedman 472bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar QualType ASTTy = D->getType(); 473bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar const llvm::Type *Ty = getTypes().ConvertTypeForMem(ASTTy); 4749986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar const llvm::Type *PTy = llvm::PointerType::get(Ty, ASTTy.getAddressSpace()); 475bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 4763c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar // Lookup the entry, lazily creating it if necessary. 47790db88249ac92e6ed515065048a4ead4467e6639Daniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getIdentifier()]; 4783c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (!Entry) 4793c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry = new llvm::GlobalVariable(Ty, false, 4803c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue::ExternalLinkage, 4813c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 0, D->getName(), &getModule(), 0, 4823c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar ASTTy.getAddressSpace()); 4833c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 4849986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar // Make sure the result is of the correct type. 4859986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar return llvm::ConstantExpr::getBitCast(Entry, PTy); 486bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 487bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 488bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) { 4898f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner llvm::Constant *Init = 0; 49077ba708819285931932ecd33691a672bb59d221aEli Friedman QualType ASTTy = D->getType(); 49177ba708819285931932ecd33691a672bb59d221aEli Friedman const llvm::Type *VarTy = getTypes().ConvertTypeForMem(ASTTy); 49277ba708819285931932ecd33691a672bb59d221aEli Friedman 4938f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner if (D->getInit() == 0) { 494cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // This is a tentative definition; tentative definitions are 495cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // implicitly initialized with { 0 } 496cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman const llvm::Type* InitTy; 497cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman if (ASTTy->isIncompleteArrayType()) { 498cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // An incomplete array is normally [ TYPE x 0 ], but we need 499cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // to fix it to [ TYPE x 1 ]. 500cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman const llvm::ArrayType* ATy = cast<llvm::ArrayType>(VarTy); 501cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman InitTy = llvm::ArrayType::get(ATy->getElementType(), 1); 502cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman } else { 503cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman InitTy = VarTy; 504cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman } 505cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman Init = llvm::Constant::getNullValue(InitTy); 50677ba708819285931932ecd33691a672bb59d221aEli Friedman } else { 507bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar Init = EmitConstantExpr(D->getInit()); 5088f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner } 50977ba708819285931932ecd33691a672bb59d221aEli Friedman const llvm::Type* InitType = Init->getType(); 5108e53e720b3d7c962e91138a130dbd5d6c2def0e5Devang Patel 51190db88249ac92e6ed515065048a4ead4467e6639Daniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getIdentifier()]; 5123c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalVariable *GV = cast_or_null<llvm::GlobalVariable>(Entry); 5133c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 51477ba708819285931932ecd33691a672bb59d221aEli Friedman if (!GV) { 51577ba708819285931932ecd33691a672bb59d221aEli Friedman GV = new llvm::GlobalVariable(InitType, false, 51677ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::GlobalValue::ExternalLinkage, 51777ba708819285931932ecd33691a672bb59d221aEli Friedman 0, D->getName(), &getModule(), 0, 51877ba708819285931932ecd33691a672bb59d221aEli Friedman ASTTy.getAddressSpace()); 5193c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar } else if (GV->getType() != 5203c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::PointerType::get(InitType, ASTTy.getAddressSpace())) { 52177ba708819285931932ecd33691a672bb59d221aEli Friedman // We have a definition after a prototype with the wrong type. 52277ba708819285931932ecd33691a672bb59d221aEli Friedman // We must make a new GlobalVariable* and update everything that used OldGV 52377ba708819285931932ecd33691a672bb59d221aEli Friedman // (a declaration or tentative definition) with the new GlobalVariable* 52477ba708819285931932ecd33691a672bb59d221aEli Friedman // (which will be a definition). 52577ba708819285931932ecd33691a672bb59d221aEli Friedman // 52677ba708819285931932ecd33691a672bb59d221aEli Friedman // This happens if there is a prototype for a global (e.g. "extern int x[];") 52777ba708819285931932ecd33691a672bb59d221aEli Friedman // and then a definition of a different type (e.g. "int x[10];"). This also 52877ba708819285931932ecd33691a672bb59d221aEli Friedman // happens when an initializer has a different type from the type of the 52977ba708819285931932ecd33691a672bb59d221aEli Friedman // global (this happens with unions). 530cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // 531cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // FIXME: This also ends up happening if there's a definition followed by 532cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // a tentative definition! (Although Sema rejects that construct 533cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // at the moment.) 53477ba708819285931932ecd33691a672bb59d221aEli Friedman 53577ba708819285931932ecd33691a672bb59d221aEli Friedman // Save the old global 53677ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::GlobalVariable *OldGV = GV; 53777ba708819285931932ecd33691a672bb59d221aEli Friedman 53877ba708819285931932ecd33691a672bb59d221aEli Friedman // Make a new global with the correct type 53977ba708819285931932ecd33691a672bb59d221aEli Friedman GV = new llvm::GlobalVariable(InitType, false, 54077ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::GlobalValue::ExternalLinkage, 54177ba708819285931932ecd33691a672bb59d221aEli Friedman 0, D->getName(), &getModule(), 0, 54277ba708819285931932ecd33691a672bb59d221aEli Friedman ASTTy.getAddressSpace()); 54377ba708819285931932ecd33691a672bb59d221aEli Friedman // Steal the name of the old global 54477ba708819285931932ecd33691a672bb59d221aEli Friedman GV->takeName(OldGV); 54577ba708819285931932ecd33691a672bb59d221aEli Friedman 54677ba708819285931932ecd33691a672bb59d221aEli Friedman // Replace all uses of the old global with the new global 54777ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::Constant *NewPtrForOldDecl = 54877ba708819285931932ecd33691a672bb59d221aEli Friedman llvm::ConstantExpr::getBitCast(GV, OldGV->getType()); 54977ba708819285931932ecd33691a672bb59d221aEli Friedman OldGV->replaceAllUsesWith(NewPtrForOldDecl); 55077ba708819285931932ecd33691a672bb59d221aEli Friedman 55177ba708819285931932ecd33691a672bb59d221aEli Friedman // Erase the old global, since it is no longer used. 55277ba708819285931932ecd33691a672bb59d221aEli Friedman OldGV->eraseFromParent(); 55377ba708819285931932ecd33691a672bb59d221aEli Friedman } 55477ba708819285931932ecd33691a672bb59d221aEli Friedman 5553c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry = GV; 5569e32d4b4a7270a9701b7cb454381eeaa4cc42a77Devang Patel 5578bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman if (const AnnotateAttr *AA = D->getAttr<AnnotateAttr>()) { 5588bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman SourceManager &SM = Context.getSourceManager(); 5598bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman AddAnnotation(EmitAnnotateAttr(GV, AA, 5608bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman SM.getLogicalLineNumber(D->getLocation()))); 5618bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman } 5628bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman 56388a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner GV->setInitializer(Init); 564b381aac9bae6d608c72267dd0ed08ec6369e94e4Nuno Lopes GV->setConstant(D->getType().isConstant(Context)); 565ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 566cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman // FIXME: This is silly; getTypeAlign should just work for incomplete arrays 567cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman unsigned Align; 568c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const IncompleteArrayType* IAT = 569c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner Context.getAsIncompleteArrayType(D->getType())) 570cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman Align = Context.getTypeAlign(IAT->getElementType()); 571cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman else 572cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman Align = Context.getTypeAlign(D->getType()); 57308d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman if (const AlignedAttr* AA = D->getAttr<AlignedAttr>()) { 57408d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman Align = std::max(Align, AA->getAlignment()); 57508d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman } 57608d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman GV->setAlignment(Align / 8); 57708d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman 578ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner if (const VisibilityAttr *attr = D->getAttr<VisibilityAttr>()) 57941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar setGlobalVisibility(GV, attr->getVisibility()); 580ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // FIXME: else handle -fvisibility 581a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar 582a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar if (const AsmLabelAttr *ALA = D->getAttr<AsmLabelAttr>()) { 583a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // Prefaced with special LLVM marker to indicate that the name 584a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar // should not be munged. 585a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar GV->setName("\01" + ALA->getLabel()); 586a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar } 58788a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner 58888a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner // Set the llvm linkage type as appropriate. 5898fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner if (D->getStorageClass() == VarDecl::Static) 5908fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner GV->setLinkage(llvm::Function::InternalLinkage); 5918fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner else if (D->getAttr<DLLImportAttr>()) 592ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner GV->setLinkage(llvm::Function::DLLImportLinkage); 593ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner else if (D->getAttr<DLLExportAttr>()) 594ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner GV->setLinkage(llvm::Function::DLLExportLinkage); 5958fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner else if (D->getAttr<WeakAttr>()) 596ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner GV->setLinkage(llvm::GlobalVariable::WeakLinkage); 5978fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner else { 598ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // FIXME: This isn't right. This should handle common linkage and other 599ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // stuff. 600ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner switch (D->getStorageClass()) { 6018fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner case VarDecl::Static: assert(0 && "This case handled above"); 602ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::Auto: 603ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::Register: 604ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner assert(0 && "Can't have auto or register globals"); 605ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::None: 606ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner if (!D->getInit()) 607a07b76419a03f126c22949dce2e546ba4df0e415Eli Friedman GV->setLinkage(llvm::GlobalVariable::CommonLinkage); 608ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner break; 609ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::Extern: 610ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner case VarDecl::PrivateExtern: 611ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // todo: common 612ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner break; 613ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner } 61488a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner } 615686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta 616686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta // Emit global variable debug information. 617686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta CGDebugInfo *DI = getDebugInfo(); 618686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta if(DI) { 61966031a5594bc9a7dc0dc5137c3e7955f835e4639Daniel Dunbar DI->setLocation(D->getLocation()); 620686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta DI->EmitGlobalVariable(GV, D); 621686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta } 62288a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner} 6235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 624bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarllvm::GlobalValue * 625bd012ff1fa088181646a784f385b28867372d434Daniel DunbarCodeGenModule::EmitForwardFunctionDefinition(const FunctionDecl *D) { 626219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar const llvm::Type *Ty = getTypes().ConvertType(D->getType()); 627219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::Function *F = llvm::Function::Create(cast<llvm::FunctionType>(Ty), 628219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::Function::ExternalLinkage, 629219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar D->getName(), &getModule()); 630219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar SetFunctionAttributes(D, F); 631219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar return F; 632bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 633bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 634bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarllvm::Constant *CodeGenModule::GetAddrOfFunction(const FunctionDecl *D) { 6359986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar QualType ASTTy = D->getType(); 6369986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar const llvm::Type *Ty = getTypes().ConvertTypeForMem(ASTTy); 6379986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar const llvm::Type *PTy = llvm::PointerType::get(Ty, ASTTy.getAddressSpace()); 6383c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 6393c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar // Lookup the entry, lazily creating it if necessary. 64090db88249ac92e6ed515065048a4ead4467e6639Daniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getIdentifier()]; 6413c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (!Entry) 6423c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry = EmitForwardFunctionDefinition(D); 643bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 6449986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar return llvm::ConstantExpr::getBitCast(Entry, PTy); 645bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 646bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 647bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalFunctionDefinition(const FunctionDecl *D) { 64890db88249ac92e6ed515065048a4ead4467e6639Daniel Dunbar llvm::GlobalValue *&Entry = GlobalDeclMap[D->getIdentifier()]; 6493c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (!Entry) { 650bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar Entry = EmitForwardFunctionDefinition(D); 651bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } else { 6523c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar // If the types mismatch then we have to rewrite the definition. 6533c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar const llvm::Type *Ty = getTypes().ConvertType(D->getType()); 6543c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar if (Entry->getType() != llvm::PointerType::getUnqual(Ty)) { 655bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Otherwise, we have a definition after a prototype with the wrong type. 656bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // F is the Function* for the one with the wrong type, we must make a new 657bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Function* and update everything that used F (a declaration) with the new 658bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Function* (which will be a definition). 659bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // 660bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // This happens if there is a prototype for a function (e.g. "int f()") and 661bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // then a definition of a different type (e.g. "int f(int x)"). Start by 662bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // making a new function of the correct type, RAUW, then steal the name. 6633c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::GlobalValue *NewFn = EmitForwardFunctionDefinition(D); 6643c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar NewFn->takeName(Entry); 665bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 666bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Replace uses of F with the Function we will endow with a body. 667bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Constant *NewPtrForOldDecl = 6683c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar llvm::ConstantExpr::getBitCast(NewFn, Entry->getType()); 6693c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar Entry->replaceAllUsesWith(NewPtrForOldDecl); 6703c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar 671bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar // Ok, delete the old function now, which is dead. 6723c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar assert(Entry->isDeclaration() && "Shouldn't replace non-declaration"); 673219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar Entry->eraseFromParent(); 674bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 675bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar Entry = NewFn; 676bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 677bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 678bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 679219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar llvm::Function *Fn = cast<llvm::Function>(Entry); 680219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar CodeGenFunction(*this).GenerateCode(D, Fn); 6816379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar 682219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar SetFunctionAttributesForDefinition(D, Fn); 683219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar 684219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar if (const ConstructorAttr *CA = D->getAttr<ConstructorAttr>()) { 685219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar AddGlobalCtor(Fn, CA->getPriority()); 686219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar } else if (const DestructorAttr *DA = D->getAttr<DestructorAttr>()) { 687219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar AddGlobalDtor(Fn, DA->getPriority()); 688bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar } 689bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar} 690bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar 691f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbarllvm::Function * 692f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel DunbarCodeGenModule::CreateRuntimeFunction(const llvm::FunctionType *FTy, 693f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar const std::string &Name) { 694f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar llvm::Function *Fn = llvm::Function::Create(FTy, 695f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar llvm::Function::ExternalLinkage, 696f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar "", &TheModule); 697f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar RuntimeFunctions.push_back(std::make_pair(Fn, Name)); 698f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar return Fn; 699f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar} 700f1968f28869f4e0675450ae39c478a37c5b9abd6Daniel Dunbar 701c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattnervoid CodeGenModule::UpdateCompletedType(const TagDecl *TD) { 702c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattner // Make sure that this type is translated. 703c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattner Types.UpdateCompletedType(TD); 704d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner} 705d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner 706d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner 707bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner/// getBuiltinLibFunction 708bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattnerllvm::Function *CodeGenModule::getBuiltinLibFunction(unsigned BuiltinID) { 7091426fecdf90dd1986751b9940422e675880ff671Chris Lattner if (BuiltinID > BuiltinFunctions.size()) 7101426fecdf90dd1986751b9940422e675880ff671Chris Lattner BuiltinFunctions.resize(BuiltinID); 711bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 7121426fecdf90dd1986751b9940422e675880ff671Chris Lattner // Cache looked up functions. Since builtin id #0 is invalid we don't reserve 7131426fecdf90dd1986751b9940422e675880ff671Chris Lattner // a slot for it. 7141426fecdf90dd1986751b9940422e675880ff671Chris Lattner assert(BuiltinID && "Invalid Builtin ID"); 7151426fecdf90dd1986751b9940422e675880ff671Chris Lattner llvm::Function *&FunctionSlot = BuiltinFunctions[BuiltinID-1]; 716bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner if (FunctionSlot) 717bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner return FunctionSlot; 718bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 719bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner assert(Context.BuiltinInfo.isLibFunction(BuiltinID) && "isn't a lib fn"); 720bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 721bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // Get the name, skip over the __builtin_ prefix. 722bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner const char *Name = Context.BuiltinInfo.GetName(BuiltinID)+10; 723bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 724bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // Get the type for the builtin. 725bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner QualType Type = Context.BuiltinInfo.GetBuiltinType(BuiltinID, Context); 726bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner const llvm::FunctionType *Ty = 727bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner cast<llvm::FunctionType>(getTypes().ConvertType(Type)); 728bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 729bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // FIXME: This has a serious problem with code like this: 730bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // void abs() {} 731bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // ... __builtin_abs(x); 732bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // The two versions of abs will collide. The fix is for the builtin to win, 733bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // and for the existing one to be turned into a constantexpr cast of the 734bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // builtin. In the case where the existing one is a static function, it 735bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // should just be renamed. 736c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner if (llvm::Function *Existing = getModule().getFunction(Name)) { 737c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner if (Existing->getFunctionType() == Ty && Existing->hasExternalLinkage()) 738c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner return FunctionSlot = Existing; 739c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner assert(Existing == 0 && "FIXME: Name collision"); 740c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner } 741bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 742bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner // FIXME: param attributes for sext/zext etc. 7434c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman return FunctionSlot = 7444c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman llvm::Function::Create(Ty, llvm::Function::ExternalLinkage, Name, 7454c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman &getModule()); 746bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner} 747bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 7487acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattnerllvm::Function *CodeGenModule::getIntrinsic(unsigned IID,const llvm::Type **Tys, 7497acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner unsigned NumTys) { 7507acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner return llvm::Intrinsic::getDeclaration(&getModule(), 7517acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner (llvm::Intrinsic::ID)IID, Tys, NumTys); 7527acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner} 753bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner 7545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerllvm::Function *CodeGenModule::getMemCpyFn() { 7555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (MemCpyFn) return MemCpyFn; 7565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::Intrinsic::ID IID; 757f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner switch (Context.Target.getPointerWidth(0)) { 7585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer default: assert(0 && "Unknown ptr width"); 7595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case 32: IID = llvm::Intrinsic::memcpy_i32; break; 7605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case 64: IID = llvm::Intrinsic::memcpy_i64; break; 7615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 7627acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner return MemCpyFn = getIntrinsic(IID); 7635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 764c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 7650c99509927a0c7a48490486b9fec287b63e5c09cEli Friedmanllvm::Function *CodeGenModule::getMemMoveFn() { 7660c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman if (MemMoveFn) return MemMoveFn; 7670c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman llvm::Intrinsic::ID IID; 7680c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman switch (Context.Target.getPointerWidth(0)) { 7690c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman default: assert(0 && "Unknown ptr width"); 7700c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman case 32: IID = llvm::Intrinsic::memmove_i32; break; 7710c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman case 64: IID = llvm::Intrinsic::memmove_i64; break; 7720c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman } 7730c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman return MemMoveFn = getIntrinsic(IID); 7740c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman} 7750c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman 77641ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venanciollvm::Function *CodeGenModule::getMemSetFn() { 77741ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio if (MemSetFn) return MemSetFn; 77841ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio llvm::Intrinsic::ID IID; 779f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner switch (Context.Target.getPointerWidth(0)) { 78041ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio default: assert(0 && "Unknown ptr width"); 78141ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio case 32: IID = llvm::Intrinsic::memset_i32; break; 78241ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio case 64: IID = llvm::Intrinsic::memset_i64; break; 78341ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio } 78441ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio return MemSetFn = getIntrinsic(IID); 78541ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio} 7867acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner 7873e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar// We still need to work out the details of handling UTF-16. 7883e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar// See: <rdr://2996215> 789bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattnerllvm::Constant *CodeGenModule:: 790bef20ac367a09555b30d6eb3847a81ec164caf88Chris LattnerGetAddrOfConstantCFString(const std::string &str) { 791c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::StringMapEntry<llvm::Constant *> &Entry = 792c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson CFConstantStringMap.GetOrCreateValue(&str[0], &str[str.length()]); 793c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 794c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson if (Entry.getValue()) 795c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson return Entry.getValue(); 796c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 7973e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar llvm::Constant *Zero = llvm::Constant::getNullValue(llvm::Type::Int32Ty); 7983e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar llvm::Constant *Zeros[] = { Zero, Zero }; 799c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 800c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson if (!CFConstantStringClassRef) { 801c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson const llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy); 802c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Ty = llvm::ArrayType::get(Ty, 0); 8033e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar 8043e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar // FIXME: This is fairly broken if 8053e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar // __CFConstantStringClassReference is already defined, in that it 8063e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar // will get renamed and the user will most likely see an opaque 8073e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar // error message. This is a general issue with relying on 8083e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar // particular names. 8093e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar llvm::GlobalVariable *GV = 810c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson new llvm::GlobalVariable(Ty, false, 811c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::GlobalVariable::ExternalLinkage, 0, 812c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson "__CFConstantStringClassReference", 813c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson &getModule()); 8143e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar 8153e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar // Decay array -> ptr 8163e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar CFConstantStringClassRef = 8173e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar llvm::ConstantExpr::getGetElementPtr(GV, Zeros, 2); 818c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson } 819c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 8203e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar std::vector<llvm::Constant*> Fields(4); 8213e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar 822c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // Class pointer. 8233e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar Fields[0] = CFConstantStringClassRef; 824c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 825c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // Flags. 8263e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar const llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy); 8273e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar Fields[1] = llvm::ConstantInt::get(Ty, 0x07C8); 828c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 829c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // String pointer. 8303e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar llvm::Constant *C = llvm::ConstantArray::get(str); 831c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson C = new llvm::GlobalVariable(C->getType(), true, 832c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson llvm::GlobalValue::InternalLinkage, 8333e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar C, ".str", &getModule()); 8343e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar Fields[2] = llvm::ConstantExpr::getGetElementPtr(C, Zeros, 2); 835c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 836c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // String length. 837c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Ty = getTypes().ConvertType(getContext().LongTy); 8383e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar Fields[3] = llvm::ConstantInt::get(Ty, str.length()); 839c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson 840c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson // The struct. 841c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson Ty = getTypes().ConvertType(getContext().getCFConstantStringType()); 842c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson C = llvm::ConstantStruct::get(cast<llvm::StructType>(Ty), Fields); 8430c67829763b98bc670062b553897a851fab17401Anders Carlsson llvm::GlobalVariable *GV = 8440c67829763b98bc670062b553897a851fab17401Anders Carlsson new llvm::GlobalVariable(C->getType(), true, 8450c67829763b98bc670062b553897a851fab17401Anders Carlsson llvm::GlobalVariable::InternalLinkage, 8460c67829763b98bc670062b553897a851fab17401Anders Carlsson C, "", &getModule()); 8473e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar 8480c67829763b98bc670062b553897a851fab17401Anders Carlsson GV->setSection("__DATA,__cfstring"); 8490c67829763b98bc670062b553897a851fab17401Anders Carlsson Entry.setValue(GV); 8503e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar 8510c67829763b98bc670062b553897a851fab17401Anders Carlsson return GV; 852c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson} 85345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 8546143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// GetStringForStringLiteral - Return the appropriate bytes for a 8551e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar/// string literal, properly padded to match the literal type. 8566143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbarstd::string CodeGenModule::GetStringForStringLiteral(const StringLiteral *E) { 857662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar if (E->isWide()) { 858662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar ErrorUnsupported(E, "wide string"); 859662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar return "FIXME"; 860662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar } 861662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar 8621e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar const char *StrData = E->getStrData(); 8631e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar unsigned Len = E->getByteLength(); 8641e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 8651e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar const ConstantArrayType *CAT = 8661e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar getContext().getAsConstantArrayType(E->getType()); 8671e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar assert(CAT && "String isn't pointer or array!"); 8681e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 8691e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar // Resize the string to the right size 8701e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar // FIXME: What about wchar_t strings? 8711e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar std::string Str(StrData, StrData+Len); 8721e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar uint64_t RealLen = CAT->getSize().getZExtValue(); 8731e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar Str.resize(RealLen, '\0'); 8741e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 8751e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar return Str; 8761e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar} 8771e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar 8786143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// GetAddrOfConstantStringFromLiteral - Return a pointer to a 8796143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// constant array for the given string literal. 8806143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbarllvm::Constant * 8816143293fa4366ee95d7e47e61bd030a34bf68b55Daniel DunbarCodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S) { 8826143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar // FIXME: This can be more efficient. 8836143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar return GetAddrOfConstantString(GetStringForStringLiteral(S)); 8846143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar} 8856143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar 886a7ad98ff0919d6a24ea7c46634ea29bea551c1a0Chris Lattner/// GenerateWritableString -- Creates storage for a string literal. 88745e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattnerstatic llvm::Constant *GenerateStringLiteral(const std::string &str, 88845e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner bool constant, 8895fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbar CodeGenModule &CGM, 8905fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbar const char *GlobalName) { 8916143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar // Create Constant for this string literal. Don't add a '\0'. 8926143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar llvm::Constant *C = llvm::ConstantArray::get(str, false); 89345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 89445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner // Create a global variable for this string 89545e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner C = new llvm::GlobalVariable(C->getType(), constant, 89645e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner llvm::GlobalValue::InternalLinkage, 8975fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbar C, 8985fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbar GlobalName ? GlobalName : ".str", 8995fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbar &CGM.getModule()); 9006143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar 90145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner return C; 90245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner} 90345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 9046143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// GetAddrOfConstantString - Returns a pointer to a character array 9056143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// containing the literal. This contents are exactly that of the 9066143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// given string, i.e. it will not be null terminated automatically; 9076143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// see GetAddrOfConstantCString. Note that whether the result is 9086143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// actually a pointer to an LLVM constant depends on 9096143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// Feature.WriteableStrings. 9106143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// 9116143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// The result has pointer to array type. 9125fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbarllvm::Constant *CodeGenModule::GetAddrOfConstantString(const std::string &str, 9135fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbar const char *GlobalName) { 91445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner // Don't share any string literals if writable-strings is turned on. 91545e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner if (Features.WritableStrings) 9165fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbar return GenerateStringLiteral(str, false, *this, GlobalName); 91745e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 91845e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner llvm::StringMapEntry<llvm::Constant *> &Entry = 91945e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner ConstantStringMap.GetOrCreateValue(&str[0], &str[str.length()]); 92045e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 92145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner if (Entry.getValue()) 92245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner return Entry.getValue(); 92345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner 92445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner // Create a global variable for this. 9255fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbar llvm::Constant *C = GenerateStringLiteral(str, true, *this, GlobalName); 92645e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner Entry.setValue(C); 92745e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner return C; 92845e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner} 9296143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar 9306143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// GetAddrOfConstantCString - Returns a pointer to a character 9316143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// array containing the literal and a terminating '\-' 9326143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// character. The result has pointer to array type. 9335fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbarllvm::Constant *CodeGenModule::GetAddrOfConstantCString(const std::string &str, 9345fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbar const char *GlobalName){ 9355fabf9dbee29464bcd06cd09f8e569d1b850f948Daniel Dunbar return GetAddrOfConstantString(str + "\0", GlobalName); 9366143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar} 93741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 938af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar/// EmitObjCPropertyImplementations - Emit information for synthesized 939af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar/// properties for an implementation. 940af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbarvoid CodeGenModule::EmitObjCPropertyImplementations(const 941af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar ObjCImplementationDecl *D) { 942af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar for (ObjCImplementationDecl::propimpl_iterator i = D->propimpl_begin(), 943af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar e = D->propimpl_end(); i != e; ++i) { 944af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar ObjCPropertyImplDecl *PID = *i; 945af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar 946af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar // Dynamic is just for type-checking. 947af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) { 948af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar ObjCPropertyDecl *PD = PID->getPropertyDecl(); 949af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar 950af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar // Determine which methods need to be implemented, some may have 951af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar // been overridden. Note that ::isSynthesized is not the method 952af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar // we want, that just indicates if the decl came from a 953af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar // property. What we want to know is if the method is defined in 954af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar // this implementation. 955af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar if (!D->getInstanceMethod(PD->getGetterName())) 956af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar CodeGenFunction(*this).GenerateObjCGetter(PID); 957af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar if (!PD->isReadOnly() && 958af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar !D->getInstanceMethod(PD->getSetterName())) 959af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar CodeGenFunction(*this).GenerateObjCSetter(PID); 960af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar } 961af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar } 962af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar} 963af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar 96441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar/// EmitTopLevelDecl - Emit code for a single top level declaration. 96541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbarvoid CodeGenModule::EmitTopLevelDecl(Decl *D) { 96641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // If an error has occurred, stop code generation, but continue 96741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // parsing and semantic analysis (to ensure all warnings and errors 96841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // are emitted). 96941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar if (Diags.hasErrorOccurred()) 97041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar return; 97141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 97241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar switch (D->getKind()) { 97341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::Function: 97441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::Var: 97541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar EmitGlobal(cast<ValueDecl>(D)); 97641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 97741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 97841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::Namespace: 979662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar ErrorUnsupported(D, "namespace"); 98041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 98141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 98241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // Objective-C Decls 98341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 98441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // Forward declarations, no (immediate) code generation. 98541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::ObjCClass: 98641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::ObjCCategory: 98741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::ObjCForwardProtocol: 98841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::ObjCInterface: 98941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 99041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 99141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::ObjCProtocol: 99241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar Runtime->GenerateProtocol(cast<ObjCProtocolDecl>(D)); 99341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 99441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 99541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::ObjCCategoryImpl: 996af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar // Categories have properties but don't support synthesize so we 997af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar // can ignore them here. 998af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar 99941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar Runtime->GenerateCategory(cast<ObjCCategoryImplDecl>(D)); 100041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 100141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 1002af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar case Decl::ObjCImplementation: { 1003af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar ObjCImplementationDecl *OMD = cast<ObjCImplementationDecl>(D); 1004af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar EmitObjCPropertyImplementations(OMD); 1005af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar Runtime->GenerateClass(OMD); 100641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 1007af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar } 100841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::ObjCMethod: { 100941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(D); 101041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // If this is not a prototype, emit the body. 101141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar if (OMD->getBody()) 101241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar CodeGenFunction(*this).GenerateObjCMethod(OMD); 101341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 101441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar } 101541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::ObjCCompatibleAlias: 1016662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar ErrorUnsupported(D, "Objective-C compatible alias"); 101741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 101841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 101941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::LinkageSpec: { 102041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar LinkageSpecDecl *LSD = cast<LinkageSpecDecl>(D); 102141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar if (LSD->getLanguage() == LinkageSpecDecl::lang_cxx) 1022488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar ErrorUnsupported(LSD, "linkage spec"); 102341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // FIXME: implement C++ linkage, C linkage works mostly by C 102441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // language reuse already. 102541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 102641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar } 102741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 102841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar case Decl::FileScopeAsm: { 102941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar FileScopeAsmDecl *AD = cast<FileScopeAsmDecl>(D); 103041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar std::string AsmString(AD->getAsmString()->getStrData(), 103141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar AD->getAsmString()->getByteLength()); 103241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 103341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar const std::string &S = getModule().getModuleInlineAsm(); 103441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar if (S.empty()) 103541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar getModule().setModuleInlineAsm(AsmString); 103641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar else 103741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar getModule().setModuleInlineAsm(S + '\n' + AsmString); 103841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar break; 103941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar } 104041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 104141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar default: 104241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // Make sure we handled everything we should, every other kind is 104341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // a non-top-level decl. FIXME: Would be nice to have an 104441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // isTopLevelDeclKind function. Need to recode Decl::Kind to do 104541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar // that easily. 104641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar assert(isa<TypeDecl>(D) && "Unsupported decl kind"); 104741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar } 104841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar} 104941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 1050