diff options
-rw-r--r-- | lib/CodeGen/CGDebugInfo.cpp | 11 | ||||
-rw-r--r-- | test/CodeGenObjC/debug-info-crash-2.m | 15 |
2 files changed, 23 insertions, 3 deletions
diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 1a7ba4d7df..7bd6fc2fb0 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -1148,8 +1148,8 @@ llvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, unsigned Line = getLineNumber(ID->getLocation()); unsigned RuntimeLang = TheCU.getLanguage(); - // If this is just a forward declaration, return a special forward-declaration - // debug type. + // If this is just a forward declaration return a special forward-declaration + // debug type since we won't be able to lay out the entire type. if (ID->isForwardDecl()) { llvm::DIType FwdDecl = DBuilder.createStructType(Unit, ID->getName(), @@ -1223,7 +1223,12 @@ llvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, FieldAlign = CGM.getContext().getTypeAlign(FType); } - uint64_t FieldOffset = RL.getFieldOffset(FieldNo); + // We can't know the offset of our ivar in the structure if we're using + // the non-fragile abi and the debugger should ignore the value anyways. + // Call it the FieldNo+1 due to how debuggers use the information, + // e.g. negating the value when it needs a lookup in the dynamic table. + uint64_t FieldOffset = CGM.getLangOptions().ObjCNonFragileABI ? FieldNo+1 + : RL.getFieldOffset(FieldNo); unsigned Flags = 0; if (Field->getAccessControl() == ObjCIvarDecl::Protected) diff --git a/test/CodeGenObjC/debug-info-crash-2.m b/test/CodeGenObjC/debug-info-crash-2.m new file mode 100644 index 0000000000..a2acd9dc91 --- /dev/null +++ b/test/CodeGenObjC/debug-info-crash-2.m @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -g -S %s -o - +@class Bar; +@interface Foo +@property (strong, nonatomic) Bar *window; +@end + +@interface Foo__ : Foo +@end +@implementation Foo__ +@end + +@implementation Foo +@synthesize window = _window; +@end + |