Automatic Reference Counting.
Language-design credit goes to a lot of people, but I particularly want to single out Blaine Garst and Patrick Beard for their contributions. Compiler implementation credit goes to Argyrios, Doug, Fariborz, and myself, in no particular order. llvm-svn: 133103
This commit is contained in:
@@ -64,7 +64,7 @@ CodeGenModule::CodeGenModule(ASTContext &C, const CodeGenOptions &CGO,
|
||||
ABI(createCXXABI(*this)),
|
||||
Types(C, M, TD, getTargetCodeGenInfo().getABIInfo(), ABI),
|
||||
TBAA(0),
|
||||
VTables(*this), Runtime(0), DebugInfo(0),
|
||||
VTables(*this), Runtime(0), DebugInfo(0), ARCData(0), RRData(0),
|
||||
CFConstantStringClassRef(0), ConstantStringClassRef(0),
|
||||
VMContext(M.getContext()),
|
||||
NSConcreteGlobalBlockDecl(0), NSConcreteStackBlockDecl(0),
|
||||
@@ -88,6 +88,10 @@ CodeGenModule::CodeGenModule(ASTContext &C, const CodeGenOptions &CGO,
|
||||
|
||||
Block.GlobalUniqueCount = 0;
|
||||
|
||||
if (C.getLangOptions().ObjCAutoRefCount)
|
||||
ARCData = new ARCEntrypoints();
|
||||
RRData = new RREntrypoints();
|
||||
|
||||
// Initialize the type cache.
|
||||
llvm::LLVMContext &LLVMContext = M.getContext();
|
||||
VoidTy = llvm::Type::getVoidTy(LLVMContext);
|
||||
@@ -108,6 +112,8 @@ CodeGenModule::~CodeGenModule() {
|
||||
delete &ABI;
|
||||
delete TBAA;
|
||||
delete DebugInfo;
|
||||
delete ARCData;
|
||||
delete RRData;
|
||||
}
|
||||
|
||||
void CodeGenModule::createObjCRuntime() {
|
||||
@@ -830,7 +836,8 @@ void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD) {
|
||||
llvm::Constant *
|
||||
CodeGenModule::GetOrCreateLLVMFunction(llvm::StringRef MangledName,
|
||||
const llvm::Type *Ty,
|
||||
GlobalDecl D, bool ForVTable) {
|
||||
GlobalDecl D, bool ForVTable,
|
||||
llvm::Attributes ExtraAttrs) {
|
||||
// Lookup the entry, lazily creating it if necessary.
|
||||
llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
|
||||
if (Entry) {
|
||||
@@ -869,6 +876,8 @@ CodeGenModule::GetOrCreateLLVMFunction(llvm::StringRef MangledName,
|
||||
assert(F->getName() == MangledName && "name was uniqued!");
|
||||
if (D.getDecl())
|
||||
SetFunctionAttributes(D, F, IsIncompleteFunction);
|
||||
if (ExtraAttrs != llvm::Attribute::None)
|
||||
F->addFnAttr(ExtraAttrs);
|
||||
|
||||
// This is the first use or definition of a mangled name. If there is a
|
||||
// deferred decl with this name, remember that we need to emit it at the end
|
||||
@@ -937,8 +946,10 @@ llvm::Constant *CodeGenModule::GetAddrOfFunction(GlobalDecl GD,
|
||||
/// type and name.
|
||||
llvm::Constant *
|
||||
CodeGenModule::CreateRuntimeFunction(const llvm::FunctionType *FTy,
|
||||
llvm::StringRef Name) {
|
||||
return GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(), /*ForVTable=*/false);
|
||||
llvm::StringRef Name,
|
||||
llvm::Attributes ExtraAttrs) {
|
||||
return GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(), /*ForVTable=*/false,
|
||||
ExtraAttrs);
|
||||
}
|
||||
|
||||
static bool DeclIsConstantGlobal(ASTContext &Context, const VarDecl *D,
|
||||
@@ -1997,6 +2008,7 @@ void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
|
||||
false, true, false, ObjCMethodDecl::Required);
|
||||
D->addInstanceMethod(DTORMethod);
|
||||
CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod, false);
|
||||
D->setHasCXXStructors(true);
|
||||
}
|
||||
|
||||
// If the implementation doesn't have any ivar initializers, we don't need
|
||||
@@ -2015,6 +2027,7 @@ void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
|
||||
ObjCMethodDecl::Required);
|
||||
D->addInstanceMethod(CTORMethod);
|
||||
CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod, true);
|
||||
D->setHasCXXStructors(true);
|
||||
}
|
||||
|
||||
/// EmitNamespace - Emit all declarations in a namespace.
|
||||
|
||||
Reference in New Issue
Block a user