[llvm-commits] [llvm] r61164 - in /llvm/trunk: include/llvm/Analysis/DebugInfo.h include/llvm/CodeGen/MachineModuleInfo.h lib/Analysis/DebugInfo.cpp

Devang Patel dpatel at apple.com
Wed Dec 17 14:39:30 PST 2008


Author: dpatel
Date: Wed Dec 17 16:39:29 2008
New Revision: 61164

URL: http://llvm.org/viewvc/llvm-project?rev=61164&view=rev
Log:

Today the front-ends (llvm-gcc and clang) generate multiple llvm.dbg.compile_units to identify source file for various debug entities. Each llvm.dbg.compile_unit matches one file on the disk. However, the backend only supports one DW_TAG_compile_unit per .o file. The backend selects first compile_unit from the vector to construct DW_TAG_compile_unit entry, which is not correct in all cases.

First step to resolve this is, record file name and directory directly in debug info for various debug entities. 


Modified:
    llvm/trunk/include/llvm/Analysis/DebugInfo.h
    llvm/trunk/include/llvm/CodeGen/MachineModuleInfo.h
    llvm/trunk/lib/Analysis/DebugInfo.cpp

Modified: llvm/trunk/include/llvm/Analysis/DebugInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/DebugInfo.h?rev=61164&r1=61163&r2=61164&view=diff

==============================================================================
--- llvm/trunk/include/llvm/Analysis/DebugInfo.h (original)
+++ llvm/trunk/include/llvm/Analysis/DebugInfo.h Wed Dec 17 16:39:29 2008
@@ -33,7 +33,8 @@
   class DIDescriptor {
   public:
     enum {
-      Version6    = 6 << 16,     // Current version of debug information.
+      Version7    = 7 << 16,     // Current version of debug information.
+      Version6    = 6 << 16,     // Constant for version 6.
       Version5    = 5 << 16,     // Constant for version 5.
       Version4    = 4 << 16,     // Constant for version 4.
       VersionMask = 0xffff0000   // Mask for version number.
@@ -156,6 +157,8 @@
     explicit DIBasicType(GlobalVariable *GV);
     
     unsigned getEncoding() const { return getUnsignedField(9); }
+    std::string getFileName() const { return getStringField(10); }
+    std::string getDirectory() const { return getStringField(11); }
   };
   
   /// DIDerivedType - A simple derived type, like a const qualified type,
@@ -168,7 +171,9 @@
     explicit DIDerivedType(GlobalVariable *GV);
     
     DIType getTypeDerivedFrom() const { return getFieldAs<DIType>(9); }
-    
+    std::string getFileName() const { return getStringField(10); }
+    std::string getDirectory() const { return getStringField(11); }
+
     /// isDerivedType - Return true if the specified tag is legal for
     /// DIDerivedType.
     static bool isDerivedType(unsigned TAG);
@@ -183,6 +188,8 @@
     explicit DICompositeType(GlobalVariable *GV);
     
     DIArray getTypeArray() const { return getFieldAs<DIArray>(10); }
+    std::string getFileName() const { return getStringField(11); }
+    std::string getDirectory() const { return getStringField(12); }
     
     /// isCompositeType - Return true if the specified tag is legal for
     /// DICompositeType.
@@ -216,7 +223,8 @@
   class DISubprogram : public DIGlobal {
   public:
     explicit DISubprogram(GlobalVariable *GV = 0);
-
+    std::string getFilename() const { return getStringField(11); }
+    std::string getDirectory() const { return getStringField(12); }
   };
   
   /// DIGlobalVariable - This is a wrapper for a global variable.
@@ -225,6 +233,8 @@
     explicit DIGlobalVariable(GlobalVariable *GV = 0);
     
     GlobalVariable *getGlobal() const { return getGlobalVariableField(11); }
+    std::string getFilename() const { return getStringField(12); }
+    std::string getDirectory() const { return getStringField(13); }
   };
   
   
