CodeGenModule.cpp revision 208ff5e8a073de2a5d15cbe03cab8a4c0d935e28
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- CodeGenModule.cpp - Emit LLVM Code from ASTs for a Module --------===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This coordinates the per-module state used while generating code.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
14e8b9f5b8ea60983c4a74cb8b63879616b914b65aSanjiv Gupta#include "CGDebugInfo.h"
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "CodeGenModule.h"
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "CodeGenFunction.h"
175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/ASTContext.h"
18c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/AST/DeclObjC.h"
192c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner#include "clang/Basic/Diagnostic.h"
208bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman#include "clang/Basic/SourceManager.h"
215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h"
22ec9426ca6039279bcc99bc2c625bb2abe4f0353dNate Begeman#include "llvm/CallingConv.h"
23bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner#include "llvm/Module.h"
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/Intrinsics.h"
2520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov#include "llvm/Target/TargetData.h"
26a1945fa74d04098d7e22d7c31585342555eca928Chris Lattner#include "llvm/Analysis/Verifier.h"
275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace CodeGen;
295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris LattnerCodeGenModule::CodeGenModule(ASTContext &C, const LangOptions &LO,
32fb97b03e42d397405f617be0252be83e77a66f6eChris Lattner                             llvm::Module &M, const llvm::TargetData &TD,
33c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel Dunbar                             Diagnostic &diags, bool GenerateDebugInfo,
34c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel Dunbar                             bool UseMacObjCRuntime)
35fb97b03e42d397405f617be0252be83e77a66f6eChris Lattner  : Context(C), Features(LO), TheModule(M), TheTargetData(TD), Diags(diags),
36208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar    Types(C, M, TD), Runtime(0), MemCpyFn(0), MemMoveFn(0), MemSetFn(0),
370c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman    CFConstantStringClassRef(0) {
38208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar
39208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar  if (Features.ObjC1) {
40208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar    // TODO: Make this selectable at runtime
41208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar    if (UseMacObjCRuntime) {
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();
59208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar  if (Runtime)
60208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar    if (llvm::Function *ObjCInitFunction = Runtime->ModuleInitFunction())
61208ff5e8a073de2a5d15cbe03cab8a4c0d935e28Daniel Dunbar      AddGlobalCtor(ObjCInitFunction);
626bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  EmitCtorList(GlobalCtors, "llvm.global_ctors");
636bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  EmitCtorList(GlobalDtors, "llvm.global_dtors");
64532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman  EmitAnnotations();
65a1945fa74d04098d7e22d7c31585342555eca928Chris Lattner  // Run the verifier to check that the generated code is consistent.
66a1945fa74d04098d7e22d7c31585342555eca928Chris Lattner  assert(!verifyModule(TheModule));
672b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris Lattner}
685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
692c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner/// WarnUnsupported - Print out a warning that codegen doesn't support the
702c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner/// specified stmt yet.
712c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattnervoid CodeGenModule::WarnUnsupported(const Stmt *S, const char *Type) {
722c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner  unsigned DiagID = getDiags().getCustomDiagID(Diagnostic::Warning,
732c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner                                               "cannot codegen this %0 yet");
742c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner  SourceRange Range = S->getSourceRange();
752c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner  std::string Msg = Type;
769c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek  getDiags().Report(Context.getFullLoc(S->getLocStart()), DiagID,
777a9d49fd2bfac00e905b361ba76d26ab5b6c3b09Ted Kremenek                    &Msg, 1, &Range, 1);
782c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner}
7958c3f9ec11cbe852a518bf2f83af46f938b7b852Chris Lattner
80c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner/// WarnUnsupported - Print out a warning that codegen doesn't support the
81c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner/// specified decl yet.
82c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattnervoid CodeGenModule::WarnUnsupported(const Decl *D, const char *Type) {
83c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner  unsigned DiagID = getDiags().getCustomDiagID(Diagnostic::Warning,
84c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner                                               "cannot codegen this %0 yet");
85c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner  std::string Msg = Type;
86c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner  getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID,
87c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner                    &Msg, 1);
88c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner}
89c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner
904f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman/// setVisibility - Set the visibility for the given LLVM GlobalValue
914f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman/// according to the given clang AST visibility value.
924f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanvoid CodeGenModule::setVisibility(llvm::GlobalValue *GV,
934f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman                                  VisibilityAttr::VisibilityTypes Vis) {
944f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  switch (Vis) {
954f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  default: assert(0 && "Unknown visibility!");
964f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  case VisibilityAttr::DefaultVisibility:
974f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
984f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    break;
994f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  case VisibilityAttr::HiddenVisibility:
1004f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
1014f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    break;
1024f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  case VisibilityAttr::ProtectedVisibility:
1034f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
1044f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    break;
1054f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  }
1064f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman}
1074f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman
1086d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner/// AddGlobalCtor - Add a function to the list that will be called before
1096d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner/// main() runs.
1106bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::AddGlobalCtor(llvm::Function * Ctor, int Priority) {
1116d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner  // TODO: Type coercion of void()* types.
1126bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  GlobalCtors.push_back(std::make_pair(Ctor, Priority));
1136d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner}
1146d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner
1156bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar/// AddGlobalDtor - Add a function to the list that will be called
1166bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar/// when the module is unloaded.
1176bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::AddGlobalDtor(llvm::Function * Dtor, int Priority) {
1186bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  // TODO: Type coercion of void()* types.
1196bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  GlobalDtors.push_back(std::make_pair(Dtor, Priority));
1206bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar}
1216bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar
1226bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbarvoid CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) {
1236bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  // Ctor function type is void()*.
1246bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  llvm::FunctionType* CtorFTy =
1256bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar    llvm::FunctionType::get(llvm::Type::VoidTy,
1266bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar                            std::vector<const llvm::Type*>(),
1276bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar                            false);
1286bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy);
1296bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar
1306bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  // Get the type of a ctor entry, { i32, void ()* }.
131572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner  llvm::StructType* CtorStructTy =
1326bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar    llvm::StructType::get(llvm::Type::Int32Ty,
1336bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar                          llvm::PointerType::getUnqual(CtorFTy), NULL);
1346bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar
1356bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  // Construct the constructor and destructor arrays.
1366bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  std::vector<llvm::Constant*> Ctors;
1376bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  for (CtorList::const_iterator I = Fns.begin(), E = Fns.end(); I != E; ++I) {
1386bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar    std::vector<llvm::Constant*> S;
1396bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar    S.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty, I->second, false));
1406bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar    S.push_back(llvm::ConstantExpr::getBitCast(I->first, CtorPFTy));
1416bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar    Ctors.push_back(llvm::ConstantStruct::get(CtorStructTy, S));
1426bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  }
1436bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar
1446bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  if (!Ctors.empty()) {
1456bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar    llvm::ArrayType *AT = llvm::ArrayType::get(CtorStructTy, Ctors.size());
1466bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar    new llvm::GlobalVariable(AT, false,
147572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner                             llvm::GlobalValue::AppendingLinkage,
1486bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar                             llvm::ConstantArray::get(AT, Ctors),
1496bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar                             GlobalName,
150572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner                             &TheModule);
1516d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner  }
1526d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner}
1536d39760673df2e92d9293f46ff8c66dad6ab5e0aChris Lattner
154532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begemanvoid CodeGenModule::EmitAnnotations() {
155532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman  if (Annotations.empty())
156532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman    return;
157532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman
158532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman  // Create a new global variable for the ConstantStruct in the Module.
159532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman  llvm::Constant *Array =
160532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman  llvm::ConstantArray::get(llvm::ArrayType::get(Annotations[0]->getType(),
161532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman                                                Annotations.size()),
162532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman                           Annotations);
163532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman  llvm::GlobalValue *gv =
164532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman  new llvm::GlobalVariable(Array->getType(), false,
165532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman                           llvm::GlobalValue::AppendingLinkage, Array,
166532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman                           "llvm.global.annotations", &TheModule);
167532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman  gv->setSection("llvm.metadata");
168532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman}
169532485cc6c078d9e51b517c6bbd8984deb17f0feNate Begeman
170ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedmanbool hasAggregateLLVMType(QualType T) {
171ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman  return !T->isRealType() && !T->isPointerLikeType() &&
172ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman         !T->isVoidType() && !T->isVectorType() && !T->isFunctionType();
173ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman}
174ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman
175d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopesvoid CodeGenModule::SetGlobalValueAttributes(const FunctionDecl *FD,
176d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes                                             llvm::GlobalValue *GV) {
177d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  // TODO: Set up linkage and many other things.  Note, this is a simple
178d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  // approximation of what we really want.
179d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  if (FD->getStorageClass() == FunctionDecl::Static)
180d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes    GV->setLinkage(llvm::Function::InternalLinkage);
181d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  else if (FD->getAttr<DLLImportAttr>())
182d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes    GV->setLinkage(llvm::Function::DLLImportLinkage);
183d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  else if (FD->getAttr<DLLExportAttr>())
184d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes    GV->setLinkage(llvm::Function::DLLExportLinkage);
185d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  else if (FD->getAttr<WeakAttr>() || FD->isInline())
186d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes    GV->setLinkage(llvm::Function::WeakLinkage);
187d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
188d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  if (const VisibilityAttr *attr = FD->getAttr<VisibilityAttr>())
189d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes    CodeGenModule::setVisibility(GV, attr->getVisibility());
190d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  // FIXME: else handle -fvisibility
191a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar
192a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar  if (const AsmLabelAttr *ALA = FD->getAttr<AsmLabelAttr>()) {
193a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar    // Prefaced with special LLVM marker to indicate that the name
194a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar    // should not be munged.
195a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar    GV->setName("\01" + ALA->getLabel());
196a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar  }
197d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes}
198d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
199ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedmanvoid CodeGenModule::SetFunctionAttributes(const FunctionDecl *FD,
200ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman                                          llvm::Function *F,
201ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman                                          const llvm::FunctionType *FTy) {
202ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman  unsigned FuncAttrs = 0;
203ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman  if (FD->getAttr<NoThrowAttr>())
204ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman    FuncAttrs |= llvm::ParamAttr::NoUnwind;
205ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman  if (FD->getAttr<NoReturnAttr>())
206ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman    FuncAttrs |= llvm::ParamAttr::NoReturn;
207ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman
208ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman  llvm::SmallVector<llvm::ParamAttrsWithIndex, 8> ParamAttrList;
209ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman  if (FuncAttrs)
210ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman    ParamAttrList.push_back(llvm::ParamAttrsWithIndex::get(0, FuncAttrs));
211ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman  // Note that there is parallel code in CodeGenFunction::EmitCallExpr
212ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman  bool AggregateReturn = hasAggregateLLVMType(FD->getResultType());
213ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman  if (AggregateReturn)
214ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman    ParamAttrList.push_back(
215ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman        llvm::ParamAttrsWithIndex::get(1, llvm::ParamAttr::StructRet));
216ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman  unsigned increment = AggregateReturn ? 2 : 1;
217c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman  const FunctionTypeProto* FTP = dyn_cast<FunctionTypeProto>(FD->getType());
218c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman  if (FTP) {
219c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman    for (unsigned i = 0; i < FTP->getNumArgs(); i++) {
220c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman      QualType ParamType = FTP->getArgType(i);
221c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman      unsigned ParamAttrs = 0;
222c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman      if (ParamType->isRecordType())
223c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman        ParamAttrs |= llvm::ParamAttr::ByVal;
224a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner      if (ParamType->isSignedIntegerType() &&
225a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner          ParamType->isPromotableIntegerType())
226c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman        ParamAttrs |= llvm::ParamAttr::SExt;
227a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner      if (ParamType->isUnsignedIntegerType() &&
228a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner          ParamType->isPromotableIntegerType())
229c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman        ParamAttrs |= llvm::ParamAttr::ZExt;
230c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman      if (ParamAttrs)
231c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman        ParamAttrList.push_back(llvm::ParamAttrsWithIndex::get(i + increment,
232c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman                                                               ParamAttrs));
233c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman    }
234ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman  }
235c134fcb0d7989fe6937e47e6216637647e074aefEli Friedman
236ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman  F->setParamAttrs(llvm::PAListPtr::get(ParamAttrList.begin(),
237ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman                                        ParamAttrList.size()));
238ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman
239ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman  // Set the appropriate calling convention for the Function.
240ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman  if (FD->getAttr<FastCallAttr>())
241ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman    F->setCallingConv(llvm::CallingConv::Fast);
242ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman
243d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  SetGlobalValueAttributes(FD, F);
244ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman}
245ff4a2d9e2c1ddbf87e00e2a36ae341faf03eafb3Eli Friedman
246391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattnervoid CodeGenModule::EmitObjCMethod(const ObjCMethodDecl *OMD) {
247391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  // If this is not a prototype, emit the body.
248391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  if (OMD->getBody())
249391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner    CodeGenFunction(*this).GenerateObjCMethod(OMD);
250391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner}
25120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikovvoid CodeGenModule::EmitObjCProtocolImplementation(const ObjCProtocolDecl *PD){
25220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  llvm::SmallVector<std::string, 16> Protocols;
253780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner  for (ObjCProtocolDecl::protocol_iterator PI = PD->protocol_begin(),
254780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner       E = PD->protocol_end(); PI != E; ++PI)
255780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner    Protocols.push_back((*PI)->getName());
25620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  llvm::SmallVector<llvm::Constant*, 16> InstanceMethodNames;
25720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  llvm::SmallVector<llvm::Constant*, 16> InstanceMethodTypes;
25820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  for (ObjCProtocolDecl::instmeth_iterator iter = PD->instmeth_begin(),
259780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner       E = PD->instmeth_end(); iter != E; iter++) {
26020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    std::string TypeStr;
261780f329cb011bff0da5763e2e9744eec093d0509Chris Lattner    Context.getObjCEncodingForMethodDecl(*iter, TypeStr);
26220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    InstanceMethodNames.push_back(
26320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov        GetAddrOfConstantString((*iter)->getSelector().getName()));
26420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    InstanceMethodTypes.push_back(GetAddrOfConstantString(TypeStr));
26520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  }
26620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  // Collect information about class methods:
26720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  llvm::SmallVector<llvm::Constant*, 16> ClassMethodNames;
26820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  llvm::SmallVector<llvm::Constant*, 16> ClassMethodTypes;
26920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  for (ObjCProtocolDecl::classmeth_iterator iter = PD->classmeth_begin(),
27020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov      endIter = PD->classmeth_end() ; iter != endIter ; iter++) {
27120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    std::string TypeStr;
27220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    Context.getObjCEncodingForMethodDecl((*iter),TypeStr);
27320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    ClassMethodNames.push_back(
27420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov        GetAddrOfConstantString((*iter)->getSelector().getName()));
27520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    ClassMethodTypes.push_back(GetAddrOfConstantString(TypeStr));
27620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  }
27720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  Runtime->GenerateProtocol(PD->getName(), Protocols, InstanceMethodNames,
27820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov      InstanceMethodTypes, ClassMethodNames, ClassMethodTypes);
27920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov}
28020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov
28120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikovvoid CodeGenModule::EmitObjCCategoryImpl(const ObjCCategoryImplDecl *OCD) {
28220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov
28320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  // Collect information about instance methods
284a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner  llvm::SmallVector<Selector, 16> InstanceMethodSels;
28520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  llvm::SmallVector<llvm::Constant*, 16> InstanceMethodTypes;
28620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  for (ObjCCategoryDecl::instmeth_iterator iter = OCD->instmeth_begin(),
28720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov      endIter = OCD->instmeth_end() ; iter != endIter ; iter++) {
288a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner    InstanceMethodSels.push_back((*iter)->getSelector());
28920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    std::string TypeStr;
290fba676396703e87a5034e5f308aa30a633468f66Chris Lattner    Context.getObjCEncodingForMethodDecl(*iter,TypeStr);
29120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    InstanceMethodTypes.push_back(GetAddrOfConstantString(TypeStr));
29220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  }
29320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov
29420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  // Collect information about class methods
295a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner  llvm::SmallVector<Selector, 16> ClassMethodSels;
29620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  llvm::SmallVector<llvm::Constant*, 16> ClassMethodTypes;
29720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  for (ObjCCategoryDecl::classmeth_iterator iter = OCD->classmeth_begin(),
29820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov      endIter = OCD->classmeth_end() ; iter != endIter ; iter++) {
299a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner    ClassMethodSels.push_back((*iter)->getSelector());
30020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    std::string TypeStr;
301fba676396703e87a5034e5f308aa30a633468f66Chris Lattner    Context.getObjCEncodingForMethodDecl(*iter,TypeStr);
30220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    ClassMethodTypes.push_back(GetAddrOfConstantString(TypeStr));
30320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  }
30420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov
30520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  // Collect the names of referenced protocols
30620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  llvm::SmallVector<std::string, 16> Protocols;
3073db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner  const ObjCInterfaceDecl *ClassDecl = OCD->getClassInterface();
3083db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner  const ObjCList<ObjCProtocolDecl> &Protos =ClassDecl->getReferencedProtocols();
3093db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner  for (ObjCList<ObjCProtocolDecl>::iterator I = Protos.begin(),
3103db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner       E = Protos.end(); I != E; ++I)
3113db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner    Protocols.push_back((*I)->getName());
31220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov
31320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  // Generate the category
31420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  Runtime->GenerateCategory(OCD->getClassInterface()->getName(),
315a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner      OCD->getName(), InstanceMethodSels, InstanceMethodTypes,
316a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner      ClassMethodSels, ClassMethodTypes, Protocols);
31720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov}
31820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov
31920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikovvoid CodeGenModule::EmitObjCClassImplementation(
32020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    const ObjCImplementationDecl *OID) {
32120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  // Get the superclass name.
32220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  const ObjCInterfaceDecl * SCDecl = OID->getClassInterface()->getSuperClass();
32320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  const char * SCName = NULL;
32420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  if (SCDecl) {
32520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    SCName = SCDecl->getName();
32620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  }
32720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov
32820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  // Get the class name
32920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  ObjCInterfaceDecl * ClassDecl = (ObjCInterfaceDecl*)OID->getClassInterface();
33020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  const char * ClassName = ClassDecl->getName();
33120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov
33220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  // Get the size of instances.  For runtimes that support late-bound instances
33320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  // this should probably be something different (size just of instance
33420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  // varaibles in this class, not superclasses?).
33520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  int instanceSize = 0;
33620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  const llvm::Type *ObjTy;
33720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  if (!Runtime->LateBoundIVars()) {
33820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    ObjTy = getTypes().ConvertType(Context.getObjCInterfaceType(ClassDecl));
33920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    instanceSize = TheTargetData.getABITypeSize(ObjTy);
34020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  }
34120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov
34220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  // Collect information about instance variables.
34320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  llvm::SmallVector<llvm::Constant*, 16> IvarNames;
34420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  llvm::SmallVector<llvm::Constant*, 16> IvarTypes;
34520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  llvm::SmallVector<llvm::Constant*, 16> IvarOffsets;
34620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  const llvm::StructLayout *Layout =
34720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    TheTargetData.getStructLayout(cast<llvm::StructType>(ObjTy));
34820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  ObjTy = llvm::PointerType::getUnqual(ObjTy);
34920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  for (ObjCInterfaceDecl::ivar_iterator iter = ClassDecl->ivar_begin(),
35020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov      endIter = ClassDecl->ivar_end() ; iter != endIter ; iter++) {
35120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov      // Store the name
35220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov      IvarNames.push_back(GetAddrOfConstantString((*iter)->getName()));
35320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov      // Get the type encoding for this ivar
35420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov      std::string TypeStr;
35520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov      llvm::SmallVector<const RecordType *, 8> EncodingRecordTypes;
35620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov      Context.getObjCEncodingForType((*iter)->getType(), TypeStr,
35720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov                                     EncodingRecordTypes);
35820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov      IvarTypes.push_back(GetAddrOfConstantString(TypeStr));
35920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov      // Get the offset
36020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov      int offset =
36120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov        (int)Layout->getElementOffset(getTypes().getLLVMFieldNo(*iter));
36220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov      IvarOffsets.push_back(
36320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov          llvm::ConstantInt::get(llvm::Type::Int32Ty, offset));
36420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  }
36520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov
36620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  // Collect information about instance methods
367a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner  llvm::SmallVector<Selector, 16> InstanceMethodSels;
36820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  llvm::SmallVector<llvm::Constant*, 16> InstanceMethodTypes;
36920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  for (ObjCImplementationDecl::instmeth_iterator iter = OID->instmeth_begin(),
37020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov      endIter = OID->instmeth_end() ; iter != endIter ; iter++) {
371a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner    InstanceMethodSels.push_back((*iter)->getSelector());
37220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    std::string TypeStr;
37320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    Context.getObjCEncodingForMethodDecl((*iter),TypeStr);
37420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    InstanceMethodTypes.push_back(GetAddrOfConstantString(TypeStr));
37520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  }
37620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov
37720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  // Collect information about class methods
378a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner  llvm::SmallVector<Selector, 16> ClassMethodSels;
37920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  llvm::SmallVector<llvm::Constant*, 16> ClassMethodTypes;
38020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  for (ObjCImplementationDecl::classmeth_iterator iter = OID->classmeth_begin(),
38120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov      endIter = OID->classmeth_end() ; iter != endIter ; iter++) {
382a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner    ClassMethodSels.push_back((*iter)->getSelector());
38320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    std::string TypeStr;
38420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    Context.getObjCEncodingForMethodDecl((*iter),TypeStr);
38520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov    ClassMethodTypes.push_back(GetAddrOfConstantString(TypeStr));
38620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  }
38720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  // Collect the names of referenced protocols
38820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  llvm::SmallVector<std::string, 16> Protocols;
3893db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner  const ObjCList<ObjCProtocolDecl> &Protos =ClassDecl->getReferencedProtocols();
3903db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner  for (ObjCList<ObjCProtocolDecl>::iterator I = Protos.begin(),
3913db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner       E = Protos.end(); I != E; ++I)
3923db6cae19c236fe2cef343c90105ce7cca7de965Chris Lattner    Protocols.push_back((*I)->getName());
39320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov
39420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  // Generate the category
39520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  Runtime->GenerateClass(ClassName, SCName, instanceSize, IvarNames, IvarTypes,
396a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner                         IvarOffsets, InstanceMethodSels, InstanceMethodTypes,
397a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner                         ClassMethodSels, ClassMethodTypes, Protocols);
39820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov}
39920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov
4004c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begemanvoid CodeGenModule::EmitStatics() {
4014c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman  // Emit code for each used static decl encountered.  Since a previously unused
4024c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman  // static decl may become used during the generation of code for a static
4034c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman  // function, iterate until no changes are made.
4044c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman  bool Changed;
4054c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman  do {
4064c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman    Changed = false;
4074c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman    for (unsigned i = 0, e = StaticDecls.size(); i != e; ++i) {
408bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      const ValueDecl *D = StaticDecls[i];
4096f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman
4106f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman      // Check if we have used a decl with the same name
4116f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman      // FIXME: The AST should have some sort of aggregate decls or
4126f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman      // global symbol map.
413a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar      if (!GlobalDeclMap.count(D->getName()))
414a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar        continue;
4156f7e2eee917a136ffc36834f020782b3f15d8fa6Eli Friedman
416bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // Emit the definition.
417bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      EmitGlobalDefinition(D);
418bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
4194c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman      // Erase the used decl from the list.
4204c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman      StaticDecls[i] = StaticDecls.back();
4214c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman      StaticDecls.pop_back();
4224c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman      --i;
4234c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman      --e;
4244c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman
4254c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman      // Remember that we made a change.
4264c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman      Changed = true;
4274c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman    }
4284c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman  } while (Changed);
4295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4318bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// EmitAnnotateAttr - Generate the llvm::ConstantStruct which contains the
4328bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// annotation information for a given GlobalValue.  The annotation struct is
4338bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// {i8 *, i8 *, i8 *, i32}.  The first field is a constant expression, the
4343c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar/// GlobalValue being annotated.  The second field is the constant string
4358bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// created from the AnnotateAttr's annotation.  The third field is a constant
4368bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// string containing the name of the translation unit.  The fourth field is
4378bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// the line number in the file of the annotated value declaration.
4388bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman///
4398bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman/// FIXME: this does not unique the annotation string constants, as llvm-gcc
4408bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman///        appears to.
4418bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman///
4428bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begemanllvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV,
4438bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman                                                const AnnotateAttr *AA,
4448bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman                                                unsigned LineNo) {
4458bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  llvm::Module *M = &getModule();
4468bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman
4478bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  // get [N x i8] constants for the annotation string, and the filename string
4488bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  // which are the 2nd and 3rd elements of the global annotation structure.
4498bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  const llvm::Type *SBP = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
4508bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  llvm::Constant *anno = llvm::ConstantArray::get(AA->getAnnotation(), true);
4518bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  llvm::Constant *unit = llvm::ConstantArray::get(M->getModuleIdentifier(),
4528bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman                                                  true);
4538bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman
4548bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  // Get the two global values corresponding to the ConstantArrays we just
4558bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  // created to hold the bytes of the strings.
4568bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  llvm::GlobalValue *annoGV =
4578bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  new llvm::GlobalVariable(anno->getType(), false,
4588bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman                           llvm::GlobalValue::InternalLinkage, anno,
4598bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman                           GV->getName() + ".str", M);
4608bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  // translation unit name string, emitted into the llvm.metadata section.
4618bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  llvm::GlobalValue *unitGV =
4628bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  new llvm::GlobalVariable(unit->getType(), false,
4638bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman                           llvm::GlobalValue::InternalLinkage, unit, ".str", M);
4648bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman
4658bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  // Create the ConstantStruct that is the global annotion.
4668bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  llvm::Constant *Fields[4] = {
4678bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman    llvm::ConstantExpr::getBitCast(GV, SBP),
4688bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman    llvm::ConstantExpr::getBitCast(annoGV, SBP),
4698bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman    llvm::ConstantExpr::getBitCast(unitGV, SBP),
4708bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman    llvm::ConstantInt::get(llvm::Type::Int32Ty, LineNo)
4718bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  };
4728bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  return llvm::ConstantStruct::get(Fields, 4, false);
4738bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman}
4748bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman
475bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobal(const ValueDecl *Global) {
476bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  bool isDef, isStatic;
477bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
478bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Global)) {
479bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    isDef = (FD->isThisDeclarationADefinition() ||
480bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar             FD->getAttr<AliasAttr>());
481bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    isStatic = FD->getStorageClass() == FunctionDecl::Static;
482bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  } else if (const VarDecl *VD = cast<VarDecl>(Global)) {
483bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    assert(VD->isFileVarDecl() && "Cannot emit local var decl as global.");
484bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
485bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    isDef = !(VD->getStorageClass() == VarDecl::Extern && VD->getInit() == 0);
486bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    isStatic = VD->getStorageClass() == VarDecl::Static;
487bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  } else {
488bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    assert(0 && "Invalid argument to EmitGlobal");
4894c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman    return;
4904c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman  }
4914c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman
492bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  // Forward declarations are emitted lazily on first use.
493bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  if (!isDef)
49488a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner    return;
495bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
496bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  // If the global is a static, defer code generation until later so
497bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  // we can easily omit unused statics.
498bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  if (isStatic) {
499bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    StaticDecls.push_back(Global);
500bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    return;
501bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  }
502bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
503bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  // Otherwise emit the definition.
504bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  EmitGlobalDefinition(Global);
5054c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman}
5064c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman
507bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalDefinition(const ValueDecl *D) {
508bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
509bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    EmitGlobalFunctionDefinition(FD);
510bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  } else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
511bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    EmitGlobalVarDefinition(VD);
512bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  } else {
513bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    assert(0 && "Invalid argument to EmitGlobalDefinition()");
514bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  }
515bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar}
516bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
5179986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D) {
51877ba708819285931932ecd33691a672bb59d221aEli Friedman  assert(D->hasGlobalStorage() && "Not a global variable");
51977ba708819285931932ecd33691a672bb59d221aEli Friedman
520bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  QualType ASTTy = D->getType();
521bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  const llvm::Type *Ty = getTypes().ConvertTypeForMem(ASTTy);
5229986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar  const llvm::Type *PTy = llvm::PointerType::get(Ty, ASTTy.getAddressSpace());
523bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
5243c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  // Lookup the entry, lazily creating it if necessary.
5253c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  llvm::GlobalValue *&Entry = GlobalDeclMap[D->getName()];
5263c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  if (!Entry)
5273c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar    Entry = new llvm::GlobalVariable(Ty, false,
5283c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar                                     llvm::GlobalValue::ExternalLinkage,
5293c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar                                     0, D->getName(), &getModule(), 0,
5303c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar                                     ASTTy.getAddressSpace());
5313c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar
5329986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar  // Make sure the result is of the correct type.
5339986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar  return llvm::ConstantExpr::getBitCast(Entry, PTy);
534bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar}
535bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
536bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
5378f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner  llvm::Constant *Init = 0;
53877ba708819285931932ecd33691a672bb59d221aEli Friedman  QualType ASTTy = D->getType();
53977ba708819285931932ecd33691a672bb59d221aEli Friedman  const llvm::Type *VarTy = getTypes().ConvertTypeForMem(ASTTy);
54077ba708819285931932ecd33691a672bb59d221aEli Friedman
5418f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner  if (D->getInit() == 0) {
542cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    // This is a tentative definition; tentative definitions are
543cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    // implicitly initialized with { 0 }
544cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    const llvm::Type* InitTy;
545cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    if (ASTTy->isIncompleteArrayType()) {
546cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman      // An incomplete array is normally [ TYPE x 0 ], but we need
547cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman      // to fix it to [ TYPE x 1 ].
548cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman      const llvm::ArrayType* ATy = cast<llvm::ArrayType>(VarTy);
549cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman      InitTy = llvm::ArrayType::get(ATy->getElementType(), 1);
550cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    } else {
551cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman      InitTy = VarTy;
552cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    }
553cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    Init = llvm::Constant::getNullValue(InitTy);
55477ba708819285931932ecd33691a672bb59d221aEli Friedman  } else {
555bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    Init = EmitConstantExpr(D->getInit());
5568f32f7189b12f67aa4a19bc7c3855b599980eca0Chris Lattner  }
55777ba708819285931932ecd33691a672bb59d221aEli Friedman  const llvm::Type* InitType = Init->getType();
5588e53e720b3d7c962e91138a130dbd5d6c2def0e5Devang Patel
5593c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  llvm::GlobalValue *&Entry = GlobalDeclMap[D->getName()];
5603c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  llvm::GlobalVariable *GV = cast_or_null<llvm::GlobalVariable>(Entry);
5613c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar
56277ba708819285931932ecd33691a672bb59d221aEli Friedman  if (!GV) {
56377ba708819285931932ecd33691a672bb59d221aEli Friedman    GV = new llvm::GlobalVariable(InitType, false,
56477ba708819285931932ecd33691a672bb59d221aEli Friedman                                  llvm::GlobalValue::ExternalLinkage,
56577ba708819285931932ecd33691a672bb59d221aEli Friedman                                  0, D->getName(), &getModule(), 0,
56677ba708819285931932ecd33691a672bb59d221aEli Friedman                                  ASTTy.getAddressSpace());
5673c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  } else if (GV->getType() !=
5683c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar             llvm::PointerType::get(InitType, ASTTy.getAddressSpace())) {
56977ba708819285931932ecd33691a672bb59d221aEli Friedman    // We have a definition after a prototype with the wrong type.
57077ba708819285931932ecd33691a672bb59d221aEli Friedman    // We must make a new GlobalVariable* and update everything that used OldGV
57177ba708819285931932ecd33691a672bb59d221aEli Friedman    // (a declaration or tentative definition) with the new GlobalVariable*
57277ba708819285931932ecd33691a672bb59d221aEli Friedman    // (which will be a definition).
57377ba708819285931932ecd33691a672bb59d221aEli Friedman    //
57477ba708819285931932ecd33691a672bb59d221aEli Friedman    // This happens if there is a prototype for a global (e.g. "extern int x[];")
57577ba708819285931932ecd33691a672bb59d221aEli Friedman    // and then a definition of a different type (e.g. "int x[10];"). This also
57677ba708819285931932ecd33691a672bb59d221aEli Friedman    // happens when an initializer has a different type from the type of the
57777ba708819285931932ecd33691a672bb59d221aEli Friedman    // global (this happens with unions).
578cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    //
579cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    // FIXME: This also ends up happening if there's a definition followed by
580cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    // a tentative definition!  (Although Sema rejects that construct
581cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    // at the moment.)
58277ba708819285931932ecd33691a672bb59d221aEli Friedman
58377ba708819285931932ecd33691a672bb59d221aEli Friedman    // Save the old global
58477ba708819285931932ecd33691a672bb59d221aEli Friedman    llvm::GlobalVariable *OldGV = GV;
58577ba708819285931932ecd33691a672bb59d221aEli Friedman
58677ba708819285931932ecd33691a672bb59d221aEli Friedman    // Make a new global with the correct type
58777ba708819285931932ecd33691a672bb59d221aEli Friedman    GV = new llvm::GlobalVariable(InitType, false,
58877ba708819285931932ecd33691a672bb59d221aEli Friedman                                  llvm::GlobalValue::ExternalLinkage,
58977ba708819285931932ecd33691a672bb59d221aEli Friedman                                  0, D->getName(), &getModule(), 0,
59077ba708819285931932ecd33691a672bb59d221aEli Friedman                                  ASTTy.getAddressSpace());
59177ba708819285931932ecd33691a672bb59d221aEli Friedman    // Steal the name of the old global
59277ba708819285931932ecd33691a672bb59d221aEli Friedman    GV->takeName(OldGV);
59377ba708819285931932ecd33691a672bb59d221aEli Friedman
59477ba708819285931932ecd33691a672bb59d221aEli Friedman    // Replace all uses of the old global with the new global
59577ba708819285931932ecd33691a672bb59d221aEli Friedman    llvm::Constant *NewPtrForOldDecl =
59677ba708819285931932ecd33691a672bb59d221aEli Friedman        llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
59777ba708819285931932ecd33691a672bb59d221aEli Friedman    OldGV->replaceAllUsesWith(NewPtrForOldDecl);
59877ba708819285931932ecd33691a672bb59d221aEli Friedman
59977ba708819285931932ecd33691a672bb59d221aEli Friedman    // Erase the old global, since it is no longer used.
60077ba708819285931932ecd33691a672bb59d221aEli Friedman    OldGV->eraseFromParent();
60177ba708819285931932ecd33691a672bb59d221aEli Friedman  }
60277ba708819285931932ecd33691a672bb59d221aEli Friedman
6033c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  Entry = GV;
6049e32d4b4a7270a9701b7cb454381eeaa4cc42a77Devang Patel
6058bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  if (const AnnotateAttr *AA = D->getAttr<AnnotateAttr>()) {
6068bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman    SourceManager &SM = Context.getSourceManager();
6078bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman    AddAnnotation(EmitAnnotateAttr(GV, AA,
6088bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman                                   SM.getLogicalLineNumber(D->getLocation())));
6098bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman  }
6108bd4afeb876fd0015bb808eb2f3de1fe709658a7Nate Begeman
61188a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner  GV->setInitializer(Init);
612ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
613cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman  // FIXME: This is silly; getTypeAlign should just work for incomplete arrays
614cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman  unsigned Align;
615c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  if (const IncompleteArrayType* IAT =
616c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner        Context.getAsIncompleteArrayType(D->getType()))
617cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    Align = Context.getTypeAlign(IAT->getElementType());
618cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman  else
619cd5f4aaf0c219189878126d556f35e38fdb8afa1Eli Friedman    Align = Context.getTypeAlign(D->getType());
62008d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman  if (const AlignedAttr* AA = D->getAttr<AlignedAttr>()) {
62108d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman    Align = std::max(Align, AA->getAlignment());
62208d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman  }
62308d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman  GV->setAlignment(Align / 8);
62408d7802a406ee4a7cc18e8fce0c137b8c410ea7cEli Friedman
625ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  if (const VisibilityAttr *attr = D->getAttr<VisibilityAttr>())
6264f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    setVisibility(GV, attr->getVisibility());
627ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // FIXME: else handle -fvisibility
628a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar
629a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar  if (const AsmLabelAttr *ALA = D->getAttr<AsmLabelAttr>()) {
630a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar    // Prefaced with special LLVM marker to indicate that the name
631a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar    // should not be munged.
632a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar    GV->setName("\01" + ALA->getLabel());
633a735ad8be5536a1cd3e9817ec27dfeb2a0c1d5caDaniel Dunbar  }
63488a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner
63588a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner  // Set the llvm linkage type as appropriate.
6368fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner  if (D->getStorageClass() == VarDecl::Static)
6378fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner    GV->setLinkage(llvm::Function::InternalLinkage);
6388fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner  else if (D->getAttr<DLLImportAttr>())
639ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    GV->setLinkage(llvm::Function::DLLImportLinkage);
640ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  else if (D->getAttr<DLLExportAttr>())
641ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    GV->setLinkage(llvm::Function::DLLExportLinkage);
6428fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner  else if (D->getAttr<WeakAttr>())
643ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    GV->setLinkage(llvm::GlobalVariable::WeakLinkage);
6448fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner  else {
645ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    // FIXME: This isn't right.  This should handle common linkage and other
646ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    // stuff.
647ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    switch (D->getStorageClass()) {
6488fabd78f1976243cb223fb3e969c6f317d1ae44dChris Lattner    case VarDecl::Static: assert(0 && "This case handled above");
649ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    case VarDecl::Auto:
650ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    case VarDecl::Register:
651ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner      assert(0 && "Can't have auto or register globals");
652ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    case VarDecl::None:
653ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner      if (!D->getInit())
654a07b76419a03f126c22949dce2e546ba4df0e415Eli Friedman        GV->setLinkage(llvm::GlobalVariable::CommonLinkage);
655ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner      break;
656ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    case VarDecl::Extern:
657ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    case VarDecl::PrivateExtern:
658ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner      // todo: common
659ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner      break;
660ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    }
66188a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner  }
662686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta
663686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta  // Emit global variable debug information.
664686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta  CGDebugInfo *DI = getDebugInfo();
665686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta  if(DI) {
666686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta    if(D->getLocation().isValid())
667686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta      DI->setLocation(D->getLocation());
668686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta    DI->EmitGlobalVariable(GV, D);
669686226b538e72c5059ab7c9a8f87eb883193b645Sanjiv Gupta  }
67088a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner}
6715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
672bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarllvm::GlobalValue *
673bd012ff1fa088181646a784f385b28867372d434Daniel DunbarCodeGenModule::EmitForwardFunctionDefinition(const FunctionDecl *D) {
674bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  // FIXME: param attributes for sext/zext etc.
675bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  if (const AliasAttr *AA = D->getAttr<AliasAttr>()) {
676bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    assert(!D->getBody() && "Unexpected alias attr on function with body.");
677bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
678bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    const std::string& aliaseeName = AA->getAliasee();
679bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    llvm::Function *aliasee = getModule().getFunction(aliaseeName);
680bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    llvm::GlobalValue *alias = new llvm::GlobalAlias(aliasee->getType(),
681bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar                                              llvm::Function::ExternalLinkage,
682bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar                                                     D->getName(),
683bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar                                                     aliasee,
684bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar                                                     &getModule());
685bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    SetGlobalValueAttributes(D, alias);
686bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    return alias;
687bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  } else {
688bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    const llvm::Type *Ty = getTypes().ConvertType(D->getType());
689bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    const llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty);
690bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    llvm::Function *F = llvm::Function::Create(FTy,
691bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar                                               llvm::Function::ExternalLinkage,
692bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar                                               D->getName(), &getModule());
693bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
694bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    SetFunctionAttributes(D, F, FTy);
695bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    return F;
696bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  }
697bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar}
698bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
699bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarllvm::Constant *CodeGenModule::GetAddrOfFunction(const FunctionDecl *D) {
7009986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar  QualType ASTTy = D->getType();
7019986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar  const llvm::Type *Ty = getTypes().ConvertTypeForMem(ASTTy);
7029986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar  const llvm::Type *PTy = llvm::PointerType::get(Ty, ASTTy.getAddressSpace());
7033c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar
7043c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  // Lookup the entry, lazily creating it if necessary.
7053c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  llvm::GlobalValue *&Entry = GlobalDeclMap[D->getName()];
7063c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  if (!Entry)
7073c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar    Entry = EmitForwardFunctionDefinition(D);
708bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
7099986eabd4423d867262c358ca62f94a60ac58412Daniel Dunbar  return llvm::ConstantExpr::getBitCast(Entry, PTy);
710bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar}
711bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
712bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenModule::EmitGlobalFunctionDefinition(const FunctionDecl *D) {
7133c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  llvm::GlobalValue *&Entry = GlobalDeclMap[D->getName()];
7143c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar  if (!Entry) {
715bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    Entry = EmitForwardFunctionDefinition(D);
716bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  } else {
7173c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar    // If the types mismatch then we have to rewrite the definition.
7183c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar    const llvm::Type *Ty = getTypes().ConvertType(D->getType());
7193c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar    if (Entry->getType() != llvm::PointerType::getUnqual(Ty)) {
720bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // Otherwise, we have a definition after a prototype with the wrong type.
721bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // F is the Function* for the one with the wrong type, we must make a new
722bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // Function* and update everything that used F (a declaration) with the new
723bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // Function* (which will be a definition).
724bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      //
725bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // This happens if there is a prototype for a function (e.g. "int f()") and
726bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // then a definition of a different type (e.g. "int f(int x)").  Start by
727bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // making a new function of the correct type, RAUW, then steal the name.
7283c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar      llvm::GlobalValue *NewFn = EmitForwardFunctionDefinition(D);
7293c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar      NewFn->takeName(Entry);
730bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
731bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // Replace uses of F with the Function we will endow with a body.
732bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      llvm::Constant *NewPtrForOldDecl =
7333c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar        llvm::ConstantExpr::getBitCast(NewFn, Entry->getType());
7343c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar      Entry->replaceAllUsesWith(NewPtrForOldDecl);
7353c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar
736bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      // Ok, delete the old function now, which is dead.
7373c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar      // FIXME: Add GlobalValue->eraseFromParent().
7383c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar      assert(Entry->isDeclaration() && "Shouldn't replace non-declaration");
7393c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar      if (llvm::Function *F = dyn_cast<llvm::Function>(Entry)) {
7403c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar        F->eraseFromParent();
7413c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar      } else if (llvm::GlobalAlias *GA = dyn_cast<llvm::GlobalAlias>(Entry)) {
7423c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar        GA->eraseFromParent();
7433c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar      } else {
7443c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar        assert(0 && "Invalid global variable type.");
7453c827a79cb7d04c255db8080e682ee2c6912373dDaniel Dunbar      }
746bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
747bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar      Entry = NewFn;
748bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    }
749bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  }
750bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
751bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  if (D->getAttr<AliasAttr>()) {
752bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    ;
753bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  } else {
754bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    llvm::Function *Fn = cast<llvm::Function>(Entry);
755bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar    CodeGenFunction(*this).GenerateCode(D, Fn);
7566bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar
7576379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar    // Set attributes specific to definition.
7586379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar    // FIXME: This needs to be cleaned up by clearly emitting the
7596379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar    // declaration / definition at separate times.
7606379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar    if (!Features.Exceptions)
7616379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar      Fn->addParamAttr(0, llvm::ParamAttr::NoUnwind);
7626379a7a15335e0af543a942efe9cfd514a83dab8Daniel Dunbar
7636bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar    if (const ConstructorAttr *CA = D->getAttr<ConstructorAttr>()) {
7646bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar      AddGlobalCtor(Fn, CA->getPriority());
7656bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar    } else if (const DestructorAttr *DA = D->getAttr<DestructorAttr>()) {
7666bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar      AddGlobalDtor(Fn, DA->getPriority());
7676bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar    }
768bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar  }
769bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar}
770bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar
771c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattnervoid CodeGenModule::UpdateCompletedType(const TagDecl *TD) {
772c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattner  // Make sure that this type is translated.
773c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattner  Types.UpdateCompletedType(TD);
774d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner}
775d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner
776d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner
777bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner/// getBuiltinLibFunction
778bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattnerllvm::Function *CodeGenModule::getBuiltinLibFunction(unsigned BuiltinID) {
7791426fecdf90dd1986751b9940422e675880ff671Chris Lattner  if (BuiltinID > BuiltinFunctions.size())
7801426fecdf90dd1986751b9940422e675880ff671Chris Lattner    BuiltinFunctions.resize(BuiltinID);
781bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner
7821426fecdf90dd1986751b9940422e675880ff671Chris Lattner  // Cache looked up functions.  Since builtin id #0 is invalid we don't reserve
7831426fecdf90dd1986751b9940422e675880ff671Chris Lattner  // a slot for it.
7841426fecdf90dd1986751b9940422e675880ff671Chris Lattner  assert(BuiltinID && "Invalid Builtin ID");
7851426fecdf90dd1986751b9940422e675880ff671Chris Lattner  llvm::Function *&FunctionSlot = BuiltinFunctions[BuiltinID-1];
786bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  if (FunctionSlot)
787bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner    return FunctionSlot;
788bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner
789bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  assert(Context.BuiltinInfo.isLibFunction(BuiltinID) && "isn't a lib fn");
790bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner
791bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  // Get the name, skip over the __builtin_ prefix.
792bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  const char *Name = Context.BuiltinInfo.GetName(BuiltinID)+10;
793bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner
794bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  // Get the type for the builtin.
795bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  QualType Type = Context.BuiltinInfo.GetBuiltinType(BuiltinID, Context);
796bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  const llvm::FunctionType *Ty =
797bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner    cast<llvm::FunctionType>(getTypes().ConvertType(Type));
798bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner
799bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  // FIXME: This has a serious problem with code like this:
800bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  //  void abs() {}
801bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  //    ... __builtin_abs(x);
802bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  // The two versions of abs will collide.  The fix is for the builtin to win,
803bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  // and for the existing one to be turned into a constantexpr cast of the
804bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  // builtin.  In the case where the existing one is a static function, it
805bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  // should just be renamed.
806c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner  if (llvm::Function *Existing = getModule().getFunction(Name)) {
807c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner    if (Existing->getFunctionType() == Ty && Existing->hasExternalLinkage())
808c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner      return FunctionSlot = Existing;
809c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner    assert(Existing == 0 && "FIXME: Name collision");
810c5e940fa551840ecd71e8116c316c9131490f5faChris Lattner  }
811bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner
812bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner  // FIXME: param attributes for sext/zext etc.
8134c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman  return FunctionSlot =
8144c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman    llvm::Function::Create(Ty, llvm::Function::ExternalLinkage, Name,
8154c13b7a3973d2d263d9682d7b68fbfeb76334af5Nate Begeman                           &getModule());
816bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner}
817bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner
8187acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattnerllvm::Function *CodeGenModule::getIntrinsic(unsigned IID,const llvm::Type **Tys,
8197acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner                                            unsigned NumTys) {
8207acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner  return llvm::Intrinsic::getDeclaration(&getModule(),
8217acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner                                         (llvm::Intrinsic::ID)IID, Tys, NumTys);
8227acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner}
823bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattner
8245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerllvm::Function *CodeGenModule::getMemCpyFn() {
8255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (MemCpyFn) return MemCpyFn;
8265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::Intrinsic::ID IID;
827f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  switch (Context.Target.getPointerWidth(0)) {
8285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default: assert(0 && "Unknown ptr width");
8295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case 32: IID = llvm::Intrinsic::memcpy_i32; break;
8305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case 64: IID = llvm::Intrinsic::memcpy_i64; break;
8315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
8327acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner  return MemCpyFn = getIntrinsic(IID);
8335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
834c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
8350c99509927a0c7a48490486b9fec287b63e5c09cEli Friedmanllvm::Function *CodeGenModule::getMemMoveFn() {
8360c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman  if (MemMoveFn) return MemMoveFn;
8370c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman  llvm::Intrinsic::ID IID;
8380c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman  switch (Context.Target.getPointerWidth(0)) {
8390c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman  default: assert(0 && "Unknown ptr width");
8400c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman  case 32: IID = llvm::Intrinsic::memmove_i32; break;
8410c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman  case 64: IID = llvm::Intrinsic::memmove_i64; break;
8420c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman  }
8430c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman  return MemMoveFn = getIntrinsic(IID);
8440c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman}
8450c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman
84641ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venanciollvm::Function *CodeGenModule::getMemSetFn() {
84741ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio  if (MemSetFn) return MemSetFn;
84841ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio  llvm::Intrinsic::ID IID;
849f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  switch (Context.Target.getPointerWidth(0)) {
85041ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio  default: assert(0 && "Unknown ptr width");
85141ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio  case 32: IID = llvm::Intrinsic::memset_i32; break;
85241ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio  case 64: IID = llvm::Intrinsic::memset_i64; break;
85341ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio  }
85441ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio  return MemSetFn = getIntrinsic(IID);
85541ef30e869d3f4940437503eb6a2cf70819fdb08Lauro Ramos Venancio}
8567acda7c4a0e4aec6c003b3169ca45a5f3bc7e033Chris Lattner
85720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov// FIXME: This needs moving into an Apple Objective-C runtime class
858bef20ac367a09555b30d6eb3847a81ec164caf88Chris Lattnerllvm::Constant *CodeGenModule::
859bef20ac367a09555b30d6eb3847a81ec164caf88Chris LattnerGetAddrOfConstantCFString(const std::string &str) {
860c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  llvm::StringMapEntry<llvm::Constant *> &Entry =
861c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson    CFConstantStringMap.GetOrCreateValue(&str[0], &str[str.length()]);
862c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
863c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  if (Entry.getValue())
864c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson    return Entry.getValue();
865c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
866c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  std::vector<llvm::Constant*> Fields;
867c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
868c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  if (!CFConstantStringClassRef) {
869c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson    const llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy);
870c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson    Ty = llvm::ArrayType::get(Ty, 0);
871c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
872c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson    CFConstantStringClassRef =
873c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson      new llvm::GlobalVariable(Ty, false,
874c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson                               llvm::GlobalVariable::ExternalLinkage, 0,
875c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson                               "__CFConstantStringClassReference",
876c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson                               &getModule());
877c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  }
878c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
879c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  // Class pointer.
880c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  llvm::Constant *Zero = llvm::Constant::getNullValue(llvm::Type::Int32Ty);
881c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  llvm::Constant *Zeros[] = { Zero, Zero };
882c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  llvm::Constant *C =
883c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson    llvm::ConstantExpr::getGetElementPtr(CFConstantStringClassRef, Zeros, 2);
884c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  Fields.push_back(C);
885c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
886c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  // Flags.
887c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  const llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy);
888c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  Fields.push_back(llvm::ConstantInt::get(Ty, 1992));
889c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
890c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  // String pointer.
891c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  C = llvm::ConstantArray::get(str);
892c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  C = new llvm::GlobalVariable(C->getType(), true,
893c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson                               llvm::GlobalValue::InternalLinkage,
894c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson                               C, ".str", &getModule());
895c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
896c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  C = llvm::ConstantExpr::getGetElementPtr(C, Zeros, 2);
897c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  Fields.push_back(C);
898c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
899c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  // String length.
900c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  Ty = getTypes().ConvertType(getContext().LongTy);
901c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  Fields.push_back(llvm::ConstantInt::get(Ty, str.length()));
902c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson
903c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  // The struct.
904c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  Ty = getTypes().ConvertType(getContext().getCFConstantStringType());
905c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson  C = llvm::ConstantStruct::get(cast<llvm::StructType>(Ty), Fields);
9060c67829763b98bc670062b553897a851fab17401Anders Carlsson  llvm::GlobalVariable *GV =
9070c67829763b98bc670062b553897a851fab17401Anders Carlsson    new llvm::GlobalVariable(C->getType(), true,
9080c67829763b98bc670062b553897a851fab17401Anders Carlsson                             llvm::GlobalVariable::InternalLinkage,
9090c67829763b98bc670062b553897a851fab17401Anders Carlsson                             C, "", &getModule());
9100c67829763b98bc670062b553897a851fab17401Anders Carlsson  GV->setSection("__DATA,__cfstring");
9110c67829763b98bc670062b553897a851fab17401Anders Carlsson  Entry.setValue(GV);
9120c67829763b98bc670062b553897a851fab17401Anders Carlsson  return GV;
913c9e2091efcb535110474434dd12015afdc3b1637Anders Carlsson}
91445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner
9151e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar/// getStringForStringLiteral - Return the appropriate bytes for a
9161e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar/// string literal, properly padded to match the literal type.
9171e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbarstd::string CodeGenModule::getStringForStringLiteral(const StringLiteral *E) {
9181e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  assert(!E->isWide() && "FIXME: Wide strings not supported yet!");
9191e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  const char *StrData = E->getStrData();
9201e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  unsigned Len = E->getByteLength();
9211e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar
9221e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  const ConstantArrayType *CAT =
9231e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar    getContext().getAsConstantArrayType(E->getType());
9241e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  assert(CAT && "String isn't pointer or array!");
9251e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar
9261e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  // Resize the string to the right size
9271e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  // FIXME: What about wchar_t strings?
9281e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  std::string Str(StrData, StrData+Len);
9291e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  uint64_t RealLen = CAT->getSize().getZExtValue();
9301e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  Str.resize(RealLen, '\0');
9311e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar
9321e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  return Str;
9331e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar}
9341e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar
935a7ad98ff0919d6a24ea7c46634ea29bea551c1a0Chris Lattner/// GenerateWritableString -- Creates storage for a string literal.
93645e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattnerstatic llvm::Constant *GenerateStringLiteral(const std::string &str,
93745e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner                                             bool constant,
9382c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner                                             CodeGenModule &CGM) {
93945e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  // Create Constant for this string literal
9401e04976fc2611d8cc06986a81deed4c42183b870Daniel Dunbar  llvm::Constant *C = llvm::ConstantArray::get(str);
94145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner
94245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  // Create a global variable for this string
94345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  C = new llvm::GlobalVariable(C->getType(), constant,
94445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner                               llvm::GlobalValue::InternalLinkage,
9452c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner                               C, ".str", &CGM.getModule());
94645e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  return C;
94745e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner}
94845e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner
949a7ad98ff0919d6a24ea7c46634ea29bea551c1a0Chris Lattner/// CodeGenModule::GetAddrOfConstantString -- returns a pointer to the character
950a7ad98ff0919d6a24ea7c46634ea29bea551c1a0Chris Lattner/// array containing the literal.  The result is pointer to array type.
95145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattnerllvm::Constant *CodeGenModule::GetAddrOfConstantString(const std::string &str) {
95245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  // Don't share any string literals if writable-strings is turned on.
95345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  if (Features.WritableStrings)
95445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner    return GenerateStringLiteral(str, false, *this);
95545e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner
95645e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  llvm::StringMapEntry<llvm::Constant *> &Entry =
95745e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  ConstantStringMap.GetOrCreateValue(&str[0], &str[str.length()]);
95845e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner
95945e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  if (Entry.getValue())
96045e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner      return Entry.getValue();
96145e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner
96245e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  // Create a global variable for this.
96345e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  llvm::Constant *C = GenerateStringLiteral(str, true, *this);
96445e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  Entry.setValue(C);
96545e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner  return C;
96645e8cbdce25c2e16c7aac2036a591f6190097ae6Chris Lattner}
967