CodeGenModule.cpp revision 761d7f78e2dac7ea5f35828c2271e60d91e106ce
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"
212c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner#include "clang/Basic/Diagnostic.h"
228bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman#include "clang/Basic/SourceManager.h"
235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h"
24ec9426ca6039279bcc99bc2c625bb2abe4f0353dNate Begeman#include "llvm/CallingConv.h"
25bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner#include "llvm/Module.h"
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/Intrinsics.h"
2720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov#include "llvm/Target/TargetData.h"
28a1945fa74d04098d7e22d7c31585342555eca928Chris Lattner#include "llvm/Analysis/Verifier.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();
66a1945fa74d04098d7e22d7c31585342555eca928Chris Lattner  // Run the verifier to check that the generated code is consistent.
67219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  if (verifyModule(TheModule, llvm::PrintMessageAction)) {
68219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    TheModule.dump();
69219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    assert(0 && "Module failed verification!");
70219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  }
712b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris Lattner}
725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
73488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar/// ErrorUnsupported - Print out an error that codegen doesn't support the
742c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner/// specified stmt yet.
7590df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbarvoid CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type,
7690df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar                                     bool OmitOnError) {
7790df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar  if (OmitOnError && getDiags().hasErrorOccurred())
7890df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar    return;
79488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar  unsigned DiagID = getDiags().getCustomDiagID(Diagnostic::Error,
802c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner                                               "cannot codegen this %0 yet");
812c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner  SourceRange Range = S->getSourceRange();
822c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner  std::string Msg = Type;
839c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek  getDiags().Report(Context.getFullLoc(S->getLocStart()), DiagID,
847a9d49fd2bfac00e905b361ba76d26ab5b6c3b09Ted Kremenek                    &Msg, 1, &Range, 1);
852c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner}
8658c3f9ec11cbe852a518bf2f83af46f938b7b852Chris Lattner
87488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar/// ErrorUnsupported - Print out an error that codegen doesn't support the
88c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner/// specified decl yet.
8990df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbarvoid CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type,
9090df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar                                     bool OmitOnError) {
9190df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar  if (OmitOnError && getDiags().hasErrorOccurred())
9290df4b6661968a84bf64baee489bb2f6d948fcc1Daniel Dunbar    return;
93488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar  unsigned DiagID = getDiags().getCustomDiagID(Diagnostic::Error,
94c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner                                               "cannot codegen this %0 yet");
95c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner  std::string Msg = Type;
96c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner  getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID,
97c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner                    &Msg, 1);
98c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner}
99c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner
10041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar/// setGlobalVisibility - Set the visibility for the given LLVM
10141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar/// GlobalValue according to the given clang AST visibility value.
10241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbarstatic void setGlobalVisibility(llvm::GlobalValue *GV,
10341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar                                VisibilityAttr::VisibilityTypes Vis) {
1044f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  switch (Vis) {
1054f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  default: assert(0 && "Unknown visibility!");
1064f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  case VisibilityAttr::DefaultVisibility:
1074f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
1084f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    break;
1094f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  case VisibilityAttr::HiddenVisibility:
1104f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
1114f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    break;
1124f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  case VisibilityAttr::ProtectedVisibility:
1134f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
1144f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    break;
1154f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  }
1164f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman}
1174f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman
1186d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner/// AddGlobalCtor - Add a function to the list that will be called before
1196d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner/// main() runs.
1206bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::AddGlobalCtor(llvm::Function * Ctor, int Priority) {
1216d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner  // TODO: Type coercion of void()* types.
1226bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  GlobalCtors.push_back(std::make_pair(Ctor, Priority));
1236d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner}
1246d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner
1256bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar/// AddGlobalDtor - Add a function to the list that will be called
1266bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar/// when the module is unloaded.
1276bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::AddGlobalDtor(llvm::Function * Dtor, int Priority) {
1286bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  // TODO: Type coercion of void()* types.
1296bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  GlobalDtors.push_back(std::make_pair(Dtor, Priority));
1306bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar}
1316bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar
1326bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) {
1336bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  // Ctor function type is void()*.
1346bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  llvm::FunctionType* CtorFTy =
1356bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar    llvm::FunctionType::get(llvm::Type::VoidTy,
1366bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar                            std::vector<const llvm::Type*>(),
1376bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar                            false);
1386bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy);
1396bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar
1406bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  // Get the type of a ctor entry, { i32, void ()* }.
141572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner  llvm::StructType* CtorStructTy =
1426bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar    llvm::StructType::get(llvm::Type::Int32Ty,
1436bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar                          llvm::PointerType::getUnqual(CtorFTy), NULL);
1446bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar
1456bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  // Construct the constructor and destructor arrays.
1466bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  std::vector<llvm::Constant*> Ctors;
1476bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  for (CtorList::const_iterator I = Fns.begin(), E = Fns.end(); I != E; ++I) {
1486bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar    std::vector<llvm::Constant*> S;
1496bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar    S.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty, I->second, false));
1506bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar    S.push_back(llvm::ConstantExpr::getBitCast(I->first, CtorPFTy));
1516bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar    Ctors.push_back(llvm::ConstantStruct::get(CtorStructTy, S));
1526bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  }
1536bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar
1546bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  if (!Ctors.empty()) {
1556bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar    llvm::ArrayType *AT = llvm::ArrayType::get(CtorStructTy, Ctors.size());
1566bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar    new llvm::GlobalVariable(AT, false,
157572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner                             llvm::GlobalValue::AppendingLinkage,
1586bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar                             llvm::ConstantArray::get(AT, Ctors),
1596bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar                             GlobalName,
160572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner                             &TheModule);
1616d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner  }
1626d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner}
1636d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner
164532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begemanvoid CodeGenModule::EmitAnnotations() {
165532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman  if (Annotations.empty())
166532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman    return;
167532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman
168532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman  // Create a new global variable for the ConstantStruct in the Module.
169532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman  llvm::Constant *Array =
170532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman  llvm::ConstantArray::get(llvm::ArrayType::get(Annotations[0]->getType(),
171532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman                                                Annotations.size()),
172532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman                           Annotations);
173532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman  llvm::GlobalValue *gv =
174532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman  new llvm::GlobalVariable(Array->getType(), false,
175532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman                           llvm::GlobalValue::AppendingLinkage, Array,
176532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman                           "llvm.global.annotations", &TheModule);
177532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman  gv->setSection("llvm.metadata");
178532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman}
179532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman
1800dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarstatic void SetGlobalValueAttributes(const Decl *D,
1810dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar                                     bool IsInternal,
1820dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar                                     bool IsInline,
183219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar                                     llvm::GlobalValue *GV,
184219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar                                     bool ForDefinition) {
185d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  // TODO: Set up linkage and many other things.  Note, this is a simple
186d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  // approximation of what we really want.
187219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  if (!ForDefinition) {
188219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    // Only a few attributes are set on declarations.
1890dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar    if (D->getAttr<DLLImportAttr>())
1900dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar      GV->setLinkage(llvm::Function::DLLImportLinkage);
191219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  } else {
192219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    if (IsInternal) {
193219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      GV->setLinkage(llvm::Function::InternalLinkage);
194219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    } else {
195219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      if (D->getAttr<DLLImportAttr>())
196219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar        GV->setLinkage(llvm::Function::DLLImportLinkage);
197219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      else if (D->getAttr<DLLExportAttr>())
198219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar        GV->setLinkage(llvm::Function::DLLExportLinkage);
199219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      else if (D->getAttr<WeakAttr>() || IsInline)
200219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar        GV->setLinkage(llvm::Function::WeakLinkage);
201219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    }
2020dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  }
203d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
2040dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  if (const VisibilityAttr *attr = D->getAttr<VisibilityAttr>())
20541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    setGlobalVisibility(GV, attr->getVisibility());
206d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  // FIXME: else handle -fvisibility
207a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar
2080dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  if (const AsmLabelAttr *ALA = D->getAttr<AsmLabelAttr>()) {
209a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar    // Prefaced with special LLVM marker to indicate that the name
210a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar    // should not be munged.
211a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar    GV->setName("\01" + ALA->getLabel());
212a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar  }
213d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes}
214d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
215761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patelvoid CodeGenModule::SetFunctionAttributes(const Decl *D,
21645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar                                          const CGFunctionInfo &Info,
217b768807c49a1c7085def099b848631856af766faDaniel Dunbar                                          llvm::Function *F) {
218761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel  AttributeListType AttributeList;
219761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel  ConstructAttributeList(D, Info.argtypes_begin(), Info.argtypes_end(),
220761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel                         AttributeList);
221c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman
222761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel  F->setAttributes(llvm::AttrListPtr::get(AttributeList.begin(),
223761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel                                        AttributeList.size()));
224ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman
225ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman  // Set the appropriate calling convention for the Function.
22645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar  if (D->getAttr<FastCallAttr>())
227ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman    F->setCallingConv(llvm::CallingConv::Fast);
228f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar}
229f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar
230f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar/// SetFunctionAttributesForDefinition - Set function attributes
231f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar/// specific to a function definition.
232219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbarvoid CodeGenModule::SetFunctionAttributesForDefinition(const Decl *D,
233219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar                                                       llvm::Function *F) {
234219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  if (isa<ObjCMethodDecl>(D)) {
235219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    SetGlobalValueAttributes(D, true, false, F, true);
236219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  } else {
237219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    const FunctionDecl *FD = cast<FunctionDecl>(D);
238219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    SetGlobalValueAttributes(FD, FD->getStorageClass() == FunctionDecl::Static,
239219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar                             FD->isInline(), F, true);
240219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  }
241219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar
242f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar  if (!Features.Exceptions)
243761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel    F->addAttribute(0, llvm::Attribute::NoUnwind);
244f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar}
245f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar
246f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbarvoid CodeGenModule::SetMethodAttributes(const ObjCMethodDecl *MD,
247f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar                                        llvm::Function *F) {
248761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel  SetFunctionAttributes(MD, CGFunctionInfo(MD, Context), F);
249f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar
250219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  SetFunctionAttributesForDefinition(MD, F);
251f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar}
252f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar
253f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbarvoid CodeGenModule::SetFunctionAttributes(const FunctionDecl *FD,
254f80519b919a348db004fba18530706314d1ebfb5Daniel Dunbar                                          llvm::Function *F) {
255761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel  SetFunctionAttributes(FD, CGFunctionInfo(FD), F);
25645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
257219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  SetGlobalValueAttributes(FD, FD->getStorageClass() == FunctionDecl::Static,
258219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar                           FD->isInline(), F, false);
259219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar}
260219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar
26145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar
262219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbarvoid CodeGenModule::EmitAliases() {
263219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  for (unsigned i = 0, e = Aliases.size(); i != e; ++i) {
264219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    const FunctionDecl *D = Aliases[i];
265219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    const AliasAttr *AA = D->getAttr<AliasAttr>();
266219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar
267219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    // This is something of a hack, if the FunctionDecl got overridden
268219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    // then its attributes will be moved to the new declaration. In
269219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    // this case the current decl has no alias attribute, but we will
270219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    // eventually see it.
271219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    if (!AA)
272219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      continue;
273219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar
274219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    const std::string& aliaseeName = AA->getAliasee();
275219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    llvm::Function *aliasee = getModule().getFunction(aliaseeName);
276219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    if (!aliasee) {
277219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      // FIXME: This isn't unsupported, this is just an error, which
278219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      // sema should catch, but...
279219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      ErrorUnsupported(D, "alias referencing a missing function");
280219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      continue;
281219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    }
282219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar
283219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    llvm::GlobalValue *GA =
284219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      new llvm::GlobalAlias(aliasee->getType(),
285219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar                            llvm::Function::ExternalLinkage,
286219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar                            D->getName(),
287219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar                            aliasee,
288219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar                            &getModule());
289219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar
290219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    llvm::GlobalValue *&Entry = GlobalDeclMap[D->getIdentifier()];
291219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    if (Entry) {
292219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      // If we created a dummy function for this then replace it.
293219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      GA->takeName(Entry);
294219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar
295219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      llvm::Value *Casted =
296219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar        llvm::ConstantExpr::getBitCast(GA, Entry->getType());
297219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      Entry->replaceAllUsesWith(Casted);
298219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      Entry->eraseFromParent();
299ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman
300219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      Entry = GA;
301219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    }
302219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar
303219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    // Alias should never be internal or inline.
304219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    SetGlobalValueAttributes(D, false, false, GA, true);
305219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  }
306ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman}
307ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman
3084c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begemanvoid CodeGenModule::EmitStatics() {
3094c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman  // Emit code for each used static decl encountered.  Since a previously unused
3104c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman  // static decl may become used during the generation of code for a static
3114c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman  // function, iterate until no changes are made.
3124c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman  bool Changed;
3134c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman  do {
3144c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman    Changed = false;
3154c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman    for (unsigned i = 0, e = StaticDecls.size(); i != e; ++i) {
316bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      const ValueDecl *D = StaticDecls[i];
3176f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman
3186f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman      // Check if we have used a decl with the same name
3196f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman      // FIXME: The AST should have some sort of aggregate decls or
3206f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman      // global symbol map.
321219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      // FIXME: This is missing some important cases. For example, we
322219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      // need to check for uses in an alias and in a constructor.
32390db88249ac92e6ed515065048a4ead4467e6639Daniel Dunbar      if (!GlobalDeclMap.count(D->getIdentifier()))
324a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar        continue;
3256f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman
326bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // Emit the definition.
327bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      EmitGlobalDefinition(D);
328bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
3294c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman      // Erase the used decl from the list.
3304c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman      StaticDecls[i] = StaticDecls.back();
3314c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman      StaticDecls.pop_back();
3324c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman      --i;
3334c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman      --e;
3344c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman
3354c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman      // Remember that we made a change.
3364c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman      Changed = true;
3374c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman    }
3384c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman  } while (Changed);
3395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3418bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// EmitAnnotateAttr - Generate the llvm::ConstantStruct which contains the
3428bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// annotation information for a given GlobalValue.  The annotation struct is
3438bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// {i8 *, i8 *, i8 *, i32}.  The first field is a constant expression, the
3443c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar/// GlobalValue being annotated.  The second field is the constant string
3458bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// created from the AnnotateAttr's annotation.  The third field is a constant
3468bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// string containing the name of the translation unit.  The fourth field is
3478bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// the line number in the file of the annotated value declaration.
3488bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman///
3498bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// FIXME: this does not unique the annotation string constants, as llvm-gcc
3508bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman///        appears to.
3518bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman///
3528bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begemanllvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV,
3538bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman                                                const AnnotateAttr *AA,
3548bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman                                                unsigned LineNo) {
3558bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  llvm::Module *M = &getModule();
3568bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman
3578bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  // get [N x i8] constants for the annotation string, and the filename string
3588bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  // which are the 2nd and 3rd elements of the global annotation structure.
3598bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  const llvm::Type *SBP = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
3608bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  llvm::Constant *anno = llvm::ConstantArray::get(AA->getAnnotation(), true);
3618bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  llvm::Constant *unit = llvm::ConstantArray::get(M->getModuleIdentifier(),
3628bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman                                                  true);
3638bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman
3648bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  // Get the two global values corresponding to the ConstantArrays we just
3658bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  // created to hold the bytes of the strings.
3668bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  llvm::GlobalValue *annoGV =
3678bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  new llvm::GlobalVariable(anno->getType(), false,
3688bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman                           llvm::GlobalValue::InternalLinkage, anno,
3698bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman                           GV->getName() + ".str", M);
3708bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  // translation unit name string, emitted into the llvm.metadata section.
3718bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  llvm::GlobalValue *unitGV =
3728bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  new llvm::GlobalVariable(unit->getType(), false,
3738bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman                           llvm::GlobalValue::InternalLinkage, unit, ".str", M);
3748bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman
3758bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  // Create the ConstantStruct that is the global annotion.
3768bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  llvm::Constant *Fields[4] = {
3778bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman    llvm::ConstantExpr::getBitCast(GV, SBP),
3788bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman    llvm::ConstantExpr::getBitCast(annoGV, SBP),
3798bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman    llvm::ConstantExpr::getBitCast(unitGV, SBP),
3808bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman    llvm::ConstantInt::get(llvm::Type::Int32Ty, LineNo)
3818bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  };
3828bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  return llvm::ConstantStruct::get(Fields, 4, false);
3838bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman}
3848bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman
385bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobal(const ValueDecl *Global) {
386bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  bool isDef, isStatic;
387bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
388bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Global)) {
389219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    // Aliases are deferred until code for everything else has been
390219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    // emitted.
391219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    if (FD->getAttr<AliasAttr>()) {
392219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      assert(!FD->isThisDeclarationADefinition() &&
393219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar             "Function alias cannot have a definition!");
394219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      Aliases.push_back(FD);
395219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      return;
396219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    }
397219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar
398219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    isDef = FD->isThisDeclarationADefinition();
399bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    isStatic = FD->getStorageClass() == FunctionDecl::Static;
400bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  } else if (const VarDecl *VD = cast<VarDecl>(Global)) {
401bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    assert(VD->isFileVarDecl() && "Cannot emit local var decl as global.");
402bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
403bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    isDef = !(VD->getStorageClass() == VarDecl::Extern && VD->getInit() == 0);
404bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    isStatic = VD->getStorageClass() == VarDecl::Static;
405bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  } else {
406bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    assert(0 && "Invalid argument to EmitGlobal");
4074c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman    return;
4084c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman  }
4094c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman
410bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  // Forward declarations are emitted lazily on first use.
411bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  if (!isDef)
41288a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner    return;
413bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
414bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  // If the global is a static, defer code generation until later so
415bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  // we can easily omit unused statics.
416bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  if (isStatic) {
417bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    StaticDecls.push_back(Global);
418bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    return;
419bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  }
420bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
421bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  // Otherwise emit the definition.
422bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  EmitGlobalDefinition(Global);
4234c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman}
4244c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman
425bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalDefinition(const ValueDecl *D) {
426bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
427bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    EmitGlobalFunctionDefinition(FD);
428bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  } else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
429bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    EmitGlobalVarDefinition(VD);
430bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  } else {
431bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    assert(0 && "Invalid argument to EmitGlobalDefinition()");
432bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  }
433bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar}
434bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
4359986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D) {
43677ba708819285931932ecd33691a672bb59d221aEli Friedman  assert(D->hasGlobalStorage() && "Not a global variable");
43777ba708819285931932ecd33691a672bb59d221aEli Friedman
438bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  QualType ASTTy = D->getType();
439bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  const llvm::Type *Ty = getTypes().ConvertTypeForMem(ASTTy);
4409986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar  const llvm::Type *PTy = llvm::PointerType::get(Ty, ASTTy.getAddressSpace());
441bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
4423c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  // Lookup the entry, lazily creating it if necessary.
44390db88249ac92e6ed515065048a4ead4467e6639Daniel Dunbar  llvm::GlobalValue *&Entry = GlobalDeclMap[D->getIdentifier()];
4443c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  if (!Entry)
4453c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar    Entry = new llvm::GlobalVariable(Ty, false,
4463c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar                                     llvm::GlobalValue::ExternalLinkage,
4473c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar                                     0, D->getName(), &getModule(), 0,
4483c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar                                     ASTTy.getAddressSpace());
4493c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar
4509986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar  // Make sure the result is of the correct type.
4519986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar  return llvm::ConstantExpr::getBitCast(Entry, PTy);
452bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar}
453bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
454bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
4558f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner  llvm::Constant *Init = 0;
45677ba708819285931932ecd33691a672bb59d221aEli Friedman  QualType ASTTy = D->getType();
45777ba708819285931932ecd33691a672bb59d221aEli Friedman  const llvm::Type *VarTy = getTypes().ConvertTypeForMem(ASTTy);
45877ba708819285931932ecd33691a672bb59d221aEli Friedman
4598f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner  if (D->getInit() == 0) {
460cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    // This is a tentative definition; tentative definitions are
461cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    // implicitly initialized with { 0 }
462cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    const llvm::Type* InitTy;
463cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    if (ASTTy->isIncompleteArrayType()) {
464cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman      // An incomplete array is normally [ TYPE x 0 ], but we need
465cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman      // to fix it to [ TYPE x 1 ].
466cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman      const llvm::ArrayType* ATy = cast<llvm::ArrayType>(VarTy);
467cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman      InitTy = llvm::ArrayType::get(ATy->getElementType(), 1);
468cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    } else {
469cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman      InitTy = VarTy;
470cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    }
471cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    Init = llvm::Constant::getNullValue(InitTy);
47277ba708819285931932ecd33691a672bb59d221aEli Friedman  } else {
473bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    Init = EmitConstantExpr(D->getInit());
4748f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner  }
47577ba708819285931932ecd33691a672bb59d221aEli Friedman  const llvm::Type* InitType = Init->getType();
4768e53e720b3d7c962e91138a130dbd5d6c2def0e5Devang Patel
47790db88249ac92e6ed515065048a4ead4467e6639Daniel Dunbar  llvm::GlobalValue *&Entry = GlobalDeclMap[D->getIdentifier()];
4783c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  llvm::GlobalVariable *GV = cast_or_null<llvm::GlobalVariable>(Entry);
4793c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar
48077ba708819285931932ecd33691a672bb59d221aEli Friedman  if (!GV) {
48177ba708819285931932ecd33691a672bb59d221aEli Friedman    GV = new llvm::GlobalVariable(InitType, false,
48277ba708819285931932ecd33691a672bb59d221aEli Friedman                                  llvm::GlobalValue::ExternalLinkage,
48377ba708819285931932ecd33691a672bb59d221aEli Friedman                                  0, D->getName(), &getModule(), 0,
48477ba708819285931932ecd33691a672bb59d221aEli Friedman                                  ASTTy.getAddressSpace());
4853c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  } else if (GV->getType() !=
4863c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar             llvm::PointerType::get(InitType, ASTTy.getAddressSpace())) {
48777ba708819285931932ecd33691a672bb59d221aEli Friedman    // We have a definition after a prototype with the wrong type.
48877ba708819285931932ecd33691a672bb59d221aEli Friedman    // We must make a new GlobalVariable* and update everything that used OldGV
48977ba708819285931932ecd33691a672bb59d221aEli Friedman    // (a declaration or tentative definition) with the new GlobalVariable*
49077ba708819285931932ecd33691a672bb59d221aEli Friedman    // (which will be a definition).
49177ba708819285931932ecd33691a672bb59d221aEli Friedman    //
49277ba708819285931932ecd33691a672bb59d221aEli Friedman    // This happens if there is a prototype for a global (e.g. "extern int x[];")
49377ba708819285931932ecd33691a672bb59d221aEli Friedman    // and then a definition of a different type (e.g. "int x[10];"). This also
49477ba708819285931932ecd33691a672bb59d221aEli Friedman    // happens when an initializer has a different type from the type of the
49577ba708819285931932ecd33691a672bb59d221aEli Friedman    // global (this happens with unions).
496cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    //
497cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    // FIXME: This also ends up happening if there's a definition followed by
498cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    // a tentative definition!  (Although Sema rejects that construct
499cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    // at the moment.)
50077ba708819285931932ecd33691a672bb59d221aEli Friedman
50177ba708819285931932ecd33691a672bb59d221aEli Friedman    // Save the old global
50277ba708819285931932ecd33691a672bb59d221aEli Friedman    llvm::GlobalVariable *OldGV = GV;
50377ba708819285931932ecd33691a672bb59d221aEli Friedman
50477ba708819285931932ecd33691a672bb59d221aEli Friedman    // Make a new global with the correct type
50577ba708819285931932ecd33691a672bb59d221aEli Friedman    GV = new llvm::GlobalVariable(InitType, false,
50677ba708819285931932ecd33691a672bb59d221aEli Friedman                                  llvm::GlobalValue::ExternalLinkage,
50777ba708819285931932ecd33691a672bb59d221aEli Friedman                                  0, D->getName(), &getModule(), 0,
50877ba708819285931932ecd33691a672bb59d221aEli Friedman                                  ASTTy.getAddressSpace());
50977ba708819285931932ecd33691a672bb59d221aEli Friedman    // Steal the name of the old global
51077ba708819285931932ecd33691a672bb59d221aEli Friedman    GV->takeName(OldGV);
51177ba708819285931932ecd33691a672bb59d221aEli Friedman
51277ba708819285931932ecd33691a672bb59d221aEli Friedman    // Replace all uses of the old global with the new global
51377ba708819285931932ecd33691a672bb59d221aEli Friedman    llvm::Constant *NewPtrForOldDecl =
51477ba708819285931932ecd33691a672bb59d221aEli Friedman        llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
51577ba708819285931932ecd33691a672bb59d221aEli Friedman    OldGV->replaceAllUsesWith(NewPtrForOldDecl);
51677ba708819285931932ecd33691a672bb59d221aEli Friedman
51777ba708819285931932ecd33691a672bb59d221aEli Friedman    // Erase the old global, since it is no longer used.
51877ba708819285931932ecd33691a672bb59d221aEli Friedman    OldGV->eraseFromParent();
51977ba708819285931932ecd33691a672bb59d221aEli Friedman  }
52077ba708819285931932ecd33691a672bb59d221aEli Friedman
5213c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  Entry = GV;
5229e32d4b4a7270a9701b7cb454381eeaa4cc42a77Devang Patel
5238bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  if (const AnnotateAttr *AA = D->getAttr<AnnotateAttr>()) {
5248bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman    SourceManager &SM = Context.getSourceManager();
5258bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman    AddAnnotation(EmitAnnotateAttr(GV, AA,
5268bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman                                   SM.getLogicalLineNumber(D->getLocation())));
5278bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  }
5288bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman
52988a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner  GV->setInitializer(Init);
530b381aac9bae6d608c72267dd0ed08ec6369e94e4Nuno Lopes  GV->setConstant(D->getType().isConstant(Context));
531ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
532cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman  // FIXME: This is silly; getTypeAlign should just work for incomplete arrays
533cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman  unsigned Align;
534c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  if (const IncompleteArrayType* IAT =
535c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner        Context.getAsIncompleteArrayType(D->getType()))
536cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    Align = Context.getTypeAlign(IAT->getElementType());
537cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman  else
538cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    Align = Context.getTypeAlign(D->getType());
53908d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman  if (const AlignedAttr* AA = D->getAttr<AlignedAttr>()) {
54008d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman    Align = std::max(Align, AA->getAlignment());
54108d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman  }
54208d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman  GV->setAlignment(Align / 8);
54308d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman
544ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  if (const VisibilityAttr *attr = D->getAttr<VisibilityAttr>())
54541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    setGlobalVisibility(GV, attr->getVisibility());
546ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // FIXME: else handle -fvisibility
547a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar
548a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar  if (const AsmLabelAttr *ALA = D->getAttr<AsmLabelAttr>()) {
549a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar    // Prefaced with special LLVM marker to indicate that the name
550a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar    // should not be munged.
551a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar    GV->setName("\01" + ALA->getLabel());
552a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar  }
55388a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner
55488a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner  // Set the llvm linkage type as appropriate.
5558fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner  if (D->getStorageClass() == VarDecl::Static)
5568fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner    GV->setLinkage(llvm::Function::InternalLinkage);
5578fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner  else if (D->getAttr<DLLImportAttr>())
558ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    GV->setLinkage(llvm::Function::DLLImportLinkage);
559ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  else if (D->getAttr<DLLExportAttr>())
560ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    GV->setLinkage(llvm::Function::DLLExportLinkage);
5618fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner  else if (D->getAttr<WeakAttr>())
562ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    GV->setLinkage(llvm::GlobalVariable::WeakLinkage);
5638fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner  else {
564ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    // FIXME: This isn't right.  This should handle common linkage and other
565ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    // stuff.
566ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    switch (D->getStorageClass()) {
5678fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner    case VarDecl::Static: assert(0 && "This case handled above");
568ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    case VarDecl::Auto:
569ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    case VarDecl::Register:
570ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner      assert(0 && "Can't have auto or register globals");
571ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    case VarDecl::None:
572ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner      if (!D->getInit())
573a07b76419a03f126c22949dce2e546ba4df0e415Eli Friedman        GV->setLinkage(llvm::GlobalVariable::CommonLinkage);
574ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner      break;
575ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    case VarDecl::Extern:
576ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    case VarDecl::PrivateExtern:
577ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner      // todo: common
578ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner      break;
579ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    }
58088a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner  }
581686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta
582686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta  // Emit global variable debug information.
583686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta  CGDebugInfo *DI = getDebugInfo();
584686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta  if(DI) {
585686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta    if(D->getLocation().isValid())
586686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta      DI->setLocation(D->getLocation());
587686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta    DI->EmitGlobalVariable(GV, D);
588686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta  }
58988a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner}
5905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
591bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarllvm::GlobalValue *
592bd012ff1fa088181646a784f385b28867372d434Daniel DunbarCodeGenModule::EmitForwardFunctionDefinition(const FunctionDecl *D) {
593219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  const llvm::Type *Ty = getTypes().ConvertType(D->getType());
594219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  llvm::Function *F = llvm::Function::Create(cast<llvm::FunctionType>(Ty),
595219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar                                             llvm::Function::ExternalLinkage,
596219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar                                             D->getName(), &getModule());
597219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  SetFunctionAttributes(D, F);
598219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  return F;
599bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar}
600bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
601bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarllvm::Constant *CodeGenModule::GetAddrOfFunction(const FunctionDecl *D) {
6029986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar  QualType ASTTy = D->getType();
6039986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar  const llvm::Type *Ty = getTypes().ConvertTypeForMem(ASTTy);
6049986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar  const llvm::Type *PTy = llvm::PointerType::get(Ty, ASTTy.getAddressSpace());
6053c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar
6063c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  // Lookup the entry, lazily creating it if necessary.
60790db88249ac92e6ed515065048a4ead4467e6639Daniel Dunbar  llvm::GlobalValue *&Entry = GlobalDeclMap[D->getIdentifier()];
6083c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  if (!Entry)
6093c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar    Entry = EmitForwardFunctionDefinition(D);
610bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
6119986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar  return llvm::ConstantExpr::getBitCast(Entry, PTy);
612bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar}
613bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
614bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalFunctionDefinition(const FunctionDecl *D) {
61590db88249ac92e6ed515065048a4ead4467e6639Daniel Dunbar  llvm::GlobalValue *&Entry = GlobalDeclMap[D->getIdentifier()];
6163c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  if (!Entry) {
617bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    Entry = EmitForwardFunctionDefinition(D);
618bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  } else {
6193c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar    // If the types mismatch then we have to rewrite the definition.
6203c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar    const llvm::Type *Ty = getTypes().ConvertType(D->getType());
6213c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar    if (Entry->getType() != llvm::PointerType::getUnqual(Ty)) {
622bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // Otherwise, we have a definition after a prototype with the wrong type.
623bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // F is the Function* for the one with the wrong type, we must make a new
624bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // Function* and update everything that used F (a declaration) with the new
625bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // Function* (which will be a definition).
626bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      //
627bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // This happens if there is a prototype for a function (e.g. "int f()") and
628bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // then a definition of a different type (e.g. "int f(int x)").  Start by
629bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // making a new function of the correct type, RAUW, then steal the name.
6303c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar      llvm::GlobalValue *NewFn = EmitForwardFunctionDefinition(D);
6313c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar      NewFn->takeName(Entry);
632bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
633bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // Replace uses of F with the Function we will endow with a body.
634bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      llvm::Constant *NewPtrForOldDecl =
6353c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar        llvm::ConstantExpr::getBitCast(NewFn, Entry->getType());
6363c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar      Entry->replaceAllUsesWith(NewPtrForOldDecl);
6373c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar
638bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // Ok, delete the old function now, which is dead.
6393c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar      assert(Entry->isDeclaration() && "Shouldn't replace non-declaration");
640219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar      Entry->eraseFromParent();
641bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
642bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      Entry = NewFn;
643bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    }
644bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  }
645bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
646219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  llvm::Function *Fn = cast<llvm::Function>(Entry);
647219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  CodeGenFunction(*this).GenerateCode(D, Fn);
6486379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar
649219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  SetFunctionAttributesForDefinition(D, Fn);
650219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar
651219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  if (const ConstructorAttr *CA = D->getAttr<ConstructorAttr>()) {
652219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    AddGlobalCtor(Fn, CA->getPriority());
653219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar  } else if (const DestructorAttr *DA = D->getAttr<DestructorAttr>()) {
654219df6644e2338ff067471ab0d85f27b88544ac2Daniel Dunbar    AddGlobalDtor(Fn, DA->getPriority());
655bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  }
656bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar}
657bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
658c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattnervoid CodeGenModule::UpdateCompletedType(const TagDecl *TD) {
659c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattner  // Make sure that this type is translated.
660c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattner  Types.UpdateCompletedType(TD);
661d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner}
662d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner
663d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner
664bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner/// getBuiltinLibFunction
665bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattnerllvm::Function *CodeGenModule::getBuiltinLibFunction(unsigned BuiltinID) {
6661426fecdf90dd1986751b9940422e675880ff671Chris Lattner  if (BuiltinID > BuiltinFunctions.size())
6671426fecdf90dd1986751b9940422e675880ff671Chris Lattner    BuiltinFunctions.resize(BuiltinID);
668bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner
6691426fecdf90dd1986751b9940422e675880ff671Chris Lattner  // Cache looked up functions.  Since builtin id #0 is invalid we don't reserve
6701426fecdf90dd1986751b9940422e675880ff671Chris Lattner  // a slot for it.
6711426fecdf90dd1986751b9940422e675880ff671Chris Lattner  assert(BuiltinID && "Invalid Builtin ID");
6721426fecdf90dd1986751b9940422e675880ff671Chris Lattner  llvm::Function *&FunctionSlot = BuiltinFunctions[BuiltinID-1];
673bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  if (FunctionSlot)
674bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner    return FunctionSlot;
675bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner
676bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  assert(Context.BuiltinInfo.isLibFunction(BuiltinID) && "isn't a lib fn");
677bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner
678bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  // Get the name, skip over the __builtin_ prefix.
679bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  const char *Name = Context.BuiltinInfo.GetName(BuiltinID)+10;
680bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner
681bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  // Get the type for the builtin.
682bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  QualType Type = Context.BuiltinInfo.GetBuiltinType(BuiltinID, Context);
683bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  const llvm::FunctionType *Ty =
684bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner    cast<llvm::FunctionType>(getTypes().ConvertType(Type));
685bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner
686bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  // FIXME: This has a serious problem with code like this:
687bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  //  void abs() {}
688bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  //    ... __builtin_abs(x);
689bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  // The two versions of abs will collide.  The fix is for the builtin to win,
690bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  // and for the existing one to be turned into a constantexpr cast of the
691bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  // builtin.  In the case where the existing one is a static function, it
692bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  // should just be renamed.
693c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner  if (llvm::Function *Existing = getModule().getFunction(Name)) {
694c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner    if (Existing->getFunctionType() == Ty && Existing->hasExternalLinkage())
695c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner      return FunctionSlot = Existing;
696c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner    assert(Existing == 0 && "FIXME: Name collision");
697c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner  }
698bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner
699bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  // FIXME: param attributes for sext/zext etc.
7004c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman  return FunctionSlot =
7014c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman    llvm::Function::Create(Ty, llvm::Function::ExternalLinkage, Name,
7024c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman                           &getModule());
703bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner}
704bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner
7057acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattnerllvm::Function *CodeGenModule::getIntrinsic(unsigned IID,const llvm::Type **Tys,
7067acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner                                            unsigned NumTys) {
7077acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner  return llvm::Intrinsic::getDeclaration(&getModule(),
7087acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner                                         (llvm::Intrinsic::ID)IID, Tys, NumTys);
7097acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner}
710bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner
7115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerllvm::Function *CodeGenModule::getMemCpyFn() {
7125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (MemCpyFn) return MemCpyFn;
7135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::Intrinsic::ID IID;
714f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  switch (Context.Target.getPointerWidth(0)) {
7155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default: assert(0 && "Unknown ptr width");
7165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case 32: IID = llvm::Intrinsic::memcpy_i32; break;
7175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case 64: IID = llvm::Intrinsic::memcpy_i64; break;
7185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
7197acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner  return MemCpyFn = getIntrinsic(IID);
7205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
721c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
7220c99509927a0c7a48490486b9fec287b63e5c09cEli Friedmanllvm::Function *CodeGenModule::getMemMoveFn() {
7230c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman  if (MemMoveFn) return MemMoveFn;
7240c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman  llvm::Intrinsic::ID IID;
7250c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman  switch (Context.Target.getPointerWidth(0)) {
7260c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman  default: assert(0 && "Unknown ptr width");
7270c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman  case 32: IID = llvm::Intrinsic::memmove_i32; break;
7280c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman  case 64: IID = llvm::Intrinsic::memmove_i64; break;
7290c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman  }
7300c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman  return MemMoveFn = getIntrinsic(IID);
7310c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman}
7320c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman
73341ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venanciollvm::Function *CodeGenModule::getMemSetFn() {
73441ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio  if (MemSetFn) return MemSetFn;
73541ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio  llvm::Intrinsic::ID IID;
736f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  switch (Context.Target.getPointerWidth(0)) {
73741ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio  default: assert(0 && "Unknown ptr width");
73841ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio  case 32: IID = llvm::Intrinsic::memset_i32; break;
73941ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio  case 64: IID = llvm::Intrinsic::memset_i64; break;
74041ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio  }
74141ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio  return MemSetFn = getIntrinsic(IID);
74241ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio}
7437acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner
7443e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar// We still need to work out the details of handling UTF-16.
7453e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar// See: <rdr://2996215>
746bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattnerllvm::Constant *CodeGenModule::
747bef20ac367a09555b30d6eb3847a81ec164caf88Chris LattnerGetAddrOfConstantCFString(const std::string &str) {
748c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  llvm::StringMapEntry<llvm::Constant *> &Entry =
749c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson    CFConstantStringMap.GetOrCreateValue(&str[0], &str[str.length()]);
750c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
751c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  if (Entry.getValue())
752c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson    return Entry.getValue();
753c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
7543e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar  llvm::Constant *Zero = llvm::Constant::getNullValue(llvm::Type::Int32Ty);
7553e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar  llvm::Constant *Zeros[] = { Zero, Zero };
756c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
757c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  if (!CFConstantStringClassRef) {
758c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson    const llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy);
759c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson    Ty = llvm::ArrayType::get(Ty, 0);
7603e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar
7613e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar    // FIXME: This is fairly broken if
7623e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar    // __CFConstantStringClassReference is already defined, in that it
7633e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar    // will get renamed and the user will most likely see an opaque
7643e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar    // error message. This is a general issue with relying on
7653e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar    // particular names.
7663e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar    llvm::GlobalVariable *GV =
767c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson      new llvm::GlobalVariable(Ty, false,
768c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson                               llvm::GlobalVariable::ExternalLinkage, 0,
769c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson                               "__CFConstantStringClassReference",
770c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson                               &getModule());
7713e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar
7723e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar    // Decay array -> ptr
7733e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar    CFConstantStringClassRef =
7743e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar      llvm::ConstantExpr::getGetElementPtr(GV, Zeros, 2);
775c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  }
776c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
7773e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar  std::vector<llvm::Constant*> Fields(4);
7783e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar
779c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  // Class pointer.
7803e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar  Fields[0] = CFConstantStringClassRef;
781c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
782c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  // Flags.
7833e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar  const llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy);
7843e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar  Fields[1] = llvm::ConstantInt::get(Ty, 0x07C8);
785c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
786c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  // String pointer.
7873e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar  llvm::Constant *C = llvm::ConstantArray::get(str);
788c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  C = new llvm::GlobalVariable(C->getType(), true,
789c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson                               llvm::GlobalValue::InternalLinkage,
7903e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar                               C, ".str", &getModule());
7913e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar  Fields[2] = llvm::ConstantExpr::getGetElementPtr(C, Zeros, 2);
792c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
793c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  // String length.
794c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  Ty = getTypes().ConvertType(getContext().LongTy);
7953e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar  Fields[3] = llvm::ConstantInt::get(Ty, str.length());
796c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
797c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  // The struct.
798c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  Ty = getTypes().ConvertType(getContext().getCFConstantStringType());
799c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  C = llvm::ConstantStruct::get(cast<llvm::StructType>(Ty), Fields);
8000c67829763b98bc670062b553897a851fab17401Anders Carlsson  llvm::GlobalVariable *GV =
8010c67829763b98bc670062b553897a851fab17401Anders Carlsson    new llvm::GlobalVariable(C->getType(), true,
8020c67829763b98bc670062b553897a851fab17401Anders Carlsson                             llvm::GlobalVariable::InternalLinkage,
8030c67829763b98bc670062b553897a851fab17401Anders Carlsson                             C, "", &getModule());
8043e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar
8050c67829763b98bc670062b553897a851fab17401Anders Carlsson  GV->setSection("__DATA,__cfstring");
8060c67829763b98bc670062b553897a851fab17401Anders Carlsson  Entry.setValue(GV);
8073e9df9920db8de8ec93a424b0c1784f9bff301eaDaniel Dunbar
8080c67829763b98bc670062b553897a851fab17401Anders Carlsson  return GV;
809c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson}
81045e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner
8116143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// GetStringForStringLiteral - Return the appropriate bytes for a
8121e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar/// string literal, properly padded to match the literal type.
8136143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbarstd::string CodeGenModule::GetStringForStringLiteral(const StringLiteral *E) {
814662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar  if (E->isWide()) {
815662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar    ErrorUnsupported(E, "wide string");
816662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar    return "FIXME";
817662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar  }
818662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar
8191e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  const char *StrData = E->getStrData();
8201e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  unsigned Len = E->getByteLength();
8211e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar
8221e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  const ConstantArrayType *CAT =
8231e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar    getContext().getAsConstantArrayType(E->getType());
8241e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  assert(CAT && "String isn't pointer or array!");
8251e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar
8261e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  // Resize the string to the right size
8271e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  // FIXME: What about wchar_t strings?
8281e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  std::string Str(StrData, StrData+Len);
8291e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  uint64_t RealLen = CAT->getSize().getZExtValue();
8301e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  Str.resize(RealLen, '\0');
8311e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar
8321e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  return Str;
8331e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar}
8341e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar
8356143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// GetAddrOfConstantStringFromLiteral - Return a pointer to a
8366143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// constant array for the given string literal.
8376143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbarllvm::Constant *
8386143293fa4366ee95d7e47e61bd030a34bf68b55Daniel DunbarCodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S) {
8396143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar  // FIXME: This can be more efficient.
8406143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar  return GetAddrOfConstantString(GetStringForStringLiteral(S));
8416143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar}
8426143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar
843a7ad98ff0919d6a24ea7c46634ea29bea551c1a0Chris Lattner/// GenerateWritableString -- Creates storage for a string literal.
84445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattnerstatic llvm::Constant *GenerateStringLiteral(const std::string &str,
84545e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner                                             bool constant,
8462c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner                                             CodeGenModule &CGM) {
8476143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar  // Create Constant for this string literal. Don't add a '\0'.
8486143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar  llvm::Constant *C = llvm::ConstantArray::get(str, false);
84945e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner
85045e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  // Create a global variable for this string
85145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  C = new llvm::GlobalVariable(C->getType(), constant,
85245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner                               llvm::GlobalValue::InternalLinkage,
8532c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner                               C, ".str", &CGM.getModule());
8546143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar
85545e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  return C;
85645e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner}
85745e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner
8586143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// GetAddrOfConstantString - Returns a pointer to a character array
8596143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// containing the literal. This contents are exactly that of the
8606143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// given string, i.e. it will not be null terminated automatically;
8616143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// see GetAddrOfConstantCString. Note that whether the result is
8626143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// actually a pointer to an LLVM constant depends on
8636143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// Feature.WriteableStrings.
8646143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar///
8656143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// The result has pointer to array type.
86645e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattnerllvm::Constant *CodeGenModule::GetAddrOfConstantString(const std::string &str) {
86745e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  // Don't share any string literals if writable-strings is turned on.
86845e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  if (Features.WritableStrings)
86945e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner    return GenerateStringLiteral(str, false, *this);
87045e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner
87145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  llvm::StringMapEntry<llvm::Constant *> &Entry =
87245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  ConstantStringMap.GetOrCreateValue(&str[0], &str[str.length()]);
87345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner
87445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  if (Entry.getValue())
87545e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner      return Entry.getValue();
87645e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner
87745e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  // Create a global variable for this.
87845e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  llvm::Constant *C = GenerateStringLiteral(str, true, *this);
87945e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  Entry.setValue(C);
88045e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  return C;
88145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner}
8826143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar
8836143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// GetAddrOfConstantCString - Returns a pointer to a character
8846143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// array containing the literal and a terminating '\-'
8856143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar/// character. The result has pointer to array type.
8866143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbarllvm::Constant *CodeGenModule::GetAddrOfConstantCString(const std::string &str) {
8879d9b09c86a8c69e8f69364f610563cdb86f2b8b7Daniel Dunbar  return GetAddrOfConstantString(str + "\0");
8886143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar}
88941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar
890af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar/// EmitObjCPropertyImplementations - Emit information for synthesized
891af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar/// properties for an implementation.
892af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbarvoid CodeGenModule::EmitObjCPropertyImplementations(const
893af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar                                                    ObjCImplementationDecl *D) {
894af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar  for (ObjCImplementationDecl::propimpl_iterator i = D->propimpl_begin(),
895af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar         e = D->propimpl_end(); i != e; ++i) {
896af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar    ObjCPropertyImplDecl *PID = *i;
897af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar
898af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar    // Dynamic is just for type-checking.
899af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar    if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) {
900af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar      ObjCPropertyDecl *PD = PID->getPropertyDecl();
901af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar
902af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar      // Determine which methods need to be implemented, some may have
903af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar      // been overridden. Note that ::isSynthesized is not the method
904af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar      // we want, that just indicates if the decl came from a
905af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar      // property. What we want to know is if the method is defined in
906af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar      // this implementation.
907af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar      if (!D->getInstanceMethod(PD->getGetterName()))
908af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar        CodeGenFunction(*this).GenerateObjCGetter(PID);
909af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar      if (!PD->isReadOnly() &&
910af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar          !D->getInstanceMethod(PD->getSetterName()))
911af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar        CodeGenFunction(*this).GenerateObjCSetter(PID);
912af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar    }
913af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar  }
914af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar}
915af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar
91641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar/// EmitTopLevelDecl - Emit code for a single top level declaration.
91741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbarvoid CodeGenModule::EmitTopLevelDecl(Decl *D) {
91841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  // If an error has occurred, stop code generation, but continue
91941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  // parsing and semantic analysis (to ensure all warnings and errors
92041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  // are emitted).
92141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  if (Diags.hasErrorOccurred())
92241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    return;
92341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar
92441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  switch (D->getKind()) {
92541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  case Decl::Function:
92641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  case Decl::Var:
92741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    EmitGlobal(cast<ValueDecl>(D));
92841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    break;
92941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar
93041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  case Decl::Namespace:
931662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar    ErrorUnsupported(D, "namespace");
93241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    break;
93341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar
93441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    // Objective-C Decls
93541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar
93641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    // Forward declarations, no (immediate) code generation.
93741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  case Decl::ObjCClass:
93841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  case Decl::ObjCCategory:
93941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  case Decl::ObjCForwardProtocol:
94041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  case Decl::ObjCInterface:
94141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    break;
94241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar
94341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  case Decl::ObjCProtocol:
94441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    Runtime->GenerateProtocol(cast<ObjCProtocolDecl>(D));
94541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    break;
94641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar
94741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  case Decl::ObjCCategoryImpl:
948af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar    // Categories have properties but don't support synthesize so we
949af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar    // can ignore them here.
950af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar
95141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    Runtime->GenerateCategory(cast<ObjCCategoryImplDecl>(D));
95241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    break;
95341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar
954af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar  case Decl::ObjCImplementation: {
955af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar    ObjCImplementationDecl *OMD = cast<ObjCImplementationDecl>(D);
956af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar    EmitObjCPropertyImplementations(OMD);
957af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar    Runtime->GenerateClass(OMD);
95841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    break;
959af05bb9073319d8381b71c4325188853fd4b8ed6Daniel Dunbar  }
96041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  case Decl::ObjCMethod: {
96141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(D);
96241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    // If this is not a prototype, emit the body.
96341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    if (OMD->getBody())
96441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar      CodeGenFunction(*this).GenerateObjCMethod(OMD);
96541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    break;
96641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  }
96741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  case Decl::ObjCCompatibleAlias:
968662174c82ef46b19a2329c7d37208e1d12dfb7b3Daniel Dunbar    ErrorUnsupported(D, "Objective-C compatible alias");
96941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    break;
97041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar
97141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  case Decl::LinkageSpec: {
97241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    LinkageSpecDecl *LSD = cast<LinkageSpecDecl>(D);
97341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    if (LSD->getLanguage() == LinkageSpecDecl::lang_cxx)
974488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar      ErrorUnsupported(LSD, "linkage spec");
97541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    // FIXME: implement C++ linkage, C linkage works mostly by C
97641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    // language reuse already.
97741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    break;
97841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  }
97941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar
98041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  case Decl::FileScopeAsm: {
98141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    FileScopeAsmDecl *AD = cast<FileScopeAsmDecl>(D);
98241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    std::string AsmString(AD->getAsmString()->getStrData(),
98341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar                          AD->getAsmString()->getByteLength());
98441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar
98541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    const std::string &S = getModule().getModuleInlineAsm();
98641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    if (S.empty())
98741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar      getModule().setModuleInlineAsm(AsmString);
98841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    else
98941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar      getModule().setModuleInlineAsm(S + '\n' + AsmString);
99041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    break;
99141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  }
99241071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar
99341071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  default:
99441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    // Make sure we handled everything we should, every other kind is
99541071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    // a non-top-level decl.  FIXME: Would be nice to have an
99641071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    // isTopLevelDeclKind function. Need to recode Decl::Kind to do
99741071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    // that easily.
99841071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar    assert(isa<TypeDecl>(D) && "Unsupported decl kind");
99941071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar  }
100041071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar}
100141071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar
1002