Introduce two DWARF attribute extentions DW_AT_APPLE_optimized, DW_AT_APPLE_flags.
authorDevang Patel <dpatel@apple.com>
Fri, 23 Jan 2009 22:33:47 +0000 (22:33 +0000)
committerDevang Patel <dpatel@apple.com>
Fri, 23 Jan 2009 22:33:47 +0000 (22:33 +0000)
DW_AT_APPLE_optimized flag is set when a compile_unit is optimized. The debugger takes advantage of this information some way.

DW_AT_APPLE_flags encodes command line options when certain env. variable is set. This is used by build engineers to track various gcc command lines used by by  a project, irrespective of whether the project used makefile, Xcode or something else.

llvm-gcc patch is next.

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

include/llvm/Analysis/DebugInfo.h
include/llvm/Support/Dwarf.h
lib/Analysis/DebugInfo.cpp
lib/CodeGen/AsmPrinter/DwarfWriter.cpp
lib/Support/Dwarf.cpp

index 63206ea6fca5a6c5d83b03b3ca02749aeb7cb07c..c80a11d3b32c21394e402b4325fa635e3f88a4d6 100644 (file)
@@ -109,6 +109,8 @@ namespace llvm {
     std::string getFilename() const  { return getStringField(3); }
     std::string getDirectory() const { return getStringField(4); }
     std::string getProducer() const  { return getStringField(5); }
+    bool isOptimized() const         { return getUnsignedField(6); }
+    std::string getFlags() const     { return getStringField(7); }
 
     /// Verify - Verify that a compile unit is well formed.
     bool Verify() const;
@@ -372,7 +374,9 @@ namespace llvm {
     DICompileUnit CreateCompileUnit(unsigned LangID,
                                     const std::string &Filename,
                                     const std::string &Directory,
-                                    const std::string &Producer);
+                                    const std::string &Producer,
+                                    bool isOptimized = false,
+                                    const char *Flags = "");
 
     /// CreateEnumerator - Create a single enumerator value.
     DIEnumerator CreateEnumerator(const std::string &Name, uint64_t Val);
index 23ab9bf29e57753737bfb36a2131d02662891ee8..c24274354cf68d1f18db4f5c12b26810aeb3dcd6 100644 (file)
@@ -221,7 +221,11 @@ enum dwarf_constants {
   DW_AT_GNU_vector = 0x2107,
   DW_AT_lo_user = 0x2000,
   DW_AT_hi_user = 0x3fff,
+
+  // Apple extensions.
+  DW_AT_APPLE_optimized = 0x3fe1,
+  DW_AT_APPLE_flags = 0x3fe2,
+
   // Attribute form encodings
   DW_FORM_addr = 0x01,
   DW_FORM_block2 = 0x03,
index 34ccd0a97cf9cb5f7223ac20fbd02412db98eaf7..2f336572a1df4ef75c4bdbb5370c1d1c39fbaa43 100644 (file)
@@ -440,14 +440,18 @@ DISubrange DIFactory::GetOrCreateSubrange(int64_t Lo, int64_t Hi) {
 DICompileUnit DIFactory::CreateCompileUnit(unsigned LangID,
                                            const std::string &Filename,
                                            const std::string &Directory,
-                                           const std::string &Producer) {
+                                           const std::string &Producer,
+                                           bool isOptimized,
+                                           const char *Flags) {
   Constant *Elts[] = {
     GetTagConstant(dwarf::DW_TAG_compile_unit),
     getCastToEmpty(GetOrCreateCompileUnitAnchor()),
     ConstantInt::get(Type::Int32Ty, LangID),
     GetStringConstant(Filename),
     GetStringConstant(Directory),
-    GetStringConstant(Producer)
+    GetStringConstant(Producer),
+    ConstantInt::get(Type::Int1Ty, isOptimized),
+    GetStringConstant(Flags)
   };
   
   Constant *Init = ConstantStruct::get(Elts, sizeof(Elts)/sizeof(Elts[0]));
index 6bbb5bb9b769840129a540cc92ad2418b2954cce..4b19d06c924e9b2078c23e90a19215eb1972ecd1 100644 (file)
@@ -2781,6 +2781,11 @@ private:
       AddString(Die, DW_AT_name, DW_FORM_string, DIUnit.getFilename());
       if (!DIUnit.getDirectory().empty())
         AddString(Die, DW_AT_comp_dir, DW_FORM_string, DIUnit.getDirectory());
+      if (DIUnit.isOptimized())
+        AddUInt(Die, DW_AT_APPLE_optimized, DW_FORM_flag, 1);
+      const std::string &Flags = DIUnit.getFlags();
+      if (!Flags.empty())
+        AddString(Die, DW_AT_APPLE_flags, DW_FORM_string, Flags);
 
       CompileUnit *Unit = new CompileUnit(ID, Die);
       DW_CUs[DIUnit.getGV()] = Unit;
index b7cf3b977abd7efa716012de4b026a777bb3ae03..10a2c3c64f8d2a67b5376e6ae237827ee9cb49cb 100644 (file)
@@ -198,6 +198,8 @@ const char *AttributeString(unsigned Attribute) {
     case DW_AT_GNU_vector:                 return "DW_AT_GNU_vector";
     case DW_AT_lo_user:                    return "DW_AT_lo_user";
     case DW_AT_hi_user:                    return "DW_AT_hi_user";
+    case DW_AT_APPLE_optimized:            return "DW_AT_APPLE_optimized";
+    case DW_AT_APPLE_flags:                return "DW_AT_APPLE_flags";
   }
   assert(0 && "Unknown Dwarf Attribute");
   return "";