@@ -240,6 +250,8 @@
     DICompileUnit getCompileUnit() const{ return getFieldAs<DICompileUnit>(3); }
     unsigned getLineNumber() const      { return getUnsignedField(4); }
     DIType getType() const              { return getFieldAs<DIType>(5); }
+    std::string getFilename() const { return getStringField(6); }
+    std::string getDirectory() const { return getStringField(7); }
     
     /// isVariable - Return true if the specified tag is legal for DIVariable.
     static bool isVariable(unsigned Tag);
@@ -310,7 +322,9 @@
                                 DICompileUnit CompileUnit, unsigned LineNumber,
                                 uint64_t SizeInBits, uint64_t AlignInBits,
                                 uint64_t OffsetInBits, unsigned Flags,
-                                unsigned Encoding);
+                                unsigned Encoding,
+                                const std::string *FileName = 0,
+                                const std::string *Directory = 0);
  
     /// CreateDerivedType - Create a derived type like const qualified type,
     /// pointer, typedef, etc.
@@ -320,7 +334,9 @@
                                     unsigned LineNumber,
                                     uint64_t SizeInBits, uint64_t AlignInBits,
                                     uint64_t OffsetInBits, unsigned Flags,
-                                    DIType DerivedFrom);
+                                    DIType DerivedFrom,
+                                    const std::string *FileName = 0,
+                                    const std::string *Directory = 0);
 
     /// CreateCompositeType - Create a composite type like array, struct, etc.
     DICompositeType CreateCompositeType(unsigned Tag, DIDescriptor Context,
@@ -331,7 +347,9 @@
                                         uint64_t AlignInBits,
                                         uint64_t OffsetInBits, unsigned Flags,
                                         DIType DerivedFrom,
-                                        DIArray Elements);
+                                        DIArray Elements,
+                                        const std::string *FileName = 0,
+                                        const std::string *Directory = 0);
     
     /// CreateSubprogram - Create a new descriptor for the specified subprogram.
     /// See comments in DISubprogram for descriptions of these fields.
@@ -340,7 +358,9 @@
                                   const std::string &LinkageName,
                                   DICompileUnit CompileUnit, unsigned LineNo,
                                   DIType Type, bool isLocalToUnit,
-                                  bool isDefinition);
+                                  bool isDefinition,
+                                  const std::string *FileName = 0,
+                                  const std::string *Directory = 0);
 
     /// CreateGlobalVariable - Create a new descriptor for the specified global.
     DIGlobalVariable
@@ -349,14 +369,18 @@
                          const std::string &LinkageName, 
                          DICompileUnit CompileUnit,
                          unsigned LineNo, DIType Type, bool isLocalToUnit,
-                         bool isDefinition, llvm::GlobalVariable *GV);
+                         bool isDefinition, llvm::GlobalVariable *GV,
+                         const std::string *FileName = 0,
+                         const std::string *Directory = 0);
     
     
     /// CreateVariable - Create a new descriptor for the specified variable.
     DIVariable CreateVariable(unsigned Tag, DIDescriptor Context,
                               const std::string &Name,
                               DICompileUnit CompileUnit, unsigned LineNo,
-                              DIType Type);
+                              DIType Type,
+                              const std::string *FileName = 0,
+                              const std::string *Directory = 0);
     
     /// CreateBlock - This creates a descriptor for a lexical block with the
     /// specified parent context.

Modified: llvm/trunk/include/llvm/CodeGen/MachineModuleInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineModuleInfo.h?rev=61164&r1=61163&r2=61164&view=diff

