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