Sort out mangled names for globals
authorJim Laskey <jlaskey@mac.com>
Mon, 18 Sep 2006 14:47:26 +0000 (14:47 +0000)
committerJim Laskey <jlaskey@mac.com>
Mon, 18 Sep 2006 14:47:26 +0000 (14:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30460 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/MachineDebugInfo.h
lib/CodeGen/DwarfWriter.cpp

index 17d28d8c7b9b2203a597527c36c65ff45b3a0133..c02eaf7224fa60e235d9291a0c6f92093d0ba3f8 100644 (file)
@@ -622,6 +622,9 @@ public:
   }
   void setIsStatic(bool IS)                        { IsStatic = IS; }
   void setIsDefinition(bool ID)                    { IsDefinition = ID; }
+  bool hasMangledName()                      const {
+    return !DisplayName.empty();
+  }
 
   /// ApplyToFields - Target the visitor to the fields of the GlobalDesc.
   ///
index 22d67449e1744740ce57e2d56521541cf2e6be3b..0921cc5c6478971da21fe7a64a1ab920d9235967 100644 (file)
@@ -1592,20 +1592,23 @@ DIE *DwarfWriter::NewGlobalVariable(GlobalVariableDesc *GVD) {
   
   // Get the global variable itself.
   GlobalVariable *GV = GVD->getGlobalVariable();
-  // Generate the mangled name.
-  std::string MangledName = Asm->Mang->getValueName(GV);
 
-  // Gather the details (simplify add attribute code.)
-  const std::string &Name = GVD->getName();
-  
+  const std::string &Name = GVD->hasMangledName() ? GVD->getDisplayName()
+                                                  : GVD->getName();
+  const std::string &MangledName = GVD->hasMangledName() ? GVD->getName()
+                                                         : "";
   // Get the global's type.
   DIE *Type = NewType(Unit->getDie(), GVD->getType(), Unit); 
 
   // Create the globale variable DIE.
   DIE *VariableDie = new DIE(DW_TAG_variable);
-  VariableDie->AddString     (DW_AT_name,      DW_FORM_string, Name);
-  VariableDie->AddDIEntry    (DW_AT_type,      DW_FORM_ref4,   Type);
-  VariableDie->AddUInt       (DW_AT_external,  DW_FORM_flag,   1);
+  VariableDie->AddString(DW_AT_name, DW_FORM_string, Name);
+  if (!MangledName.empty()) {
+    VariableDie->AddString(DW_AT_MIPS_linkage_name, DW_FORM_string,
+                           MangledName);
+  }
+  VariableDie->AddDIEntry(DW_AT_type, DW_FORM_ref4, Type);
+  VariableDie->AddUInt(DW_AT_external, DW_FORM_flag, 1);
   
   // Add source line info if available.
   AddSourceLine(VariableDie, UnitDesc, GVD->getLine());
@@ -1642,17 +1645,24 @@ DIE *DwarfWriter::NewSubprogram(SubprogramDesc *SPD) {
   if (Slot) return Slot;
   
   // Gather the details (simplify add attribute code.)
-  const std::string &Name = SPD->getName();
+  const std::string &Name = SPD->hasMangledName() ? SPD->getDisplayName()
+                                                  : SPD->getName();
+  const std::string &MangledName = SPD->hasMangledName() ? SPD->getName()
+                                                         : "";
   DIE *Type = NewType(Unit->getDie(), SPD->getType(), Unit); 
   unsigned IsExternal = SPD->isStatic() ? 0 : 1;
                                     
   DIE *SubprogramDie = new DIE(DW_TAG_subprogram);
-  SubprogramDie->AddString     (DW_AT_name,      DW_FORM_string, Name);
+  SubprogramDie->AddString(DW_AT_name, DW_FORM_string, Name);
+  if (!MangledName.empty()) {
+    SubprogramDie->AddString(DW_AT_MIPS_linkage_name, DW_FORM_string,
+                             MangledName);
+  }
   if (Type) {
-    SubprogramDie->AddDIEntry    (DW_AT_type,      DW_FORM_ref4,   Type);
+    SubprogramDie->AddDIEntry(DW_AT_type, DW_FORM_ref4, Type);
   }
-  SubprogramDie->AddUInt       (DW_AT_external,    DW_FORM_flag,   IsExternal);
-  SubprogramDie->AddUInt       (DW_AT_prototyped,  DW_FORM_flag,   1);
+  SubprogramDie->AddUInt(DW_AT_external, DW_FORM_flag, IsExternal);
+  SubprogramDie->AddUInt(DW_AT_prototyped, DW_FORM_flag, 1);
   
   // Add source line info if available.
   AddSourceLine(SubprogramDie, UnitDesc, SPD->getLine());