Debugging Information Extension for Objective C Properties

  1. Introduction
  2. Proposal
  3. New DWARF Attributes
  4. New DWARF Constants

Written by Jim Ingham and Devang Patel

Introduction

Objective C provides a simpler way to declare and define accessor methods using declared properties. The language provides features to declare a property and to let compiler synthesize accessor methods.

The debugger lets developer inspect Objective C interfaces and their instance variables and class variables. However, the debugger does not know anything about the properties defined in Objective C interfaces. The debugger consumes information generated by compiler in DWARF format. The format does not support encoding of Objective C properties. This proposal describes DWARF extensions to encode Objective C properties, which the debugger can use to let developers inspect Objective C properties.

Proposal

Objective C properties are always backed by an instance variable. The instance variables backing properties are identified using DW_AT_APPLE_property_name attribute. The instance variables with this attribute may not have data location attributes. The location of instance variables is determined by debugger only after consulting Objective C runtime.

@interface I1 { 
  int n2;
} 

@property p1; 
@property p2; 
@end

@implementation I1 
@synthesize p1; 
@synthesize p2 = n2; 
@end


TAG_structure_type [7] * 
  AT_APPLE_runtime_class( 0x10 )
  AT_name( "I1" )
  AT_decl_file( "Objc_Property.m" ) 
  AT_decl_line( 3 )

  TAG_member [8] 
    AT_name( "p1" )
    AT_APPLE_property_name(“p1”) 
    AT_type( {0x00000147} ( int ) )

  TAG_member [8] 
    AT_name( "n2" )
    AT_APPLE_property_name(“p2”) 
    AT_type( {0x00000147} ( int ) )

Developers can decorate a property with attributes which are encoded using DW_AT_APPLE_property_attribute.

@property (readonly, nonatomic) int pr;


TAG_member [8] 
  AT_name(“pr”) 
  AT_APPLE_property_name(“pr”) 
  AT_type ( {0x00000147} (int) ) 
  AT_APPLE_property_attribute (DW_APPLE_PROPERTY_readonly, DW_APPLE_PROPERTY_nonatomic)

The setter and getter method names are attached to the property using DW_AT_APPLE_property_setter and DW_AT_APPLE_property_getter attributes.

@interface I1 
@property (setter=myOwnP3Setter:) int p3; 
-(void)myOwnP3Setter:(int)a; 
@end

@implementation I1 
@synthesize p3;
-(void)myOwnP3Setter:(int)a{ } 
@end

0x000003bd: TAG_structure_type [7] * 
              AT_APPLE_runtime_class( 0x10 )
              AT_name( "I1" )
              AT_decl_file( "Objc_Property.m" ) 
              AT_decl_line( 3 )
0x000003f3: TAG_member [8] 
              AT_name( "p3" ) 
              AT_APPLE_property_name(“p3”) 
              AT_APPLE_property_setter(“myOwnP3Setter:”)
              AT_type( {0x00000147} ( int ) )

New DWARF Attributes

Attribute Value Classes
DW_AT_APPLE_property_name 0x3fe8 String
DW_AT_APPLE_property_getter 0x3fe9 String
DW_AT_APPLE_property_setter 0x3fea String
DW_AT_APPLE_property_attribute 0x3feb Constant

New DWARF Constants

Name Value
DW_AT_APPLE_PROPERTY_readonly 0x1
DW_AT_APPLE_PROPERTY_readwrite 0x2
DW_AT_APPLE_PROPERTY_assign 0x4
DW_AT_APPLE_PROPERTY_retain 0x8
DW_AT_APPLE_PROPERTY_copy 0x10
DW_AT_APPLE_PROPERTY_nonatomic 0x20

Valid CSS Valid HTML 4.01 LLVM Compiler Infrastructure
Last modified: $Date: 2011-11-14 $