diff options
Diffstat (limited to 'lib/CodeGen/CGObjCGNU.cpp')
| -rw-r--r-- | lib/CodeGen/CGObjCGNU.cpp | 171 | 
1 files changed, 86 insertions, 85 deletions
| diff --git a/lib/CodeGen/CGObjCGNU.cpp b/lib/CodeGen/CGObjCGNU.cpp index c0dc3b8002d8..1580c777ea47 100644 --- a/lib/CodeGen/CGObjCGNU.cpp +++ b/lib/CodeGen/CGObjCGNU.cpp @@ -46,54 +46,49 @@ namespace {  /// avoids constructing the type more than once if it's used more than once.  class LazyRuntimeFunction {    CodeGenModule *CGM; -  std::vector<llvm::Type*> ArgTys; +  llvm::FunctionType *FTy;    const char *FunctionName;    llvm::Constant *Function; -  public: -    /// Constructor leaves this class uninitialized, because it is intended to -    /// be used as a field in another class and not all of the types that are -    /// used as arguments will necessarily be available at construction time. -    LazyRuntimeFunction() -      : CGM(nullptr), FunctionName(nullptr), Function(nullptr) {} -    /// Initialises the lazy function with the name, return type, and the types -    /// of the arguments. -    LLVM_END_WITH_NULL -    void init(CodeGenModule *Mod, const char *name, -        llvm::Type *RetTy, ...) { -       CGM =Mod; -       FunctionName = name; -       Function = nullptr; -       ArgTys.clear(); -       va_list Args; -       va_start(Args, RetTy); -         while (llvm::Type *ArgTy = va_arg(Args, llvm::Type*)) -           ArgTys.push_back(ArgTy); -       va_end(Args); -       // Push the return type on at the end so we can pop it off easily -       ArgTys.push_back(RetTy); -   } -   /// Overloaded cast operator, allows the class to be implicitly cast to an -   /// LLVM constant. -   operator llvm::Constant*() { -     if (!Function) { -       if (!FunctionName) return nullptr; -       // We put the return type on the end of the vector, so pop it back off -       llvm::Type *RetTy = ArgTys.back(); -       ArgTys.pop_back(); -       llvm::FunctionType *FTy = llvm::FunctionType::get(RetTy, ArgTys, false); -       Function = -         cast<llvm::Constant>(CGM->CreateRuntimeFunction(FTy, FunctionName)); -       // We won't need to use the types again, so we may as well clean up the -       // vector now -       ArgTys.resize(0); -     } -     return Function; -   } -   operator llvm::Function*() { -     return cast<llvm::Function>((llvm::Constant*)*this); -   } +public: +  /// Constructor leaves this class uninitialized, because it is intended to +  /// be used as a field in another class and not all of the types that are +  /// used as arguments will necessarily be available at construction time. +  LazyRuntimeFunction() +      : CGM(nullptr), FunctionName(nullptr), Function(nullptr) {} +  /// Initialises the lazy function with the name, return type, and the types +  /// of the arguments. +  LLVM_END_WITH_NULL +  void init(CodeGenModule *Mod, const char *name, llvm::Type *RetTy, ...) { +    CGM = Mod; +    FunctionName = name; +    Function = nullptr; +    std::vector<llvm::Type *> ArgTys; +    va_list Args; +    va_start(Args, RetTy); +    while (llvm::Type *ArgTy = va_arg(Args, llvm::Type *)) +      ArgTys.push_back(ArgTy); +    va_end(Args); +    FTy = llvm::FunctionType::get(RetTy, ArgTys, false); +  } + +  llvm::FunctionType *getType() { return FTy; } + +  /// Overloaded cast operator, allows the class to be implicitly cast to an +  /// LLVM constant. +  operator llvm::Constant *() { +    if (!Function) { +      if (!FunctionName) +        return nullptr; +      Function = +          cast<llvm::Constant>(CGM->CreateRuntimeFunction(FTy, FunctionName)); +    } +    return Function; +  } +  operator llvm::Function *() { +    return cast<llvm::Function>((llvm::Constant *)*this); +  }  }; @@ -171,8 +166,9 @@ protected:    /// where the C code specifies const char*.      llvm::Constant *MakeConstantString(const std::string &Str,                                       const std::string &Name="") { -    llvm::Constant *ConstStr = CGM.GetAddrOfConstantCString(Str, Name.c_str()); -    return llvm::ConstantExpr::getGetElementPtr(ConstStr, Zeros); +    auto *ConstStr = CGM.GetAddrOfConstantCString(Str, Name.c_str()); +    return llvm::ConstantExpr::getGetElementPtr(ConstStr->getValueType(), +                                                ConstStr, Zeros);    }    /// Emits a linkonce_odr string, whose name is the prefix followed by the    /// string value.  This allows the linker to combine the strings between @@ -181,13 +177,14 @@ protected:    llvm::Constant *ExportUniqueString(const std::string &Str,                                       const std::string prefix) {      std::string name = prefix + Str; -    llvm::Constant *ConstStr = TheModule.getGlobalVariable(name); +    auto *ConstStr = TheModule.getGlobalVariable(name);      if (!ConstStr) {        llvm::Constant *value = llvm::ConstantDataArray::getString(VMContext,Str);        ConstStr = new llvm::GlobalVariable(TheModule, value->getType(), true,                llvm::GlobalValue::LinkOnceODRLinkage, value, prefix + Str);      } -    return llvm::ConstantExpr::getGetElementPtr(ConstStr, Zeros); +    return llvm::ConstantExpr::getGetElementPtr(ConstStr->getValueType(), +                                                ConstStr, Zeros);    }    /// Generates a global structure, initialized by the elements in the vector.    /// The element types must match the types of the structure elements in the @@ -237,8 +234,9 @@ protected:        NameAndAttributes += TypeStr;        NameAndAttributes += '\0';        NameAndAttributes += PD->getNameAsString(); -      return llvm::ConstantExpr::getGetElementPtr( -          CGM.GetAddrOfConstantCString(NameAndAttributes), Zeros); +      auto *ConstStr = CGM.GetAddrOfConstantCString(NameAndAttributes); +      return llvm::ConstantExpr::getGetElementPtr(ConstStr->getValueType(), +                                                  ConstStr, Zeros);      }      return MakeConstantString(PD->getNameAsString());    } @@ -672,8 +670,8 @@ class CGObjCGNUstep : public CGObjCGNU {        slot->setMetadata(msgSendMDKind, node);        // Load the imp from the slot -      llvm::Value *imp = -        Builder.CreateLoad(Builder.CreateStructGEP(slot.getInstruction(), 4)); +      llvm::Value *imp = Builder.CreateLoad( +          Builder.CreateStructGEP(nullptr, slot.getInstruction(), 4));        // The lookup function may have changed the receiver, so make sure we use        // the new one. @@ -690,7 +688,7 @@ class CGObjCGNUstep : public CGObjCGNU {          CGF.EmitNounwindRuntimeCall(SlotLookupSuperFn, lookupArgs);        slot->setOnlyReadsMemory(); -      return Builder.CreateLoad(Builder.CreateStructGEP(slot, 4)); +      return Builder.CreateLoad(Builder.CreateStructGEP(nullptr, slot, 4));      }    public:      CGObjCGNUstep(CodeGenModule &Mod) : CGObjCGNU(Mod, 9, 3) { @@ -1013,7 +1011,7 @@ CGObjCGNU::CGObjCGNU(CodeGenModule &cgm, unsigned runtimeABIVersion,  llvm::Value *CGObjCGNU::GetClassNamed(CodeGenFunction &CGF,                                        const std::string &Name,                                        bool isWeak) { -  llvm::Value *ClassName = CGM.GetAddrOfConstantCString(Name); +  llvm::GlobalVariable *ClassNameGV = CGM.GetAddrOfConstantCString(Name);    // With the incompatible ABI, this will need to be replaced with a direct    // reference to the class symbol.  For the compatible nonfragile ABI we are    // still performing this lookup at run time but emitting the symbol for the @@ -1023,7 +1021,8 @@ llvm::Value *CGObjCGNU::GetClassNamed(CodeGenFunction &CGF,    // with memoized versions or with static references if it's safe to do so.    if (!isWeak)      EmitClassRef(Name); -  ClassName = CGF.Builder.CreateStructGEP(ClassName, 0); +  llvm::Value *ClassName = +      CGF.Builder.CreateStructGEP(ClassNameGV->getValueType(), ClassNameGV, 0);    llvm::Constant *ClassLookupFn =      CGM.CreateRuntimeFunction(llvm::FunctionType::get(IdTy, PtrToInt8Ty, true), @@ -1056,7 +1055,7 @@ llvm::Value *CGObjCGNU::GetSelector(CodeGenFunction &CGF, Selector Sel,    }    if (!SelValue) {      SelValue = llvm::GlobalAlias::create( -        SelectorTy->getElementType(), 0, llvm::GlobalValue::PrivateLinkage, +        SelectorTy, llvm::GlobalValue::PrivateLinkage,          ".objc_selector_" + Sel.getAsString(), &TheModule);      Types.push_back(TypedSelector(TypeEncoding, SelValue));    } @@ -1143,21 +1142,22 @@ llvm::Constant *CGObjCGNUstep::GetEHType(QualType T) {    // It's quite ugly hard-coding this.  Ideally we'd generate it using the host    // platform's name mangling.    const char *vtableName = "_ZTVN7gnustep7libobjc22__objc_class_type_infoE"; -  llvm::Constant *Vtable = TheModule.getGlobalVariable(vtableName); +  auto *Vtable = TheModule.getGlobalVariable(vtableName);    if (!Vtable) {      Vtable = new llvm::GlobalVariable(TheModule, PtrToInt8Ty, true,                                        llvm::GlobalValue::ExternalLinkage,                                        nullptr, vtableName);    }    llvm::Constant *Two = llvm::ConstantInt::get(IntTy, 2); -  Vtable = llvm::ConstantExpr::getGetElementPtr(Vtable, Two); -  Vtable = llvm::ConstantExpr::getBitCast(Vtable, PtrToInt8Ty); +  auto *BVtable = llvm::ConstantExpr::getBitCast( +      llvm::ConstantExpr::getGetElementPtr(Vtable->getValueType(), Vtable, Two), +      PtrToInt8Ty);    llvm::Constant *typeName =      ExportUniqueString(className, "__objc_eh_typename_");    std::vector<llvm::Constant*> fields; -  fields.push_back(Vtable); +  fields.push_back(BVtable);    fields.push_back(typeName);    llvm::Constant *TI =         MakeGlobal(llvm::StructType::get(PtrToInt8Ty, PtrToInt8Ty, @@ -1261,25 +1261,25 @@ CGObjCGNU::GenerateMessageSendSuper(CodeGenFunction &CGF,      if (IsClassMessage)  {        if (!MetaClassPtrAlias) {          MetaClassPtrAlias = llvm::GlobalAlias::create( -            IdTy->getElementType(), 0, llvm::GlobalValue::InternalLinkage, +            IdTy, llvm::GlobalValue::InternalLinkage,              ".objc_metaclass_ref" + Class->getNameAsString(), &TheModule);        }        ReceiverClass = MetaClassPtrAlias;      } else {        if (!ClassPtrAlias) {          ClassPtrAlias = llvm::GlobalAlias::create( -            IdTy->getElementType(), 0, llvm::GlobalValue::InternalLinkage, +            IdTy, llvm::GlobalValue::InternalLinkage,              ".objc_class_ref" + Class->getNameAsString(), &TheModule);        }        ReceiverClass = ClassPtrAlias;      }    }    // Cast the pointer to a simplified version of the class structure +  llvm::Type *CastTy = llvm::StructType::get(IdTy, IdTy, nullptr);    ReceiverClass = Builder.CreateBitCast(ReceiverClass, -      llvm::PointerType::getUnqual( -        llvm::StructType::get(IdTy, IdTy, nullptr))); +                                        llvm::PointerType::getUnqual(CastTy));    // Get the superclass pointer -  ReceiverClass = Builder.CreateStructGEP(ReceiverClass, 1); +  ReceiverClass = Builder.CreateStructGEP(CastTy, ReceiverClass, 1);    // Load the superclass pointer    ReceiverClass = Builder.CreateLoad(ReceiverClass);    // Construct the structure used to look up the IMP @@ -1287,8 +1287,10 @@ CGObjCGNU::GenerateMessageSendSuper(CodeGenFunction &CGF,        Receiver->getType(), IdTy, nullptr);    llvm::Value *ObjCSuper = Builder.CreateAlloca(ObjCSuperTy); -  Builder.CreateStore(Receiver, Builder.CreateStructGEP(ObjCSuper, 0)); -  Builder.CreateStore(ReceiverClass, Builder.CreateStructGEP(ObjCSuper, 1)); +  Builder.CreateStore(Receiver, +                      Builder.CreateStructGEP(ObjCSuperTy, ObjCSuper, 0)); +  Builder.CreateStore(ReceiverClass, +                      Builder.CreateStructGEP(ObjCSuperTy, ObjCSuper, 1));    ObjCSuper = EnforceType(Builder, ObjCSuper, PtrToObjCSuperTy); @@ -2294,7 +2296,8 @@ void CGObjCGNU::GenerateClass(const ObjCImplementationDecl *OID) {        offsetPointerIndexes[2] = llvm::ConstantInt::get(IndexTy, ivarIndex);        // Get the correct ivar field        llvm::Constant *offsetValue = llvm::ConstantExpr::getGetElementPtr( -              IvarList, offsetPointerIndexes); +          cast<llvm::GlobalVariable>(IvarList)->getValueType(), IvarList, +          offsetPointerIndexes);        // Get the existing variable, if one exists.        llvm::GlobalVariable *offset = TheModule.getNamedGlobal(Name);        if (offset) { @@ -2366,7 +2369,7 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() {    std::vector<llvm::Constant*> Elements;    llvm::Constant *Statics = NULLPtr;    // Generate statics list: -  if (ConstantStrings.size()) { +  if (!ConstantStrings.empty()) {      llvm::ArrayType *StaticsArrayTy = llvm::ArrayType::get(PtrToInt8Ty,          ConstantStrings.size() + 1);      ConstantStrings.push_back(NULLPtr); @@ -2439,8 +2442,8 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() {    // Number of static selectors    Elements.push_back(llvm::ConstantInt::get(LongTy, SelectorCount)); -  llvm::Constant *SelectorList = MakeGlobalArray(SelStructTy, Selectors, -          ".objc_selector_list"); +  llvm::GlobalVariable *SelectorList = +      MakeGlobalArray(SelStructTy, Selectors, ".objc_selector_list");    Elements.push_back(llvm::ConstantExpr::getBitCast(SelectorList,      SelStructPtrTy)); @@ -2450,8 +2453,8 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() {      llvm::Constant *Idxs[] = {Zeros[0],        llvm::ConstantInt::get(Int32Ty, i), Zeros[0]};      // FIXME: We're generating redundant loads and stores here! -    llvm::Constant *SelPtr = llvm::ConstantExpr::getGetElementPtr(SelectorList, -        makeArrayRef(Idxs, 2)); +    llvm::Constant *SelPtr = llvm::ConstantExpr::getGetElementPtr( +        SelectorList->getValueType(), SelectorList, makeArrayRef(Idxs, 2));      // If selectors are defined as an opaque type, cast the pointer to this      // type.      SelPtr = llvm::ConstantExpr::getBitCast(SelPtr, SelectorTy); @@ -2562,8 +2565,8 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() {              true);         if (TheClass) {           TheClass = llvm::ConstantExpr::getBitCast(TheClass, PtrTy); -         Builder.CreateCall2(RegisterAlias, TheClass, -            MakeConstantString(iter->second)); +         Builder.CreateCall(RegisterAlias, +                            {TheClass, MakeConstantString(iter->second)});         }      }      // Jump to end: @@ -2679,7 +2682,7 @@ llvm::Value * CGObjCGNU::EmitObjCWeakRead(CodeGenFunction &CGF,                                            llvm::Value *AddrWeakObj) {    CGBuilderTy &B = CGF.Builder;    AddrWeakObj = EnforceType(B, AddrWeakObj, PtrToIdTy); -  return B.CreateCall(WeakReadFn, AddrWeakObj); +  return B.CreateCall(WeakReadFn.getType(), WeakReadFn, AddrWeakObj);  }  void CGObjCGNU::EmitObjCWeakAssign(CodeGenFunction &CGF, @@ -2687,7 +2690,7 @@ void CGObjCGNU::EmitObjCWeakAssign(CodeGenFunction &CGF,    CGBuilderTy &B = CGF.Builder;    src = EnforceType(B, src, IdTy);    dst = EnforceType(B, dst, PtrToIdTy); -  B.CreateCall2(WeakAssignFn, src, dst); +  B.CreateCall(WeakAssignFn.getType(), WeakAssignFn, {src, dst});  }  void CGObjCGNU::EmitObjCGlobalAssign(CodeGenFunction &CGF, @@ -2696,11 +2699,9 @@ void CGObjCGNU::EmitObjCGlobalAssign(CodeGenFunction &CGF,    CGBuilderTy &B = CGF.Builder;    src = EnforceType(B, src, IdTy);    dst = EnforceType(B, dst, PtrToIdTy); -  if (!threadlocal) -    B.CreateCall2(GlobalAssignFn, src, dst); -  else -    // FIXME. Add threadloca assign API -    llvm_unreachable("EmitObjCGlobalAssign - Threal Local API NYI"); +  // FIXME. Add threadloca assign API +  assert(!threadlocal && "EmitObjCGlobalAssign - Threal Local API NYI"); +  B.CreateCall(GlobalAssignFn.getType(), GlobalAssignFn, {src, dst});  }  void CGObjCGNU::EmitObjCIvarAssign(CodeGenFunction &CGF, @@ -2709,7 +2710,7 @@ void CGObjCGNU::EmitObjCIvarAssign(CodeGenFunction &CGF,    CGBuilderTy &B = CGF.Builder;    src = EnforceType(B, src, IdTy);    dst = EnforceType(B, dst, IdTy); -  B.CreateCall3(IvarAssignFn, src, dst, ivarOffset); +  B.CreateCall(IvarAssignFn.getType(), IvarAssignFn, {src, dst, ivarOffset});  }  void CGObjCGNU::EmitObjCStrongCastAssign(CodeGenFunction &CGF, @@ -2717,7 +2718,7 @@ void CGObjCGNU::EmitObjCStrongCastAssign(CodeGenFunction &CGF,    CGBuilderTy &B = CGF.Builder;    src = EnforceType(B, src, IdTy);    dst = EnforceType(B, dst, PtrToIdTy); -  B.CreateCall2(StrongCastAssignFn, src, dst); +  B.CreateCall(StrongCastAssignFn.getType(), StrongCastAssignFn, {src, dst});  }  void CGObjCGNU::EmitGCMemmoveCollectable(CodeGenFunction &CGF, @@ -2728,7 +2729,7 @@ void CGObjCGNU::EmitGCMemmoveCollectable(CodeGenFunction &CGF,    DestPtr = EnforceType(B, DestPtr, PtrTy);    SrcPtr = EnforceType(B, SrcPtr, PtrTy); -  B.CreateCall3(MemMoveFn, DestPtr, SrcPtr, Size); +  B.CreateCall(MemMoveFn.getType(), MemMoveFn, {DestPtr, SrcPtr, Size});  }  llvm::GlobalVariable *CGObjCGNU::ObjCIvarOffsetVariable( | 