==============================================================================
--- llvm/trunk/include/llvm/CodeGen/MachineModuleInfo.h (original)
+++ llvm/trunk/include/llvm/CodeGen/MachineModuleInfo.h Wed Dec 17 16:39:29 2008
@@ -59,7 +59,8 @@
 // Debug info constants.
 
 enum {
-  LLVMDebugVersion = (6 << 16),         // Current version of debug information.
+  LLVMDebugVersion = (7 << 16),         // Current version of debug information.
+  LLVMDebugVersion6 = (6 << 16),        // Constant for version 6.
   LLVMDebugVersion5 = (5 << 16),        // Constant for version 5.
   LLVMDebugVersion4 = (4 << 16),        // Constant for version 4.
   LLVMDebugVersionMask = 0xffff0000     // Mask for version number.

Modified: llvm/trunk/lib/Analysis/DebugInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/DebugInfo.cpp?rev=61164&r1=61163&r2=61164&view=diff

==============================================================================
--- llvm/trunk/lib/Analysis/DebugInfo.cpp (original)
+++ llvm/trunk/lib/Analysis/DebugInfo.cpp Wed Dec 17 16:39:29 2008
@@ -195,7 +195,7 @@
 Constant *DIFactory::GetTagConstant(unsigned TAG) {
   assert((TAG & DIDescriptor::VersionMask) == 0 &&
          "Tag too large for debug encoding!");
-  return ConstantInt::get(Type::Int32Ty, TAG | DIDescriptor::Version6);
+  return ConstantInt::get(Type::Int32Ty, TAG | DIDescriptor::Version7);
 }
 
 Constant *DIFactory::GetStringConstant(const std::string &String) {
@@ -389,7 +389,9 @@
                                        uint64_t SizeInBits,
                                        uint64_t AlignInBits,
                                        uint64_t OffsetInBits, unsigned Flags,
-                                       unsigned Encoding) {
+                                       unsigned Encoding,
+                                       const std::string *FileName,
+                                       const std::string *Directory) {
   Constant *Elts[] = {
     GetTagConstant(dwarf::DW_TAG_base_type),
     getCastToEmpty(Context),
@@ -400,7 +402,9 @@
     ConstantInt::get(Type::Int64Ty, AlignInBits),
     ConstantInt::get(Type::Int64Ty, OffsetInBits),
     ConstantInt::get(Type::Int32Ty, Flags),
-    ConstantInt::get(Type::Int32Ty, Encoding)
+    ConstantInt::get(Type::Int32Ty, Encoding),
+    GetStringConstant(FileName ? FileName->c_str() : ""),
+    GetStringConstant(Directory ? Directory->c_str() : "")
   };
   
   Constant *Init = ConstantStruct::get(Elts, sizeof(Elts)/sizeof(Elts[0]));
@@ -424,7 +428,9 @@
                                            uint64_t AlignInBits,
                                            uint64_t OffsetInBits,
                                            unsigned Flags,
-                                           DIType DerivedFrom) {
+                                           DIType DerivedFrom,
+                                           const std::string *FileName,
+                                           const std::string *Directory) {
   Constant *Elts[] = {
     GetTagConstant(Tag),
     getCastToEmpty(Context),
@@ -435,7 +441,9 @@
     ConstantInt::get(Type::Int64Ty, AlignInBits),
     ConstantInt::get(Type::Int64Ty, OffsetInBits),
     ConstantInt::get(Type::Int32Ty, Flags),
-    getCastToEmpty(DerivedFrom)
+    getCastToEmpty(DerivedFrom),
+    GetStringConstant(FileName ? FileName->c_str() : ""),
+    GetStringConstant(Directory ? Directory->c_str() : "")
   };
   
   Constant *Init = ConstantStruct::get(Elts, sizeof(Elts)/sizeof(Elts[0]));
@@ -459,7 +467,10 @@
                                                uint64_t OffsetInBits,
                                                unsigned Flags,
                                                DIType DerivedFrom,
-                                               DIArray Elements) {
+                                               DIArray Elements,
+                                               const std::string *FileName,
+                                               const std::string *Directory) {
+
   Constant *Elts[] = {
     GetTagConstant(Tag),
     getCastToEmpty(Context),
@@ -471,7 +482,9 @@
     ConstantInt::get(Type::Int64Ty, OffsetInBits),
     ConstantInt::get(Type::Int32Ty, Flags),
     getCastToEmpty(DerivedFrom),
-    getCastToEmpty(Elements)
+    getCastToEmpty(Elements),
+    GetStringConstant(FileName ? FileName->c_str() : ""),
+    GetStringConstant(Directory ? Directory->c_str() : "")
   };
   
   Constant *Init = ConstantStruct::get(Elts, sizeof(Elts)/sizeof(Elts[0]));
@@ -495,7 +508,10 @@
                                          DICompileUnit CompileUnit,
                                          unsigned LineNo, DIType Type,
                                          bool isLocalToUnit,
-                                         bool isDefinition) {
+                                         bool isDefinition,
+                                         const std::string *FileName,
+                                         const std::string *Directory) {
+
   Constant *Elts[] = {
     GetTagConstant(dwarf::DW_TAG_subprogram),
     getCastToEmpty(GetOrCreateSubprogramAnchor()),
@@ -507,7 +523,9 @@
     ConstantInt::get(Type::Int32Ty, LineNo),
     getCastToEmpty(Type),
     ConstantInt::get(Type::Int1Ty, isLocalToUnit),
-    ConstantInt::get(Type::Int1Ty, isDefinition)
+    ConstantInt::get(Type::Int1Ty, isDefinition),
+    GetStringConstant(FileName ? FileName->c_str() : ""),
+    GetStringConstant(Directory ? Directory->c_str() : "")
   };
   
   Constant *Init = ConstantStruct::get(Elts, sizeof(Elts)/sizeof(Elts[0]));
@@ -527,8 +545,9 @@
                                 const std::string &LinkageName,
                                 DICompileUnit CompileUnit,
                                 unsigned LineNo, DIType Type,bool isLocalToUnit,
-                                bool isDefinition, llvm::GlobalVariable *Val) {
-  
+                                bool isDefinition, llvm::GlobalVariable *Val,
+                                const std::string *FileName,
+                                const std::string *Directory) {
   Constant *Elts[] = {
     GetTagConstant(dwarf::DW_TAG_variable),
     getCastToEmpty(GetOrCreateGlobalVariableAnchor()),
@@ -541,7 +560,9 @@
     getCastToEmpty(Type),
     ConstantInt::get(Type::Int1Ty, isLocalToUnit),
     ConstantInt::get(Type::Int1Ty, isDefinition),
-    ConstantExpr::getBitCast(Val, EmptyStructPtr)
+    ConstantExpr::getBitCast(Val, EmptyStructPtr),
+    GetStringConstant(FileName ? FileName->c_str() : ""),
+    GetStringConstant(Directory ? Directory->c_str() : "")
   };
   
   Constant *Init = ConstantStruct::get(Elts, sizeof(Elts)/sizeof(Elts[0]));
@@ -559,7 +580,10 @@
 DIVariable DIFactory::CreateVariable(unsigned Tag, DIDescriptor Context,
                                      const std::string &Name,
                                      DICompileUnit CompileUnit, unsigned LineNo,
-                                     DIType Type) {
+                                     DIType Type,
+                                     const std::string *FileName,
+                                     const std::string *Directory) {
+
   
   Constant *Elts[] = {
     GetTagConstant(Tag),
@@ -568,6 +592,8 @@
     getCastToEmpty(CompileUnit),
     ConstantInt::get(Type::Int32Ty, LineNo),
     getCastToEmpty(Type),
+    GetStringConstant(FileName ? FileName->c_str() : ""),
+    GetStringConstant(Directory ? Directory->c_str() : "")
   };
   
   Constant *Init = ConstantStruct::get(Elts, sizeof(Elts)/sizeof(Elts[0]));





More information about the llvm-commits mailing list