Add support for objc property decls according to the page at:
authorEric Christopher <echristo@apple.com>
Thu, 29 Mar 2012 08:42:56 +0000 (08:42 +0000)
committerEric Christopher <echristo@apple.com>
Thu, 29 Mar 2012 08:42:56 +0000 (08:42 +0000)
http://llvm.org/docs/SourceLevelDebugging.html#objcproperty

including type and DECL. Expand the metadata needed accordingly.

rdar://11144023

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153639 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/DIBuilder.h
include/llvm/Analysis/DebugInfo.h
lib/Analysis/DIBuilder.cpp
lib/Analysis/DebugInfo.cpp
lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
lib/CodeGen/AsmPrinter/DwarfCompileUnit.h

index 5190f0a8319280262770efd5964b41ded6535fa6..9fbbe09cca251d6ad5e21c2fe4bc7d5ae6939add 100644 (file)
@@ -211,13 +211,19 @@ namespace llvm {
     /// createObjCProperty - Create debugging information entry for Objective-C
     /// property.
     /// @param Name         Property name.
+    /// @param File         File where this property is defined.
+    /// @param LineNumber   Line number.
     /// @param GetterName   Name of the Objective C property getter selector.
     /// @param SetterName   Name of the Objective C property setter selector.
     /// @param PropertyAttributes Objective C property attributes.
-    DIObjCProperty createObjCProperty(StringRef Name, StringRef GetterName,
-                                      StringRef SetterName, 
-                                      unsigned PropertyAttributes);
-
+    /// @param Ty           Type.
+    DIObjCProperty createObjCProperty(StringRef Name,
+                                     DIFile File, unsigned LineNumber,
+                                     StringRef GetterName,
+                                     StringRef SetterName,
+                                     unsigned PropertyAttributes,
+                                     DIType Ty);
+      
     /// createClassType - Create debugging information entry for a class.
     /// @param Scope        Scope in which this class is defined.
     /// @param Name         class name.
index 1bbe8dfa1d4b1d63a4e28100ee7f1fabd8c68e85..8ed8f949e7fd2661783e1cf03fdd176fb0eae37a 100644 (file)
@@ -792,31 +792,36 @@ namespace llvm {
     explicit DIObjCProperty(const MDNode *N) : DIDescriptor(N) { }
 
     StringRef getObjCPropertyName() const { return getStringField(1); }
+    DIFile getFile() const { return getFieldAs<DIFile>(2); }
+    unsigned getLineNumber() const { return getUnsignedField(3); }
+
     StringRef getObjCPropertyGetterName() const {
-      return getStringField(2);
+      return getStringField(4);
     }
     StringRef getObjCPropertySetterName() const {
-      return getStringField(3);
+      return getStringField(5);
     }
     bool isReadOnlyObjCProperty() {
-      return (getUnsignedField(4) & dwarf::DW_APPLE_PROPERTY_readonly) != 0;
+      return (getUnsignedField(6) & dwarf::DW_APPLE_PROPERTY_readonly) != 0;
     }
     bool isReadWriteObjCProperty() {
-      return (getUnsignedField(4) & dwarf::DW_APPLE_PROPERTY_readwrite) != 0;
+      return (getUnsignedField(6) & dwarf::DW_APPLE_PROPERTY_readwrite) != 0;
     }
     bool isAssignObjCProperty() {
-      return (getUnsignedField(4) & dwarf::DW_APPLE_PROPERTY_assign) != 0;
+      return (getUnsignedField(6) & dwarf::DW_APPLE_PROPERTY_assign) != 0;
     }
     bool isRetainObjCProperty() {
-      return (getUnsignedField(4) & dwarf::DW_APPLE_PROPERTY_retain) != 0;
+      return (getUnsignedField(6) & dwarf::DW_APPLE_PROPERTY_retain) != 0;
     }
     bool isCopyObjCProperty() {
-      return (getUnsignedField(4) & dwarf::DW_APPLE_PROPERTY_copy) != 0;
+      return (getUnsignedField(6) & dwarf::DW_APPLE_PROPERTY_copy) != 0;
     }
     bool isNonAtomicObjCProperty() {
-      return (getUnsignedField(4) & dwarf::DW_APPLE_PROPERTY_nonatomic) != 0;
+      return (getUnsignedField(6) & dwarf::DW_APPLE_PROPERTY_nonatomic) != 0;
     }
 
+    DIType getType() const { return getFieldAs<DIType>(7); }
+
     /// Verify - Verify that a derived type descriptor is well formed.
     bool Verify() const;
 
index f0bdc48cf3c23a17bdf10b7fa5e9774940a1d575..ddf57f84a86ec64a4fc2197142af3e50fff37c68 100644 (file)
@@ -385,16 +385,21 @@ DIType DIBuilder::createObjCIVar(StringRef Name,
 
 /// createObjCProperty - Create debugging information entry for Objective-C
 /// property.
-DIObjCProperty DIBuilder::createObjCProperty(StringRef Name, 
+DIObjCProperty DIBuilder::createObjCProperty(StringRef Name,
+                                            DIFile File, unsigned LineNumber,
                                              StringRef GetterName,
                                              StringRef SetterName, 
-                                             unsigned PropertyAttributes) {
+                                             unsigned PropertyAttributes,
+                                            DIType Ty) {
   Value *Elts[] = {
     GetTagConstant(VMContext, dwarf::DW_TAG_APPLE_Property),
     MDString::get(VMContext, Name),
+    File,
+    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
     MDString::get(VMContext, GetterName),
     MDString::get(VMContext, SetterName),
-    ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes)
+    ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes),
+    Ty
   };
   return DIObjCProperty(MDNode::get(VMContext, Elts));
 }
index e30c0a9b3306d60f4581c30b28beb11fbca04fb7..c9a619863b9560f0facad469c295876850ff3f26 100644 (file)
@@ -377,6 +377,19 @@ bool DICompileUnit::Verify() const {
   return true;
 }
 
+/// Verify - Verify that an ObjC property is well formed.
+bool DIObjCProperty::Verify() const {
+  if (!DbgNode)
+    return false;
+  unsigned Tag = getTag();
+  if (Tag != dwarf::DW_TAG_APPLE_Property) return false;
+  DIType Ty = getType();
+  if (!Ty.Verify()) return false;
+
+  // Don't worry about the rest of the strings for now.
+  return true;
+}
+
 /// Verify - Verify that a type descriptor is well formed.
 bool DIType::Verify() const {
   if (!DbgNode)
index 39df4f66741058ab24f2739c5a813e33f2a59743..69dc454ae1d75bd634faf8a676f1c707fa97b01a 100644 (file)
@@ -186,6 +186,24 @@ void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
 }
 
+/// addSourceLine - Add location information to specified debug information
+/// entry.
+void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
+  // Verify type.
+  if (!Ty.Verify())
+    return;
+
+  unsigned Line = Ty.getLineNumber();
+  if (Line == 0)
+    return;
+  DIFile File = Ty.getFile();
+  unsigned FileID = DD->GetOrCreateSourceID(File.getFilename(),
+                                           File.getDirectory());
+  assert(FileID && "Invalid file id");
+  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
+  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
+}
+
 /// addSourceLine - Add location information to specified debug information
 /// entry.
 void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
@@ -839,6 +857,8 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
         ElemDie = new DIE(Property.getTag());
         StringRef PropertyName = Property.getObjCPropertyName();
         addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
+       addType(ElemDie, Property.getType());
+       addSourceLine(ElemDie, Property);
         StringRef GetterName = Property.getObjCPropertyGetterName();
         if (!GetterName.empty())
           addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
index 2013419e0d9f9f6094e59328a85644c856ac55d8..45e407e27ffa272d438fe48148ef863f5418afb7 100644 (file)
@@ -213,6 +213,7 @@ public:
   void addSourceLine(DIE *Die, DISubprogram SP);
   void addSourceLine(DIE *Die, DIType Ty);
   void addSourceLine(DIE *Die, DINameSpace NS);
+  void addSourceLine(DIE *Die, DIObjCProperty Ty);
 
   /// addAddress - Add an address attribute to a die based on the location
   /// provided.