From: Ahmed Bougacha Date: Fri, 17 Nov 2017 19:46:47 +0000 (+0000) Subject: [CodeGen] Compute the objc EH vtable address point using inbounds GEP. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=56e12b471f656061f7d8171e46d5eb75d9f4a349;p=clang [CodeGen] Compute the objc EH vtable address point using inbounds GEP. The object is provided by the objc runtime and is never visible in the module itself, but even so, the address point we compute points into it, and "+16" is guaranteed not to overflow. This matches the c++ vtable IRGen. Note that I'm not entirely convinced the 'i8*' type is correct here: at the IR level, we're accessing memory that's outside the global object. But we don't control the allocation, so it's not obviously wrong either. But either way, this is only in a global initializer, so I don't think it's going to be mucked with. Filed PR35352 to discuss that. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@318545 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index 992da81409..6c47da8ab9 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -7558,8 +7558,9 @@ CGObjCNonFragileABIMac::GetInterfaceEHType(const ObjCInterfaceDecl *ID, llvm::Value *VTableIdx = llvm::ConstantInt::get(CGM.Int32Ty, 2); ConstantInitBuilder builder(CGM); auto values = builder.beginStruct(ObjCTypes.EHTypeTy); - values.add(llvm::ConstantExpr::getGetElementPtr(VTableGV->getValueType(), - VTableGV, VTableIdx)); + values.add( + llvm::ConstantExpr::getInBoundsGetElementPtr(VTableGV->getValueType(), + VTableGV, VTableIdx)); values.add(GetClassName(ClassName)); values.add(GetClassGlobal(ID, /*metaclass*/ false, NotForDefinition)); diff --git a/test/CodeGenObjC/attr-exception.m b/test/CodeGenObjC/attr-exception.m index 00ebb0f2a0..30b637c8bc 100644 --- a/test/CodeGenObjC/attr-exception.m +++ b/test/CodeGenObjC/attr-exception.m @@ -13,8 +13,8 @@ __attribute__((objc_exception)) @implementation A @end -// CHECK: @"OBJC_EHTYPE_$_A" = global {{%.*}} { i8** getelementptr (i8*, i8** @objc_ehtype_vtable, i32 2) -// CHECK-HIDDEN: @"OBJC_EHTYPE_$_A" = hidden global {{%.*}} { i8** getelementptr (i8*, i8** @objc_ehtype_vtable, i32 2) +// CHECK: @"OBJC_EHTYPE_$_A" = global {{%.*}} { i8** getelementptr inbounds (i8*, i8** @objc_ehtype_vtable, i32 2) +// CHECK-HIDDEN: @"OBJC_EHTYPE_$_A" = hidden global {{%.*}} { i8** getelementptr inbounds (i8*, i8** @objc_ehtype_vtable, i32 2) __attribute__((objc_exception)) __attribute__((visibility("default"))) @@ -23,5 +23,5 @@ __attribute__((visibility("default"))) @implementation B @end -// CHECK: @"OBJC_EHTYPE_$_B" = global {{%.*}} { i8** getelementptr (i8*, i8** @objc_ehtype_vtable, i32 2) -// CHECK-HIDDEN: @"OBJC_EHTYPE_$_B" = global {{%.*}} { i8** getelementptr (i8*, i8** @objc_ehtype_vtable, i32 2) +// CHECK: @"OBJC_EHTYPE_$_B" = global {{%.*}} { i8** getelementptr inbounds (i8*, i8** @objc_ehtype_vtable, i32 2) +// CHECK-HIDDEN: @"OBJC_EHTYPE_$_B" = global {{%.*}} { i8** getelementptr inbounds (i8*, i8** @objc_ehtype_vtable, i32 2)