From 2140798cc4fe05fdaf04082abf6a3b03b2a005ab Mon Sep 17 00:00:00 2001 From: Jim Laskey Date: Tue, 14 Mar 2006 18:37:57 +0000 Subject: [PATCH] 1. Use null for serialized empty strings. 2. Allow for user defined debug descriptors. 3. Allow for user augmented fields on debug descriptors. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26760 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/MachineDebugInfo.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/lib/CodeGen/MachineDebugInfo.cpp b/lib/CodeGen/MachineDebugInfo.cpp index fa755f1923e..74f827acbfb 100644 --- a/lib/CodeGen/MachineDebugInfo.cpp +++ b/lib/CodeGen/MachineDebugInfo.cpp @@ -270,7 +270,11 @@ public: Elements.push_back(ConstantBool::get(Field)); } virtual void Apply(std::string &Field) { - Elements.push_back(SR.getString(Field)); + if (Field.empty()) { + Elements.push_back(NULL); + } else { + Elements.push_back(SR.getString(Field)); + } } virtual void Apply(DebugInfoDesc *&Field) { GlobalVariable *GV = NULL; @@ -417,7 +421,7 @@ public: } virtual void Apply(std::string &Field) { Constant *C = CI->getOperand(I++); - IsValid = IsValid && isStringValue(C); + IsValid = IsValid && (!C || isStringValue(C)); } virtual void Apply(DebugInfoDesc *&Field) { // FIXME - Prepare the correct descriptor. @@ -1086,11 +1090,13 @@ DebugInfoDesc *DIDeserializer::Deserialize(GlobalVariable *GV) { // Create an empty instance of the correct sort. Slot = DebugInfoDesc::DescFactory(Tag); - assert(Slot && "Unknown Tag"); - // Deserialize the fields. - DIDeserializeVisitor DRAM(*this, GV); - DRAM.ApplyToFields(Slot); + // If not a user defined descriptor. + if (Slot) { + // Deserialize the fields. + DIDeserializeVisitor DRAM(*this, GV); + DRAM.ApplyToFields(Slot); + } return Slot; } @@ -1238,7 +1244,9 @@ bool DIVerifier::Verify(GlobalVariable *GV) { // Construct an empty DebugInfoDesc. DebugInfoDesc *DD = DebugInfoDesc::DescFactory(Tag); - if (!DD) return false; + + // Allow for user defined descriptors. + if (!DD) return true; // Get the initializer constant. ConstantStruct *CI = cast(GV->getInitializer()); @@ -1255,8 +1263,8 @@ bool DIVerifier::Verify(GlobalVariable *GV) { Slot = CTAM.getCount(); } - // Field count must equal operand count. - if (Slot != N) { + // Field count must be at most equal operand count. + if (Slot > N) { delete DD; return false; }