diff options
author | Jim Laskey <jlaskey@mac.com> | 2006-02-28 20:15:07 +0000 |
---|---|---|
committer | Jim Laskey <jlaskey@mac.com> | 2006-02-28 20:15:07 +0000 |
commit | 45ccae5b7d658e9948f3cdfc8f06facaca536e1f (patch) | |
tree | 0188927431ddf97a94d1540398127c31b0bb80d4 /lib/CodeGen/MachineDebugInfo.cpp | |
parent | 06e1e253683a3e4b783bd449e44c6dd5ed5d4aa3 (diff) |
Add const, volatile, restrict support.
Add array of debug descriptor support.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26428 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/MachineDebugInfo.cpp')
-rw-r--r-- | lib/CodeGen/MachineDebugInfo.cpp | 69 |
1 files changed, 64 insertions, 5 deletions
diff --git a/lib/CodeGen/MachineDebugInfo.cpp b/lib/CodeGen/MachineDebugInfo.cpp index 72da0a0406..e4702ed1be 100644 --- a/lib/CodeGen/MachineDebugInfo.cpp +++ b/lib/CodeGen/MachineDebugInfo.cpp @@ -202,6 +202,9 @@ public: virtual void Apply(std::string &Field) { ++Count; } virtual void Apply(DebugInfoDesc *&Field) { ++Count; } virtual void Apply(GlobalVariable *&Field) { ++Count; } + virtual void Apply(std::vector<DebugInfoDesc *> &Field) { + ++Count; + } }; //===----------------------------------------------------------------------===// @@ -251,6 +254,17 @@ public: Constant *C = CI->getOperand(I++); Field = getGlobalVariable(C); } + virtual void Apply(std::vector<DebugInfoDesc *> &Field) { + Constant *C = CI->getOperand(I++); + GlobalVariable *GV = getGlobalVariable(C); + ConstantArray *CA = cast<ConstantArray>(GV->getInitializer()); + Field.resize(0); + for (unsigned i = 0, N = CA->getNumOperands(); i < N; ++i) { + GlobalVariable *GVE = getGlobalVariable(CA->getOperand(i)); + DebugInfoDesc *DE = DR.Deserialize(GVE); + Field.push_back(DE); + } + } }; //===----------------------------------------------------------------------===// @@ -310,6 +324,22 @@ public: Elements.push_back(ConstantPointerNull::get(EmptyTy)); } } + virtual void Apply(std::vector<DebugInfoDesc *> &Field) { + const PointerType *EmptyTy = SR.getEmptyStructPtrType(); + unsigned N = Field.size(); + ArrayType *AT = ArrayType::get(EmptyTy, N); + std::vector<Constant *> ArrayElements; + + for (unsigned i = 0, N = Field.size(); i < N; ++i) { + GlobalVariable *GVE = SR.Serialize(Field[i]); + Constant *CE = ConstantExpr::getCast(GVE, EmptyTy); + ArrayElements.push_back(cast<Constant>(CE)); + } + + Constant *CA = ConstantArray::get(AT, ArrayElements); + Constant *CAE = ConstantExpr::getCast(CA, EmptyTy); + Elements.push_back(CAE); + } }; //===----------------------------------------------------------------------===// @@ -353,6 +383,10 @@ public: const PointerType *EmptyTy = SR.getEmptyStructPtrType(); Fields.push_back(EmptyTy); } + virtual void Apply(std::vector<DebugInfoDesc *> &Field) { + const PointerType *EmptyTy = SR.getEmptyStructPtrType(); + Fields.push_back(EmptyTy); + } }; //===----------------------------------------------------------------------===// @@ -409,6 +443,27 @@ public: Constant *C = CI->getOperand(I++); IsValid = IsValid && isGlobalVariable(C); } + virtual void Apply(std::vector<DebugInfoDesc *> &Field) { + Constant *C = CI->getOperand(I++); + IsValid = IsValid && isGlobalVariable(C); + if (!IsValid) return; + + GlobalVariable *GV = getGlobalVariable(C); + IsValid = IsValid && GV && GV->hasInitializer(); + if (!IsValid) return; + + ConstantArray *CA = dyn_cast<ConstantArray>(GV->getInitializer()); + IsValid = IsValid && CA; + if (!IsValid) return; + + for (unsigned i = 0, N = CA->getNumOperands(); IsValid && i < N; ++i) { + IsValid = IsValid && isGlobalVariable(CA->getOperand(i)); + if (!IsValid) return; + + GlobalVariable *GVE = getGlobalVariable(CA->getOperand(i)); + VR.Verify(GVE); + } + } }; @@ -430,9 +485,12 @@ DebugInfoDesc *DebugInfoDesc::DescFactory(unsigned Tag) { case DI_TAG_global_variable: return new GlobalVariableDesc(); case DI_TAG_subprogram: return new SubprogramDesc(); case DI_TAG_basictype: return new BasicTypeDesc(); - case DI_TAG_typedef: return new DerivedTypeDesc(DI_TAG_typedef); - case DI_TAG_pointer: return new DerivedTypeDesc(DI_TAG_pointer); - case DI_TAG_reference: return new DerivedTypeDesc(DI_TAG_reference); + case DI_TAG_typedef: + case DI_TAG_pointer: + case DI_TAG_reference: + case DI_TAG_const: + case DI_TAG_volatile: + case DI_TAG_restrict: return new DerivedTypeDesc(Tag); default: break; } return NULL; @@ -639,8 +697,7 @@ DerivedTypeDesc::DerivedTypeDesc(unsigned T) : TypeDesc(T) , FromType(NULL) { - assert((T == DI_TAG_typedef || T == DI_TAG_pointer || T == DI_TAG_reference)&& - "Unknown derived type."); + assert(classof((const DebugInfoDesc *)this) && "Unknown derived type."); } /// ApplyToFields - Target the visitor to the fields of the DerivedTypeDesc. @@ -777,6 +834,8 @@ void SubprogramDesc::dump() { } #endif +//===----------------------------------------------------------------------===// + DebugInfoDesc *DIDeserializer::Deserialize(Value *V) { return Deserialize(getGlobalVariable(V)); } |