Patch to fix IR-gen crash generating structure ABI which implements
user specified string class via -fconstant-string-class option. pr9914. llvm-svn: 131496
This commit is contained in:
parent
4298df6d86
commit
7bd3d1c49b
|
@ -484,6 +484,10 @@ public:
|
|||
const CGBlockInfo &blockInfo) {
|
||||
return NULLPtr;
|
||||
}
|
||||
|
||||
virtual llvm::GlobalVariable *GetClassGlobal(const std::string &Name) {
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
/// Class representing the legacy GCC Objective-C ABI. This is the default when
|
||||
/// -fobjc-nonfragile-abi is not specified.
|
||||
|
|
|
@ -1048,6 +1048,13 @@ public:
|
|||
virtual llvm::Value *EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
|
||||
const ObjCInterfaceDecl *Interface,
|
||||
const ObjCIvarDecl *Ivar);
|
||||
|
||||
/// GetClassGlobal - Return the global variable for the Objective-C
|
||||
/// class of the given name.
|
||||
virtual llvm::GlobalVariable *GetClassGlobal(const std::string &Name) {
|
||||
assert(false && "CGObjCMac::GetClassGlobal");
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
class CGObjCNonFragileABIMac : public CGObjCCommonMac {
|
||||
|
@ -1142,11 +1149,11 @@ private:
|
|||
bool IsSuper,
|
||||
const CallArgList &CallArgs,
|
||||
const ObjCMethodDecl *Method);
|
||||
|
||||
|
||||
/// GetClassGlobal - Return the global variable for the Objective-C
|
||||
/// class of the given name.
|
||||
llvm::GlobalVariable *GetClassGlobal(const std::string &Name);
|
||||
|
||||
|
||||
/// EmitClassRef - Return a Value*, of type ObjCTypes.ClassPtrTy,
|
||||
/// for the given class reference.
|
||||
llvm::Value *EmitClassRef(CGBuilderTy &Builder,
|
||||
|
|
|
@ -243,6 +243,7 @@ public:
|
|||
llvm::Value *Size) = 0;
|
||||
virtual llvm::Constant *BuildGCBlockLayout(CodeGen::CodeGenModule &CGM,
|
||||
const CodeGen::CGBlockInfo &blockInfo) = 0;
|
||||
virtual llvm::GlobalVariable *GetClassGlobal(const std::string &Name) = 0;
|
||||
};
|
||||
|
||||
/// Creates an instance of an Objective-C runtime class.
|
||||
|
|
|
@ -1768,24 +1768,31 @@ CodeGenModule::GetAddrOfConstantString(const StringLiteral *Literal) {
|
|||
if (!ConstantStringClassRef) {
|
||||
std::string StringClass(getLangOptions().ObjCConstantStringClass);
|
||||
const llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy);
|
||||
Ty = llvm::ArrayType::get(Ty, 0);
|
||||
llvm::Constant *GV;
|
||||
if (StringClass.empty())
|
||||
GV = CreateRuntimeVariable(Ty,
|
||||
Features.ObjCNonFragileABI ?
|
||||
"OBJC_CLASS_$_NSConstantString" :
|
||||
"_NSConstantStringClassReference");
|
||||
else {
|
||||
if (Features.ObjCNonFragileABI) {
|
||||
std::string str;
|
||||
if (Features.ObjCNonFragileABI)
|
||||
if (StringClass.empty())
|
||||
str = "OBJC_CLASS_$_NSConstantString";
|
||||
else {
|
||||
str = "OBJC_CLASS_$_" + StringClass;
|
||||
else
|
||||
str = "_" + StringClass + "ClassReference";
|
||||
GV = CreateRuntimeVariable(Ty, str);
|
||||
}
|
||||
GV = getObjCRuntime().GetClassGlobal(str);
|
||||
// Make sure the result is of the correct type.
|
||||
const llvm::Type *PTy = llvm::PointerType::getUnqual(Ty);
|
||||
ConstantStringClassRef =
|
||||
llvm::ConstantExpr::getBitCast(GV, PTy);
|
||||
} else {
|
||||
Ty = llvm::ArrayType::get(Ty, 0);
|
||||
if (StringClass.empty())
|
||||
GV = CreateRuntimeVariable(Ty, "_NSConstantStringClassReference");
|
||||
else {
|
||||
std::string str = "_" + StringClass + "ClassReference";
|
||||
GV = CreateRuntimeVariable(Ty, str);
|
||||
}
|
||||
// Decay array -> ptr
|
||||
ConstantStringClassRef =
|
||||
llvm::ConstantExpr::getGetElementPtr(GV, Zeros, 2);
|
||||
}
|
||||
// Decay array -> ptr
|
||||
ConstantStringClassRef =
|
||||
llvm::ConstantExpr::getGetElementPtr(GV, Zeros, 2);
|
||||
}
|
||||
|
||||
QualType NSTy = getContext().getNSConstantStringType();
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-nonfragile-abi -fno-constant-cfstrings -fconstant-string-class OFConstantString -emit-llvm -o %t %s
|
||||
// pr9914
|
||||
|
||||
@interface OFConstantString
|
||||
+ class;
|
||||
@end
|
||||
|
||||
@interface OFString
|
||||
- (void)XMLElementBySerializing;
|
||||
@end
|
||||
|
||||
@implementation OFString
|
||||
|
||||
- (void)XMLElementBySerializing
|
||||
{
|
||||
id str = @"object";
|
||||
|
||||
[OFConstantString class];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
// CHECK: @"OBJC_CLASS_$_OFConstantString" = external global
|
|
@ -32,4 +32,4 @@ int main () {
|
|||
|
||||
// CHECK-FRAGILE: @_FooClassReference = common global
|
||||
// CHECK-NONFRAGILE: @"OBJC_CLASS_$_Object" = external global
|
||||
// CHECK-NONFRAGILE: "OBJC_CLASS_$_Foo" = unnamed_addr global
|
||||
// CHECK-NONFRAGILE: "OBJC_CLASS_$_Foo" = global
|
||||
|
|
Loading…
Reference in New Issue