From ccbdc7ab82792ac5d7863ef086f11fb010d88073 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Mon, 9 Mar 2009 05:04:40 +0000 Subject: [PATCH] Pass in a std::string when getting the names of debugging things. This cuts down on the number of times a std::string is created and copied. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66396 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Analysis/DebugInfo.h | 42 ++++++++++---- lib/Analysis/DbgInfoPrinter.cpp | 10 ++-- lib/Analysis/DebugInfo.cpp | 49 +++++++++++----- lib/CodeGen/AsmPrinter/DwarfWriter.cpp | 57 ++++++++++++------- lib/CodeGen/SelectionDAG/FastISel.cpp | 10 ++-- lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 5 +- .../SelectionDAG/SelectionDAGBuild.cpp | 20 ++++--- .../SelectionDAG/SelectionDAGPrinter.cpp | 3 +- 8 files changed, 132 insertions(+), 64 deletions(-) diff --git a/include/llvm/Analysis/DebugInfo.h b/include/llvm/Analysis/DebugInfo.h index 91e64d8553f..c1be6460aa1 100644 --- a/include/llvm/Analysis/DebugInfo.h +++ b/include/llvm/Analysis/DebugInfo.h @@ -40,7 +40,7 @@ namespace llvm { /// not, the debug info is corrupt and we ignore it. DIDescriptor(GlobalVariable *GV, unsigned RequiredTag); - std::string getStringField(unsigned Elt) const; + const std::string &getStringField(unsigned Elt, std::string &Result) const; unsigned getUnsignedField(unsigned Elt) const { return (unsigned)getUInt64Field(Elt); } @@ -106,9 +106,15 @@ namespace llvm { explicit DICompileUnit(GlobalVariable *GV = 0); unsigned getLanguage() const { return getUnsignedField(2); } - std::string getFilename() const { return getStringField(3); } - std::string getDirectory() const { return getStringField(4); } - std::string getProducer() const { return getStringField(5); } + const std::string &getFilename(std::string &F) const { + return getStringField(3, F); + } + const std::string &getDirectory(std::string &F) const { + return getStringField(4, F); + } + const std::string &getProducer(std::string &F) const { + return getStringField(5, F); + } /// isMain - Each input file is encoded as a separate compile unit in LLVM /// debugging information output. However, many target specific tool chains @@ -121,7 +127,9 @@ namespace llvm { bool isMain() const { return getUnsignedField(6); } bool isOptimized() const { return getUnsignedField(7); } - std::string getFlags() const { return getStringField(8); } + const std::string &getFlags(std::string &F) const { + return getStringField(8, F); + } unsigned getRunTimeVersion() const { return getUnsignedField(9); } /// Verify - Verify that a compile unit is well formed. @@ -138,7 +146,9 @@ namespace llvm { public: explicit DIEnumerator(GlobalVariable *GV = 0); - std::string getName() const { return getStringField(1); } + const std::string &getName(std::string &F) const { + return getStringField(1, F); + } uint64_t getEnumValue() const { return getUInt64Field(2); } }; @@ -182,7 +192,9 @@ namespace llvm { virtual ~DIType() {} DIDescriptor getContext() const { return getDescriptorField(1); } - std::string getName() const { return getStringField(2); } + const std::string &getName(std::string &F) const { + return getStringField(2, F); + } DICompileUnit getCompileUnit() const{ return getFieldAs(3); } unsigned getLineNumber() const { return getUnsignedField(4); } uint64_t getSizeInBits() const { return getUInt64Field(5); } @@ -264,9 +276,15 @@ namespace llvm { virtual ~DIGlobal() {} DIDescriptor getContext() const { return getDescriptorField(2); } - std::string getName() const { return getStringField(3); } - std::string getDisplayName() const { return getStringField(4); } - std::string getLinkageName() const { return getStringField(5); } + const std::string &getName(std::string &F) const { + return getStringField(3, F); + } + const std::string &getDisplayName(std::string &F) const { + return getStringField(4, F); + } + const std::string &getLinkageName(std::string &F) const { + return getStringField(5, F); + } DICompileUnit getCompileUnit() const{ return getFieldAs(6); } unsigned getLineNumber() const { return getUnsignedField(7); } DIType getType() const { return getFieldAs(8); } @@ -313,7 +331,9 @@ namespace llvm { explicit DIVariable(GlobalVariable *GV = 0); DIDescriptor getContext() const { return getDescriptorField(1); } - std::string getName() const { return getStringField(2); } + const std::string &getName(std::string &F) const { + return getStringField(2, F); + } DICompileUnit getCompileUnit() const{ return getFieldAs(3); } unsigned getLineNumber() const { return getUnsignedField(4); } DIType getType() const { return getFieldAs(5); } diff --git a/lib/Analysis/DbgInfoPrinter.cpp b/lib/Analysis/DbgInfoPrinter.cpp index 522e98ff01b..127f931b6ed 100644 --- a/lib/Analysis/DbgInfoPrinter.cpp +++ b/lib/Analysis/DbgInfoPrinter.cpp @@ -59,8 +59,9 @@ void PrintDbgInfo::printVariableDeclaration(const Value *V) { if(const DbgDeclareInst* DDI = findDbgDeclare(V)) { DIVariable Var(cast(DDI->getVariable())); - Out << "; variable " << Var.getName() - << " of type " << Var.getType().getName() + std::string Res1, Res2; + Out << "; variable " << Var.getName(Res1) + << " of type " << Var.getType().getName(Res2) << " at line " << Var.getLineNumber() << "\n"; } } @@ -83,8 +84,9 @@ void PrintDbgInfo::printStopPoint(const DbgStopPointInst *DSI) void PrintDbgInfo::printFuncStart(const DbgFuncStartInst *FS) { DISubprogram Subprogram(cast(FS->getSubprogram())); - Out << ";fully qualified function name: " << Subprogram.getDisplayName() - << " return type: " << Subprogram.getType().getName() + std::string Res1, Res2; + Out << ";fully qualified function name: " << Subprogram.getDisplayName(Res1) + << " return type: " << Subprogram.getType().getName(Res2) << " at line " << Subprogram.getLineNumber() << "\n\n"; } diff --git a/lib/Analysis/DebugInfo.cpp b/lib/Analysis/DebugInfo.cpp index a063aa53ba4..4e229e96690 100644 --- a/lib/Analysis/DebugInfo.cpp +++ b/lib/Analysis/DebugInfo.cpp @@ -35,17 +35,23 @@ DIDescriptor::DIDescriptor(GlobalVariable *gv, unsigned RequiredTag) { GV = 0; } +const std::string & +DIDescriptor::getStringField(unsigned Elt, std::string &Result) const { + if (GV == 0) { + Result.clear(); + return Result; + } -std::string DIDescriptor::getStringField(unsigned Elt) const { - if (GV == 0) return ""; Constant *C = GV->getInitializer(); - if (C == 0 || Elt >= C->getNumOperands()) - return ""; + if (C == 0 || Elt >= C->getNumOperands()) { + Result.clear(); + return Result; + } - std::string Result; // Fills in the string if it succeeds if (!GetConstantStringInfo(C->getOperand(Elt), Result)) Result.clear(); + return Result; } @@ -59,7 +65,6 @@ uint64_t DIDescriptor::getUInt64Field(unsigned Elt) const { return 0; } - DIDescriptor DIDescriptor::getDescriptorField(unsigned Elt) const { if (GV == 0) return DIDescriptor(); Constant *C = GV->getInitializer(); @@ -185,7 +190,8 @@ unsigned DIArray::getNumElements() const { bool DICompileUnit::Verify() const { if (isNull()) return false; - if (getFilename().empty()) + std::string Res; + if (getFilename(Res).empty()) return false; // It is possible that directory and produce string is empty. return true; @@ -864,16 +870,22 @@ namespace llvm { void DICompileUnit::dump() const { if (getLanguage()) cerr << " [" << dwarf::LanguageString(getLanguage()) << "] "; - cerr << " [" << getDirectory() << "/" << getFilename() << " ]"; + + std::string Res1, Res2; + cerr << " [" << getDirectory(Res1) << "/" << getFilename(Res2) << " ]"; } /// dump - print type. void DIType::dump() const { if (isNull()) return; - if (!getName().empty()) - cerr << " [" << getName() << "] "; + + std::string Res; + if (!getName(Res).empty()) + cerr << " [" << Res << "] "; + unsigned Tag = getTag(); cerr << " [" << dwarf::TagString(Tag) << "] "; + // TODO : Print context getCompileUnit().dump(); cerr << " [" @@ -882,10 +894,12 @@ void DIType::dump() const { << getAlignInBits() << ", " << getOffsetInBits() << "] "; + if (isPrivate()) cerr << " [private] "; else if (isProtected()) cerr << " [protected] "; + if (isForwardDecl()) cerr << " [fwd] "; @@ -899,6 +913,7 @@ void DIType::dump() const { cerr << "Invalid DIType\n"; return; } + cerr << "\n"; } @@ -923,16 +938,20 @@ void DICompositeType::dump() const { /// dump - print global. void DIGlobal::dump() const { + std::string Res; + if (!getName(Res).empty()) + cerr << " [" << Res << "] "; - if (!getName().empty()) - cerr << " [" << getName() << "] "; unsigned Tag = getTag(); cerr << " [" << dwarf::TagString(Tag) << "] "; + // TODO : Print context getCompileUnit().dump(); cerr << " [" << getLineNumber() << "] "; + if (isLocalToUnit()) cerr << " [local] "; + if (isDefinition()) cerr << " [def] "; @@ -954,8 +973,10 @@ void DIGlobalVariable::dump() const { /// dump - print variable. void DIVariable::dump() const { - if (!getName().empty()) - cerr << " [" << getName() << "] "; + std::string Res; + if (!getName(Res).empty()) + cerr << " [" << Res << "] "; + getCompileUnit().dump(); cerr << " [" << getLineNumber() << "] "; getType().dump(); diff --git a/lib/CodeGen/AsmPrinter/DwarfWriter.cpp b/lib/CodeGen/AsmPrinter/DwarfWriter.cpp index 9181216b5ab..c5b24eff452 100644 --- a/lib/CodeGen/AsmPrinter/DwarfWriter.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfWriter.cpp @@ -1622,7 +1622,8 @@ private: DIBasicType BTy) { // Get core information. - const std::string &Name = BTy.getName(); + std::string Name; + BTy.getName(Name); Buffer.setTag(DW_TAG_base_type); AddUInt(&Buffer, DW_AT_encoding, DW_FORM_data1, BTy.getEncoding()); // Add name if not anonymous or intermediate type. @@ -1637,13 +1638,16 @@ private: DIDerivedType DTy) { // Get core information. - const std::string &Name = DTy.getName(); + std::string Name; + DTy.getName(Name); uint64_t Size = DTy.getSizeInBits() >> 3; unsigned Tag = DTy.getTag(); + // FIXME - Workaround for templates. if (Tag == DW_TAG_inheritance) Tag = DW_TAG_reference_type; Buffer.setTag(Tag); + // Map to main type, void will not have a type. DIType FromTy = DTy.getTypeDerivedFrom(); AddType(DW_Unit, &Buffer, FromTy); @@ -1665,12 +1669,14 @@ private: /// ConstructTypeDIE - Construct type DIE from DICompositeType. void ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer, DICompositeType CTy) { - // Get core information. - const std::string &Name = CTy.getName(); + std::string Name; + CTy.getName(Name); + uint64_t Size = CTy.getSizeInBits() >> 3; unsigned Tag = CTy.getTag(); Buffer.setTag(Tag); + switch (Tag) { case DW_TAG_vector_type: case DW_TAG_array_type: @@ -1806,7 +1812,8 @@ private: DIE *ConstructEnumTypeDIE(CompileUnit *DW_Unit, DIEnumerator *ETy) { DIE *Enumerator = new DIE(DW_TAG_enumerator); - const std::string &Name = ETy->getName(); + std::string Name; + ETy->getName(Name); AddString(Enumerator, DW_AT_name, DW_FORM_string, Name); int64_t Value = ETy->getEnumValue(); AddSInt(Enumerator, DW_AT_const_value, DW_FORM_sdata, Value); @@ -1817,9 +1824,11 @@ private: DIE *CreateGlobalVariableDIE(CompileUnit *DW_Unit, const DIGlobalVariable &GV) { DIE *GVDie = new DIE(DW_TAG_variable); - const std::string &Name = GV.getDisplayName(); + std::string Name; + GV.getDisplayName(Name); AddString(GVDie, DW_AT_name, DW_FORM_string, Name); - const std::string &LinkageName = GV.getLinkageName(); + std::string LinkageName; + GV.getLinkageName(LinkageName); if (!LinkageName.empty()) AddString(GVDie, DW_AT_MIPS_linkage_name, DW_FORM_string, LinkageName); AddType(DW_Unit, GVDie, GV.getType()); @@ -1832,7 +1841,8 @@ private: /// CreateMemberDIE - Create new member DIE. DIE *CreateMemberDIE(CompileUnit *DW_Unit, const DIDerivedType &DT) { DIE *MemberDie = new DIE(DT.getTag()); - const std::string &Name = DT.getName(); + std::string Name; + DT.getName(Name); if (!Name.empty()) AddString(MemberDie, DW_AT_name, DW_FORM_string, Name); @@ -1876,9 +1886,11 @@ private: const DISubprogram &SP, bool IsConstructor = false) { DIE *SPDie = new DIE(DW_TAG_subprogram); - const std::string &Name = SP.getName(); + std::string Name; + SP.getName(Name); AddString(SPDie, DW_AT_name, DW_FORM_string, Name); - const std::string &LinkageName = SP.getLinkageName(); + std::string LinkageName; + SP.getLinkageName(LinkageName); if (!LinkageName.empty()) AddString(SPDie, DW_AT_MIPS_linkage_name, DW_FORM_string, LinkageName); @@ -1945,7 +1957,8 @@ private: // Define variable debug information entry. DIE *VariableDie = new DIE(Tag); - const std::string &Name = VD.getName(); + std::string Name; + VD.getName(Name); AddString(VariableDie, DW_AT_name, DW_FORM_string, Name); // Add source line info if available. @@ -2769,21 +2782,23 @@ private: void ConstructCompileUnit(GlobalVariable *GV) { DICompileUnit DIUnit(GV); - unsigned ID = getOrCreateSourceID(DIUnit.getDirectory(), - DIUnit.getFilename()); + std::string Dir, FN, Prod; + unsigned ID = getOrCreateSourceID(DIUnit.getDirectory(Dir), + DIUnit.getFilename(FN)); DIE *Die = new DIE(DW_TAG_compile_unit); AddSectionOffset(Die, DW_AT_stmt_list, DW_FORM_data4, DWLabel("section_line", 0), DWLabel("section_line", 0), false); - AddString(Die, DW_AT_producer, DW_FORM_string, DIUnit.getProducer()); + AddString(Die, DW_AT_producer, DW_FORM_string, DIUnit.getProducer(Prod)); AddUInt(Die, DW_AT_language, DW_FORM_data1, DIUnit.getLanguage()); - 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()); + AddString(Die, DW_AT_name, DW_FORM_string, FN); + if (!Dir.empty()) + AddString(Die, DW_AT_comp_dir, DW_FORM_string, Dir); if (DIUnit.isOptimized()) AddUInt(Die, DW_AT_APPLE_optimized, DW_FORM_flag, 1); - const std::string &Flags = DIUnit.getFlags(); + std::string Flags; + DIUnit.getFlags(Flags); if (!Flags.empty()) AddString(Die, DW_AT_APPLE_flags, DW_FORM_string, Flags); unsigned RVer = DIUnit.getRunTimeVersion(); @@ -2843,7 +2858,8 @@ private: // Add to context owner. DW_Unit->getDie()->AddChild(VariableDie); // Expose as global. FIXME - need to check external flag. - DW_Unit->AddGlobal(DI_GV.getName(), VariableDie); + std::string Name; + DW_Unit->AddGlobal(DI_GV.getName(Name), VariableDie); return true; } @@ -2895,7 +2911,8 @@ private: // Add to context owner. Unit->getDie()->AddChild(SubprogramDie); // Expose as global. - Unit->AddGlobal(SP.getName(), SubprogramDie); + std::string Name; + Unit->AddGlobal(SP.getName(Name), SubprogramDie); return true; } diff --git a/lib/CodeGen/SelectionDAG/FastISel.cpp b/lib/CodeGen/SelectionDAG/FastISel.cpp index a0ed4755f9f..229376d293c 100644 --- a/lib/CodeGen/SelectionDAG/FastISel.cpp +++ b/lib/CodeGen/SelectionDAG/FastISel.cpp @@ -319,8 +319,9 @@ bool FastISel::SelectCall(User *I) { DbgStopPointInst *SPI = cast(I); if (DW && DW->ValidDebugInfo(SPI->getContext())) { DICompileUnit CU(cast(SPI->getContext())); - unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(), - CU.getFilename()); + std::string Dir, FN; + unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(Dir), + CU.getFilename(FN)); unsigned Line = SPI->getLine(); unsigned Col = SPI->getColumn(); unsigned ID = DW->RecordSourceLine(Line, Col, SrcFile); @@ -361,8 +362,9 @@ bool FastISel::SelectCall(User *I) { // (most?) gdb expects. DISubprogram Subprogram(cast(SP)); DICompileUnit CompileUnit = Subprogram.getCompileUnit(); - unsigned SrcFile = DW->getOrCreateSourceID(CompileUnit.getDirectory(), - CompileUnit.getFilename()); + std::string Dir, FN; + unsigned SrcFile = DW->getOrCreateSourceID(CompileUnit.getDirectory(Dir), + CompileUnit.getFilename(FN)); // Record the source line but does not create a label for the normal // function start. It will be emitted at asm emission time. However, diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 0854aad9b68..8c074e75ebf 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -1287,8 +1287,9 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) { GlobalVariable *CU_GV = cast(DSP->getCompileUnit()); if (DW && (useDEBUG_LOC || useLABEL) && !CU_GV->isDeclaration()) { DICompileUnit CU(cast(DSP->getCompileUnit())); - unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(), - CU.getFilename()); + std::string Dir, FN; + unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(Dir), + CU.getFilename(FN)); unsigned Line = DSP->getLine(); unsigned Col = DSP->getColumn(); diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp index b3a06ea9d75..0dbc35b2248 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp @@ -335,8 +335,9 @@ void FunctionLoweringInfo::set(Function &fn, MachineFunction &mf, if (DW && DW->ValidDebugInfo(SPI->getContext())) { DICompileUnit CU(cast(SPI->getContext())); - unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(), - CU.getFilename()); + std::string Dir, FN; + unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(Dir), + CU.getFilename(FN)); unsigned idx = MF->getOrCreateDebugLocID(SrcFile, SPI->getLine(), SPI->getColumn()); @@ -354,8 +355,9 @@ void FunctionLoweringInfo::set(Function &fn, MachineFunction &mf, if (DW->ValidDebugInfo(SP)) { DISubprogram Subprogram(cast(SP)); DICompileUnit CU(Subprogram.getCompileUnit()); - unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(), - CU.getFilename()); + std::string Dir, FN; + unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(Dir), + CU.getFilename(FN)); unsigned Line = Subprogram.getLineNumber(); DL = DebugLoc::get(MF->getOrCreateDebugLocID(SrcFile, Line, 0)); } @@ -3902,8 +3904,9 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) { SPI.getColumn(), SPI.getContext())); DICompileUnit CU(cast(SPI.getContext())); - unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(), - CU.getFilename()); + std::string Dir, FN; + unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(Dir), + CU.getFilename(FN)); unsigned idx = MF.getOrCreateDebugLocID(SrcFile, SPI.getLine(), SPI.getColumn()); setCurDebugLoc(DebugLoc::get(idx)); @@ -3947,8 +3950,9 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) { MachineFunction &MF = DAG.getMachineFunction(); DISubprogram Subprogram(cast(SP)); DICompileUnit CompileUnit = Subprogram.getCompileUnit(); - unsigned SrcFile = DW->getOrCreateSourceID(CompileUnit.getDirectory(), - CompileUnit.getFilename()); + std::string Dir, FN; + unsigned SrcFile = DW->getOrCreateSourceID(CompileUnit.getDirectory(Dir), + CompileUnit.getFilename(FN)); // Record the source line but does not create a label for the normal // function start. It will be emitted at asm emission time. However, diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp index 004cb247b1f..03923387625 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp @@ -179,7 +179,8 @@ std::string DOTGraphTraits::getNodeLabel(const SDNode *Node, } } else if (const DbgStopPointSDNode *D = dyn_cast(Node)) { DICompileUnit CU(cast(D->getCompileUnit())); - Op += ": " + CU.getFilename(); + std::string FN; + Op += ": " + CU.getFilename(FN); Op += ":" + utostr(D->getLine()); if (D->getColumn() != 0) Op += ":" + utostr(D->getColumn());