MachineModuleInfo.cpp revision 57810cdac4c842b4b395d2a0b2fae406aacb3ee4
16da186480b55c10b96a255ce0a4ab731155da907Jim Laskey//===-- llvm/CodeGen/MachineModuleInfo.cpp ----------------------*- C++ -*-===// 26af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey// 36af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey// The LLVM Compiler Infrastructure 46af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey// 56af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey// This file was developed by James M. Laskey and is distributed under 66af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey// the University of Illinois Open Source License. See LICENSE.TXT for details. 76af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey// 86af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey//===----------------------------------------------------------------------===// 96af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey 106da186480b55c10b96a255ce0a4ab731155da907Jim Laskey#include "llvm/CodeGen/MachineModuleInfo.h" 116af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey 12b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey#include "llvm/Constants.h" 139d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey#include "llvm/CodeGen/MachineFunctionPass.h" 149d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey#include "llvm/CodeGen/MachineFunction.h" 154188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey#include "llvm/CodeGen/MachineLocation.h" 169d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey#include "llvm/Target/TargetInstrInfo.h" 179d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey#include "llvm/Target/TargetMachine.h" 18c1c47c3fa4d6d21b65924c02ab2f228e6285152dJim Laskey#include "llvm/Target/TargetOptions.h" 19b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey#include "llvm/DerivedTypes.h" 2086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey#include "llvm/GlobalVariable.h" 21b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey#include "llvm/Intrinsics.h" 22b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey#include "llvm/Instructions.h" 23b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey#include "llvm/Module.h" 24b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey#include "llvm/Support/Dwarf.h" 25832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling#include "llvm/Support/Streams.h" 266af5681824713544a7a8c6e115649b29d59b3d13Jim Laskeyusing namespace llvm; 279c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskeyusing namespace llvm::dwarf; 286af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey 296af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey// Handle the Pass registration stuff necessary to use TargetData's. 306af5681824713544a7a8c6e115649b29d59b3d13Jim Laskeynamespace { 316da186480b55c10b96a255ce0a4ab731155da907Jim Laskey RegisterPass<MachineModuleInfo> X("machinemoduleinfo", "Module Information"); 326af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey} 331997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patelchar MachineModuleInfo::ID = 0; 34063e765345fd49df0f53b807e57ada7c2ded7e16Jim Laskey 35b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey//===----------------------------------------------------------------------===// 36b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 3786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// getGlobalVariablesUsing - Return all of the GlobalVariables which have the 38b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey/// specified value in their initializer somewhere. 39b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskeystatic void 40b3e789ac2548a4382d0db03b573fd8a127617f8fJim LaskeygetGlobalVariablesUsing(Value *V, std::vector<GlobalVariable*> &Result) { 41b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey // Scan though value users. 42b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey for (Value::use_iterator I = V->use_begin(), E = V->use_end(); I != E; ++I) { 43b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey if (GlobalVariable *GV = dyn_cast<GlobalVariable>(*I)) { 4486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // If the user is a GlobalVariable then add to result. 45b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey Result.push_back(GV); 46b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey } else if (Constant *C = dyn_cast<Constant>(*I)) { 47b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey // If the user is a constant variable then scan its users 48b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey getGlobalVariablesUsing(C, Result); 49b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey } 50b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey } 51b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 52b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 5386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// getGlobalVariablesUsing - Return all of the GlobalVariables that use the 5486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// named GlobalVariable. 55b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskeystatic std::vector<GlobalVariable*> 56b3e789ac2548a4382d0db03b573fd8a127617f8fJim LaskeygetGlobalVariablesUsing(Module &M, const std::string &RootName) { 5786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey std::vector<GlobalVariable*> Result; // GlobalVariables matching criteria. 58ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 59ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey std::vector<const Type*> FieldTypes; 6047857812e29324a9d1560796a05b53d3a9217fd9Reid Spencer FieldTypes.push_back(Type::Int32Ty); 6147857812e29324a9d1560796a05b53d3a9217fd9Reid Spencer FieldTypes.push_back(Type::Int32Ty); 62b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 6386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Get the GlobalVariable root. 64b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey GlobalVariable *UseRoot = M.getGlobalVariable(RootName, 65ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey StructType::get(FieldTypes)); 66b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 67b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey // If present and linkonce then scan for users. 68b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey if (UseRoot && UseRoot->hasLinkOnceLinkage()) { 69b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey getGlobalVariablesUsing(UseRoot, Result); 70b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey } 71b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 72b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey return Result; 73b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 74b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 7586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// isStringValue - Return true if the given value can be coerced to a string. 7686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// 7786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskeystatic bool isStringValue(Value *V) { 7886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V)) { 7986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey if (GV->hasInitializer() && isa<ConstantArray>(GV->getInitializer())) { 8086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey ConstantArray *Init = cast<ConstantArray>(GV->getInitializer()); 8186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey return Init->isString(); 8286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 8386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } else if (Constant *C = dyn_cast<Constant>(V)) { 8486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey if (GlobalValue *GV = dyn_cast<GlobalValue>(C)) 8586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey return isStringValue(GV); 8686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) { 8786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey if (CE->getOpcode() == Instruction::GetElementPtr) { 8886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey if (CE->getNumOperands() == 3 && 8986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey cast<Constant>(CE->getOperand(1))->isNullValue() && 9086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey isa<ConstantInt>(CE->getOperand(2))) { 9186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey return isStringValue(CE->getOperand(0)); 9286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 9386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 9486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 9586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 9686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey return false; 9786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey} 9886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 99c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey/// getGlobalVariable - Return either a direct or cast Global value. 100d8f77bae03b4ff701ed24ce74d1bf079f2dd197fJim Laskey/// 101c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskeystatic GlobalVariable *getGlobalVariable(Value *V) { 102d8f77bae03b4ff701ed24ce74d1bf079f2dd197fJim Laskey if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V)) { 103d8f77bae03b4ff701ed24ce74d1bf079f2dd197fJim Laskey return GV; 104d8f77bae03b4ff701ed24ce74d1bf079f2dd197fJim Laskey } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) { 1053da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer if (CE->getOpcode() == Instruction::BitCast) { 10686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey return dyn_cast<GlobalVariable>(CE->getOperand(0)); 10786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 108d8f77bae03b4ff701ed24ce74d1bf079f2dd197fJim Laskey } 109d8f77bae03b4ff701ed24ce74d1bf079f2dd197fJim Laskey return NULL; 110d8f77bae03b4ff701ed24ce74d1bf079f2dd197fJim Laskey} 111d8f77bae03b4ff701ed24ce74d1bf079f2dd197fJim Laskey 112c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey/// isGlobalVariable - Return true if the given value can be coerced to a 11386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// GlobalVariable. 114c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskeystatic bool isGlobalVariable(Value *V) { 11586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey if (isa<GlobalVariable>(V) || isa<ConstantPointerNull>(V)) { 11686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey return true; 11786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) { 1183da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer if (CE->getOpcode() == Instruction::BitCast) { 11986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey return isa<GlobalVariable>(CE->getOperand(0)); 12086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 12186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 12286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey return false; 12386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey} 12486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 125c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey/// getUIntOperand - Return ith operand if it is an unsigned integer. 12686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// 127b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencerstatic ConstantInt *getUIntOperand(GlobalVariable *GV, unsigned i) { 12886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Make sure the GlobalVariable has an initializer. 129c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey if (!GV->hasInitializer()) return NULL; 13086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 13186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Get the initializer constant. 13286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey ConstantStruct *CI = dyn_cast<ConstantStruct>(GV->getInitializer()); 133c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey if (!CI) return NULL; 134b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 13586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Check if there is at least i + 1 operands. 13686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey unsigned N = CI->getNumOperands(); 137c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey if (i >= N) return NULL; 13886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 13986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Check constant. 140b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer return dyn_cast<ConstantInt>(CI->getOperand(i)); 14186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey} 142b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer 14386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey//===----------------------------------------------------------------------===// 14486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 145c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey/// ApplyToFields - Target the visitor to each field of the debug information 14686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// descriptor. 147c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskeyvoid DIVisitor::ApplyToFields(DebugInfoDesc *DD) { 14886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey DD->ApplyToFields(this); 14986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey} 15086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 15186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey//===----------------------------------------------------------------------===// 152c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey/// DICountVisitor - This DIVisitor counts all the fields in the supplied debug 153c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey/// the supplied DebugInfoDesc. 154c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskeyclass DICountVisitor : public DIVisitor { 15586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskeyprivate: 15686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey unsigned Count; // Running count of fields. 15786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 15886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskeypublic: 159ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey DICountVisitor() : DIVisitor(), Count(0) {} 160b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 16186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Accessors. 16286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey unsigned getCount() const { return Count; } 16386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 16486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey /// Apply - Count each of the fields. 16586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey /// 16686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(int &Field) { ++Count; } 16786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(unsigned &Field) { ++Count; } 168f8913f19ae83927521103b9c84189c8d716e85adJim Laskey virtual void Apply(int64_t &Field) { ++Count; } 169f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey virtual void Apply(uint64_t &Field) { ++Count; } 17086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(bool &Field) { ++Count; } 17186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(std::string &Field) { ++Count; } 17286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(DebugInfoDesc *&Field) { ++Count; } 17386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(GlobalVariable *&Field) { ++Count; } 17445ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey virtual void Apply(std::vector<DebugInfoDesc *> &Field) { 17545ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey ++Count; 17645ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey } 17786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey}; 17886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 179b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey//===----------------------------------------------------------------------===// 180c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey/// DIDeserializeVisitor - This DIVisitor deserializes all the fields in the 181c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey/// supplied DebugInfoDesc. 182c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskeyclass DIDeserializeVisitor : public DIVisitor { 18386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskeyprivate: 18486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey DIDeserializer &DR; // Active deserializer. 18586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey unsigned I; // Current operand index. 18686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey ConstantStruct *CI; // GlobalVariable constant initializer. 18786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 18886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskeypublic: 189c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey DIDeserializeVisitor(DIDeserializer &D, GlobalVariable *GV) 190c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey : DIVisitor() 19186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey , DR(D) 192ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey , I(0) 19386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey , CI(cast<ConstantStruct>(GV->getInitializer())) 19486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey {} 19586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 19686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey /// Apply - Set the value of each of the fields. 19786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey /// 19886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(int &Field) { 19986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Constant *C = CI->getOperand(I++); 200b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer Field = cast<ConstantInt>(C)->getSExtValue(); 20186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 20286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(unsigned &Field) { 20386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Constant *C = CI->getOperand(I++); 204b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer Field = cast<ConstantInt>(C)->getZExtValue(); 20586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 206f8913f19ae83927521103b9c84189c8d716e85adJim Laskey virtual void Apply(int64_t &Field) { 207f8913f19ae83927521103b9c84189c8d716e85adJim Laskey Constant *C = CI->getOperand(I++); 208b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer Field = cast<ConstantInt>(C)->getSExtValue(); 209f8913f19ae83927521103b9c84189c8d716e85adJim Laskey } 210f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey virtual void Apply(uint64_t &Field) { 211f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey Constant *C = CI->getOperand(I++); 212b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer Field = cast<ConstantInt>(C)->getZExtValue(); 213f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey } 21486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(bool &Field) { 21586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Constant *C = CI->getOperand(I++); 216579dca12c2cfd60bc18aaadbd5331897d48fec29Reid Spencer Field = cast<ConstantInt>(C)->getZExtValue(); 21786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 21886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(std::string &Field) { 21986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Constant *C = CI->getOperand(I++); 22021b6c9d6477c8df3f884c3f1ebeaaa44dd53aafeJim Laskey Field = C->getStringValue(); 22186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 22286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(DebugInfoDesc *&Field) { 22386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Constant *C = CI->getOperand(I++); 22486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Field = DR.Deserialize(C); 22586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 22686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(GlobalVariable *&Field) { 22786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Constant *C = CI->getOperand(I++); 228c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey Field = getGlobalVariable(C); 22986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 23045ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey virtual void Apply(std::vector<DebugInfoDesc *> &Field) { 231d04c159ac13abbf15de719de1637c59dc38d4216Jim Laskey Field.resize(0); 23245ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey Constant *C = CI->getOperand(I++); 23345ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey GlobalVariable *GV = getGlobalVariable(C); 234d04c159ac13abbf15de719de1637c59dc38d4216Jim Laskey if (GV->hasInitializer()) { 235d04c159ac13abbf15de719de1637c59dc38d4216Jim Laskey if (ConstantArray *CA = dyn_cast<ConstantArray>(GV->getInitializer())) { 236d04c159ac13abbf15de719de1637c59dc38d4216Jim Laskey for (unsigned i = 0, N = CA->getNumOperands(); i < N; ++i) { 237d04c159ac13abbf15de719de1637c59dc38d4216Jim Laskey GlobalVariable *GVE = getGlobalVariable(CA->getOperand(i)); 238d04c159ac13abbf15de719de1637c59dc38d4216Jim Laskey DebugInfoDesc *DE = DR.Deserialize(GVE); 239d04c159ac13abbf15de719de1637c59dc38d4216Jim Laskey Field.push_back(DE); 240d04c159ac13abbf15de719de1637c59dc38d4216Jim Laskey } 241d04c159ac13abbf15de719de1637c59dc38d4216Jim Laskey } else if (GV->getInitializer()->isNullValue()) { 242d04c159ac13abbf15de719de1637c59dc38d4216Jim Laskey if (const ArrayType *T = 243d04c159ac13abbf15de719de1637c59dc38d4216Jim Laskey dyn_cast<ArrayType>(GV->getType()->getElementType())) { 244d04c159ac13abbf15de719de1637c59dc38d4216Jim Laskey Field.resize(T->getNumElements()); 245d04c159ac13abbf15de719de1637c59dc38d4216Jim Laskey } 2462b0e309640c638025d83c8f6f4ee2698ba1b8b92Jim Laskey } 24745ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey } 24845ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey } 24986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey}; 250b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 25186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey//===----------------------------------------------------------------------===// 252c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey/// DISerializeVisitor - This DIVisitor serializes all the fields in 25386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// the supplied DebugInfoDesc. 254c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskeyclass DISerializeVisitor : public DIVisitor { 25586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskeyprivate: 25686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey DISerializer &SR; // Active serializer. 25786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey std::vector<Constant*> &Elements; // Element accumulator. 25886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 25986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskeypublic: 260c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey DISerializeVisitor(DISerializer &S, std::vector<Constant*> &E) 261c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey : DIVisitor() 26286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey , SR(S) 26386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey , Elements(E) 26486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey {} 26586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 26686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey /// Apply - Set the value of each of the fields. 26786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey /// 26886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(int &Field) { 26947857812e29324a9d1560796a05b53d3a9217fd9Reid Spencer Elements.push_back(ConstantInt::get(Type::Int32Ty, int32_t(Field))); 27086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 27186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(unsigned &Field) { 27247857812e29324a9d1560796a05b53d3a9217fd9Reid Spencer Elements.push_back(ConstantInt::get(Type::Int32Ty, uint32_t(Field))); 27386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 274f8913f19ae83927521103b9c84189c8d716e85adJim Laskey virtual void Apply(int64_t &Field) { 27547857812e29324a9d1560796a05b53d3a9217fd9Reid Spencer Elements.push_back(ConstantInt::get(Type::Int64Ty, int64_t(Field))); 276f8913f19ae83927521103b9c84189c8d716e85adJim Laskey } 277f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey virtual void Apply(uint64_t &Field) { 27847857812e29324a9d1560796a05b53d3a9217fd9Reid Spencer Elements.push_back(ConstantInt::get(Type::Int64Ty, uint64_t(Field))); 279f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey } 28086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(bool &Field) { 281579dca12c2cfd60bc18aaadbd5331897d48fec29Reid Spencer Elements.push_back(ConstantInt::get(Type::Int1Ty, Field)); 28286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 28386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(std::string &Field) { 2842140798cc4fe05fdaf04082abf6a3b03b2a005abJim Laskey Elements.push_back(SR.getString(Field)); 28586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 28686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(DebugInfoDesc *&Field) { 28786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey GlobalVariable *GV = NULL; 28886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 2899d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey // If non-NULL then convert to global. 29086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey if (Field) GV = SR.Serialize(Field); 29186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 29286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // FIXME - At some point should use specific type. 29386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey const PointerType *EmptyTy = SR.getEmptyStructPtrType(); 29486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 29586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey if (GV) { 29686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Set to pointer to global. 29715f46d6c280cc91be70c60ed181931fbe0088652Reid Spencer Elements.push_back(ConstantExpr::getBitCast(GV, EmptyTy)); 29886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } else { 29986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Use NULL. 30086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Elements.push_back(ConstantPointerNull::get(EmptyTy)); 30186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 30286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 30386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(GlobalVariable *&Field) { 30486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey const PointerType *EmptyTy = SR.getEmptyStructPtrType(); 305ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey if (Field) { 30615f46d6c280cc91be70c60ed181931fbe0088652Reid Spencer Elements.push_back(ConstantExpr::getBitCast(Field, EmptyTy)); 307ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey } else { 308ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey Elements.push_back(ConstantPointerNull::get(EmptyTy)); 309ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey } 31086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 31145ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey virtual void Apply(std::vector<DebugInfoDesc *> &Field) { 31245ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey const PointerType *EmptyTy = SR.getEmptyStructPtrType(); 31345ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey unsigned N = Field.size(); 31445ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey ArrayType *AT = ArrayType::get(EmptyTy, N); 31545ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey std::vector<Constant *> ArrayElements; 31645ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey 31745ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey for (unsigned i = 0, N = Field.size(); i < N; ++i) { 318d04c159ac13abbf15de719de1637c59dc38d4216Jim Laskey if (DebugInfoDesc *Element = Field[i]) { 319d04c159ac13abbf15de719de1637c59dc38d4216Jim Laskey GlobalVariable *GVE = SR.Serialize(Element); 32015f46d6c280cc91be70c60ed181931fbe0088652Reid Spencer Constant *CE = ConstantExpr::getBitCast(GVE, EmptyTy); 321d04c159ac13abbf15de719de1637c59dc38d4216Jim Laskey ArrayElements.push_back(cast<Constant>(CE)); 322d04c159ac13abbf15de719de1637c59dc38d4216Jim Laskey } else { 323d04c159ac13abbf15de719de1637c59dc38d4216Jim Laskey ArrayElements.push_back(ConstantPointerNull::get(EmptyTy)); 324d04c159ac13abbf15de719de1637c59dc38d4216Jim Laskey } 32545ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey } 32645ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey 32745ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey Constant *CA = ConstantArray::get(AT, ArrayElements); 328f8913f19ae83927521103b9c84189c8d716e85adJim Laskey GlobalVariable *CAGV = new GlobalVariable(AT, true, 329f8913f19ae83927521103b9c84189c8d716e85adJim Laskey GlobalValue::InternalLinkage, 330f8913f19ae83927521103b9c84189c8d716e85adJim Laskey CA, "llvm.dbg.array", 331f8913f19ae83927521103b9c84189c8d716e85adJim Laskey SR.getModule()); 3327809811e4ed3c2462efa327cef0464b9844baea2Jim Laskey CAGV->setSection("llvm.metadata"); 33315f46d6c280cc91be70c60ed181931fbe0088652Reid Spencer Constant *CAE = ConstantExpr::getBitCast(CAGV, EmptyTy); 33445ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey Elements.push_back(CAE); 33545ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey } 33686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey}; 33786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 33886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey//===----------------------------------------------------------------------===// 339c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey/// DIGetTypesVisitor - This DIVisitor gathers all the field types in 34086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// the supplied DebugInfoDesc. 341c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskeyclass DIGetTypesVisitor : public DIVisitor { 34286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskeyprivate: 34386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey DISerializer &SR; // Active serializer. 34486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey std::vector<const Type*> &Fields; // Type accumulator. 34586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 34686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskeypublic: 347c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey DIGetTypesVisitor(DISerializer &S, std::vector<const Type*> &F) 348c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey : DIVisitor() 34986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey , SR(S) 35086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey , Fields(F) 35186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey {} 35286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 35386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey /// Apply - Set the value of each of the fields. 35486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey /// 35586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(int &Field) { 35647857812e29324a9d1560796a05b53d3a9217fd9Reid Spencer Fields.push_back(Type::Int32Ty); 35786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 35886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(unsigned &Field) { 35947857812e29324a9d1560796a05b53d3a9217fd9Reid Spencer Fields.push_back(Type::Int32Ty); 36086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 361f8913f19ae83927521103b9c84189c8d716e85adJim Laskey virtual void Apply(int64_t &Field) { 36247857812e29324a9d1560796a05b53d3a9217fd9Reid Spencer Fields.push_back(Type::Int64Ty); 363f8913f19ae83927521103b9c84189c8d716e85adJim Laskey } 364f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey virtual void Apply(uint64_t &Field) { 36547857812e29324a9d1560796a05b53d3a9217fd9Reid Spencer Fields.push_back(Type::Int64Ty); 366f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey } 36786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(bool &Field) { 3684fe16d607d11e29d742208894909733f5ad01f8fReid Spencer Fields.push_back(Type::Int1Ty); 36986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 37086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(std::string &Field) { 37186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Fields.push_back(SR.getStrPtrType()); 37286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 37386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(DebugInfoDesc *&Field) { 37486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // FIXME - At some point should use specific type. 37586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey const PointerType *EmptyTy = SR.getEmptyStructPtrType(); 37686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Fields.push_back(EmptyTy); 37786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 37886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(GlobalVariable *&Field) { 37986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey const PointerType *EmptyTy = SR.getEmptyStructPtrType(); 38086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Fields.push_back(EmptyTy); 38186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 38245ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey virtual void Apply(std::vector<DebugInfoDesc *> &Field) { 38345ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey const PointerType *EmptyTy = SR.getEmptyStructPtrType(); 38445ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey Fields.push_back(EmptyTy); 38545ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey } 38686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey}; 38786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 38886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey//===----------------------------------------------------------------------===// 389c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey/// DIVerifyVisitor - This DIVisitor verifies all the field types against 39086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// a constant initializer. 391c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskeyclass DIVerifyVisitor : public DIVisitor { 39286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskeyprivate: 39386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey DIVerifier &VR; // Active verifier. 39486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey bool IsValid; // Validity status. 39586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey unsigned I; // Current operand index. 39686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey ConstantStruct *CI; // GlobalVariable constant initializer. 39786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 39886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskeypublic: 399c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey DIVerifyVisitor(DIVerifier &V, GlobalVariable *GV) 400c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey : DIVisitor() 40186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey , VR(V) 40286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey , IsValid(true) 403ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey , I(0) 40486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey , CI(cast<ConstantStruct>(GV->getInitializer())) 40586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey { 40686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 40786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 40886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Accessors. 40986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey bool isValid() const { return IsValid; } 41086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 41186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey /// Apply - Set the value of each of the fields. 41286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey /// 41386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(int &Field) { 41486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Constant *C = CI->getOperand(I++); 41586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey IsValid = IsValid && isa<ConstantInt>(C); 41686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 41786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(unsigned &Field) { 41886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Constant *C = CI->getOperand(I++); 41986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey IsValid = IsValid && isa<ConstantInt>(C); 42086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 421f8913f19ae83927521103b9c84189c8d716e85adJim Laskey virtual void Apply(int64_t &Field) { 422f8913f19ae83927521103b9c84189c8d716e85adJim Laskey Constant *C = CI->getOperand(I++); 423f8913f19ae83927521103b9c84189c8d716e85adJim Laskey IsValid = IsValid && isa<ConstantInt>(C); 424f8913f19ae83927521103b9c84189c8d716e85adJim Laskey } 425f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey virtual void Apply(uint64_t &Field) { 426f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey Constant *C = CI->getOperand(I++); 427f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey IsValid = IsValid && isa<ConstantInt>(C); 428f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey } 42986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(bool &Field) { 43086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Constant *C = CI->getOperand(I++); 4314fe16d607d11e29d742208894909733f5ad01f8fReid Spencer IsValid = IsValid && isa<ConstantInt>(C) && C->getType() == Type::Int1Ty; 43286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 43386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(std::string &Field) { 43486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Constant *C = CI->getOperand(I++); 43526a3687d53b7381dd2b6abdd2e4e38271c8da37eJim Laskey IsValid = IsValid && 43626a3687d53b7381dd2b6abdd2e4e38271c8da37eJim Laskey (!C || isStringValue(C) || C->isNullValue()); 43786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 43886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(DebugInfoDesc *&Field) { 43986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // FIXME - Prepare the correct descriptor. 44086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Constant *C = CI->getOperand(I++); 441c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey IsValid = IsValid && isGlobalVariable(C); 44286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 44386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey virtual void Apply(GlobalVariable *&Field) { 44486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Constant *C = CI->getOperand(I++); 445c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey IsValid = IsValid && isGlobalVariable(C); 44686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 44745ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey virtual void Apply(std::vector<DebugInfoDesc *> &Field) { 44845ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey Constant *C = CI->getOperand(I++); 44945ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey IsValid = IsValid && isGlobalVariable(C); 45045ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey if (!IsValid) return; 45145ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey 45245ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey GlobalVariable *GV = getGlobalVariable(C); 45345ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey IsValid = IsValid && GV && GV->hasInitializer(); 45445ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey if (!IsValid) return; 45545ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey 45645ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey ConstantArray *CA = dyn_cast<ConstantArray>(GV->getInitializer()); 45745ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey IsValid = IsValid && CA; 45845ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey if (!IsValid) return; 45945ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey 46045ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey for (unsigned i = 0, N = CA->getNumOperands(); IsValid && i < N; ++i) { 46145ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey IsValid = IsValid && isGlobalVariable(CA->getOperand(i)); 46245ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey if (!IsValid) return; 46345ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey 46445ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey GlobalVariable *GVE = getGlobalVariable(CA->getOperand(i)); 46545ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey VR.Verify(GVE); 46645ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey } 46745ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey } 46886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey}; 46986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 470ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 471ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey//===----------------------------------------------------------------------===// 472ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 473ed4e566ddae779d6325b8ad96fa0020909550690Jim Laskey/// TagFromGlobal - Returns the tag number from a debug info descriptor 474ed4e566ddae779d6325b8ad96fa0020909550690Jim Laskey/// GlobalVariable. Return DIIValid if operand is not an unsigned int. 475ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskeyunsigned DebugInfoDesc::TagFromGlobal(GlobalVariable *GV) { 476b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer ConstantInt *C = getUIntOperand(GV, 0); 477b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer return C ? ((unsigned)C->getZExtValue() & ~LLVMDebugVersionMask) : 4787089f45987728197e80174e7640f0178d688080eJim Laskey (unsigned)DW_TAG_invalid; 479ed4e566ddae779d6325b8ad96fa0020909550690Jim Laskey} 480ed4e566ddae779d6325b8ad96fa0020909550690Jim Laskey 481ed4e566ddae779d6325b8ad96fa0020909550690Jim Laskey/// VersionFromGlobal - Returns the version number from a debug info 482ed4e566ddae779d6325b8ad96fa0020909550690Jim Laskey/// descriptor GlobalVariable. Return DIIValid if operand is not an unsigned 483ed4e566ddae779d6325b8ad96fa0020909550690Jim Laskey/// int. 484ed4e566ddae779d6325b8ad96fa0020909550690Jim Laskeyunsigned DebugInfoDesc::VersionFromGlobal(GlobalVariable *GV) { 485b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer ConstantInt *C = getUIntOperand(GV, 0); 486b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer return C ? ((unsigned)C->getZExtValue() & LLVMDebugVersionMask) : 487ed4e566ddae779d6325b8ad96fa0020909550690Jim Laskey (unsigned)DW_TAG_invalid; 488ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 489ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 490ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// DescFactory - Create an instance of debug info descriptor based on Tag. 491ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// Return NULL if not a recognized Tag. 492ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim LaskeyDebugInfoDesc *DebugInfoDesc::DescFactory(unsigned Tag) { 493ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey switch (Tag) { 4949c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_anchor: return new AnchorDesc(); 4959c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_compile_unit: return new CompileUnitDesc(); 4969c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_variable: return new GlobalVariableDesc(); 4979c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_subprogram: return new SubprogramDesc(); 4989d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey case DW_TAG_lexical_block: return new BlockDesc(); 4999c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_base_type: return new BasicTypeDesc(); 5009c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_typedef: 5019d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey case DW_TAG_pointer_type: 5029c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_reference_type: 5039c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_const_type: 5049d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey case DW_TAG_volatile_type: 5059d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey case DW_TAG_restrict_type: 506760383e298f5b4633b4454ad4184b379d56f17e2Jim Laskey case DW_TAG_member: 507760383e298f5b4633b4454ad4184b379d56f17e2Jim Laskey case DW_TAG_inheritance: return new DerivedTypeDesc(Tag); 5089c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_array_type: 5099c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_structure_type: 5109c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_union_type: 5117089f45987728197e80174e7640f0178d688080eJim Laskey case DW_TAG_enumeration_type: 512650f609734b0f948be89376acfebb56249990619Jim Laskey case DW_TAG_vector_type: 513650f609734b0f948be89376acfebb56249990619Jim Laskey case DW_TAG_subroutine_type: return new CompositeTypeDesc(Tag); 5149c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_subrange_type: return new SubrangeDesc(); 5156a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey case DW_TAG_enumerator: return new EnumeratorDesc(); 516b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey case DW_TAG_return_variable: 517b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey case DW_TAG_arg_variable: 518b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey case DW_TAG_auto_variable: return new VariableDesc(Tag); 519ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey default: break; 520ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey } 521ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey return NULL; 522ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 523ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 524ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// getLinkage - get linkage appropriate for this type of descriptor. 525ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// 526ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim LaskeyGlobalValue::LinkageTypes DebugInfoDesc::getLinkage() const { 527ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey return GlobalValue::InternalLinkage; 528ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 529ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 530ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// ApplyToFields - Target the vistor to the fields of the descriptor. 531ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// 532ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskeyvoid DebugInfoDesc::ApplyToFields(DIVisitor *Visitor) { 533ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey Visitor->Apply(Tag); 534ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 535ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 536ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey//===----------------------------------------------------------------------===// 537ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 5389c4447aa2b47f133ac3eac095adb3c375d33031eJim LaskeyAnchorDesc::AnchorDesc() 5399c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey: DebugInfoDesc(DW_TAG_anchor) 540e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey, AnchorTag(0) 5419c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey{} 542e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim LaskeyAnchorDesc::AnchorDesc(AnchoredDesc *D) 5439c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey: DebugInfoDesc(DW_TAG_anchor) 544e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey, AnchorTag(D->getTag()) 5459c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey{} 5469c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey 5479c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey// Implement isa/cast/dyncast. 5489c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskeybool AnchorDesc::classof(const DebugInfoDesc *D) { 5499c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey return D->getTag() == DW_TAG_anchor; 5509c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey} 5519c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey 552ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// getLinkage - get linkage appropriate for this type of descriptor. 553ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// 554ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim LaskeyGlobalValue::LinkageTypes AnchorDesc::getLinkage() const { 555ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey return GlobalValue::LinkOnceLinkage; 556ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 557ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 558ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// ApplyToFields - Target the visitor to the fields of the TransUnitDesc. 559ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// 560ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskeyvoid AnchorDesc::ApplyToFields(DIVisitor *Visitor) { 561ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey DebugInfoDesc::ApplyToFields(Visitor); 562ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 563e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey Visitor->Apply(AnchorTag); 564ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 565ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 566e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey/// getDescString - Return a string used to compose global names and labels. A 567e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey/// A global variable name needs to be defined for each debug descriptor that is 56821b6c9d6477c8df3f884c3f1ebeaaa44dd53aafeJim Laskey/// anchored. NOTE: that each global variable named here also needs to be added 569e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey/// to the list of names left external in the internalizer. 570e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey/// ExternalNames.insert("llvm.dbg.compile_units"); 571e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey/// ExternalNames.insert("llvm.dbg.global_variables"); 572e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey/// ExternalNames.insert("llvm.dbg.subprograms"); 573ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskeyconst char *AnchorDesc::getDescString() const { 574e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey switch (AnchorTag) { 575e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey case DW_TAG_compile_unit: return CompileUnitDesc::AnchorString; 576e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey case DW_TAG_variable: return GlobalVariableDesc::AnchorString; 577e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey case DW_TAG_subprogram: return SubprogramDesc::AnchorString; 578e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey default: break; 579e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey } 580e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey 581e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey assert(0 && "Tag does not have a case for anchor string"); 582e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey return ""; 583ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 584ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 585ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// getTypeString - Return a string used to label this descriptors type. 586ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// 587ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskeyconst char *AnchorDesc::getTypeString() const { 588ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey return "llvm.dbg.anchor.type"; 589ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 590ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 591ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey#ifndef NDEBUG 592ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskeyvoid AnchorDesc::dump() { 593832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling cerr << getDescString() << " " 594832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Version(" << getVersion() << "), " 595832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Tag(" << getTag() << "), " 596832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "AnchorTag(" << AnchorTag << ")\n"; 597ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 598ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey#endif 599ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 600ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey//===----------------------------------------------------------------------===// 601ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 602ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim LaskeyAnchoredDesc::AnchoredDesc(unsigned T) 603ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey: DebugInfoDesc(T) 604ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey, Anchor(NULL) 605ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey{} 606ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 607ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// ApplyToFields - Target the visitor to the fields of the AnchoredDesc. 608ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// 609ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskeyvoid AnchoredDesc::ApplyToFields(DIVisitor *Visitor) { 610ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey DebugInfoDesc::ApplyToFields(Visitor); 611ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 6127089f45987728197e80174e7640f0178d688080eJim Laskey Visitor->Apply(Anchor); 613ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 614ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 61586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey//===----------------------------------------------------------------------===// 61686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 617ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim LaskeyCompileUnitDesc::CompileUnitDesc() 6189c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey: AnchoredDesc(DW_TAG_compile_unit) 619ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey, Language(0) 620ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey, FileName("") 621ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey, Directory("") 622ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey, Producer("") 623ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey{} 624ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 6259c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey// Implement isa/cast/dyncast. 6269c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskeybool CompileUnitDesc::classof(const DebugInfoDesc *D) { 6279c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey return D->getTag() == DW_TAG_compile_unit; 6289c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey} 6299c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey 630c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey/// ApplyToFields - Target the visitor to the fields of the CompileUnitDesc. 631c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey/// 632c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskeyvoid CompileUnitDesc::ApplyToFields(DIVisitor *Visitor) { 633ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey AnchoredDesc::ApplyToFields(Visitor); 634ca0dc56742986df05f9a7e0b425e2e798eaa2f92Jim Laskey 635ca0dc56742986df05f9a7e0b425e2e798eaa2f92Jim Laskey // Handle cases out of sync with compiler. 636ca0dc56742986df05f9a7e0b425e2e798eaa2f92Jim Laskey if (getVersion() == 0) { 637ca0dc56742986df05f9a7e0b425e2e798eaa2f92Jim Laskey unsigned DebugVersion; 638ca0dc56742986df05f9a7e0b425e2e798eaa2f92Jim Laskey Visitor->Apply(DebugVersion); 639ca0dc56742986df05f9a7e0b425e2e798eaa2f92Jim Laskey } 640ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 641c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey Visitor->Apply(Language); 642c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey Visitor->Apply(FileName); 643c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey Visitor->Apply(Directory); 644c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey Visitor->Apply(Producer); 645b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 646b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 647ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// getDescString - Return a string used to compose global names and labels. 648ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// 649ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskeyconst char *CompileUnitDesc::getDescString() const { 650ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey return "llvm.dbg.compile_unit"; 651ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 652ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 653ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// getTypeString - Return a string used to label this descriptors type. 65486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// 655ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskeyconst char *CompileUnitDesc::getTypeString() const { 656ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey return "llvm.dbg.compile_unit.type"; 657ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 658ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 659ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// getAnchorString - Return a string used to label this descriptor's anchor. 660ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// 661e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskeyconst char *CompileUnitDesc::AnchorString = "llvm.dbg.compile_units"; 662ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskeyconst char *CompileUnitDesc::getAnchorString() const { 663e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey return AnchorString; 664b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 665b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 66686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey#ifndef NDEBUG 66786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskeyvoid CompileUnitDesc::dump() { 668832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling cerr << getDescString() << " " 669832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Version(" << getVersion() << "), " 670832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Tag(" << getTag() << "), " 671832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Anchor(" << getAnchor() << "), " 672832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Language(" << Language << "), " 673832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "FileName(\"" << FileName << "\"), " 674832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Directory(\"" << Directory << "\"), " 675832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Producer(\"" << Producer << "\")\n"; 676b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 67786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey#endif 678b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 67986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey//===----------------------------------------------------------------------===// 68086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 681f4afdd9f413c472e5785355f0d69847eaf729192Jim LaskeyTypeDesc::TypeDesc(unsigned T) 682f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey: DebugInfoDesc(T) 683f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey, Context(NULL) 684f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey, Name("") 6856990600f93c212bd73623d523eb8f53ae0b6eee5Jim Laskey, File(NULL) 686b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey, Line(0) 687f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey, Size(0) 6882695de410d1d055ecc1b6eb6fea965f06598ad00Chris Lattner, Align(0) 689f01e54770033fe6dde528eea655d91e279b43d21Jim Laskey, Offset(0) 690e2a78f2e3dcea4a087fd776aefc56e9edef840a9Jim Laskey, Flags(0) 691f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey{} 692f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey 6936990600f93c212bd73623d523eb8f53ae0b6eee5Jim Laskey/// ApplyToFields - Target the visitor to the fields of the TypeDesc. 694f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey/// 695f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskeyvoid TypeDesc::ApplyToFields(DIVisitor *Visitor) { 696f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey DebugInfoDesc::ApplyToFields(Visitor); 697f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey 698f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey Visitor->Apply(Context); 699f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey Visitor->Apply(Name); 7007089f45987728197e80174e7640f0178d688080eJim Laskey Visitor->Apply(File); 7016990600f93c212bd73623d523eb8f53ae0b6eee5Jim Laskey Visitor->Apply(Line); 702f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey Visitor->Apply(Size); 7032695de410d1d055ecc1b6eb6fea965f06598ad00Chris Lattner Visitor->Apply(Align); 704f01e54770033fe6dde528eea655d91e279b43d21Jim Laskey Visitor->Apply(Offset); 705e2a78f2e3dcea4a087fd776aefc56e9edef840a9Jim Laskey if (getVersion() > LLVMDebugVersion4) Visitor->Apply(Flags); 706f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey} 707f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey 708f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey/// getDescString - Return a string used to compose global names and labels. 709f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey/// 710f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskeyconst char *TypeDesc::getDescString() const { 711f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey return "llvm.dbg.type"; 712f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey} 713f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey 714f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey/// getTypeString - Return a string used to label this descriptor's type. 715f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey/// 716f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskeyconst char *TypeDesc::getTypeString() const { 717f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey return "llvm.dbg.type.type"; 718f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey} 719f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey 720f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey#ifndef NDEBUG 721f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskeyvoid TypeDesc::dump() { 722832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling cerr << getDescString() << " " 723832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Version(" << getVersion() << "), " 724832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Tag(" << getTag() << "), " 725832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Context(" << Context << "), " 726832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Name(\"" << Name << "\"), " 727832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "File(" << File << "), " 728832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Line(" << Line << "), " 729832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Size(" << Size << "), " 730832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Align(" << Align << "), " 731832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Offset(" << Offset << "), " 732832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Flags(" << Flags << ")\n"; 733f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey} 734f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey#endif 735f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey 736f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey//===----------------------------------------------------------------------===// 737f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey 738f4afdd9f413c472e5785355f0d69847eaf729192Jim LaskeyBasicTypeDesc::BasicTypeDesc() 7399c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey: TypeDesc(DW_TAG_base_type) 740f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey, Encoding(0) 741f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey{} 742f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey 7439c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey// Implement isa/cast/dyncast. 7449c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskeybool BasicTypeDesc::classof(const DebugInfoDesc *D) { 7459c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey return D->getTag() == DW_TAG_base_type; 7469c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey} 7479c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey 7486990600f93c212bd73623d523eb8f53ae0b6eee5Jim Laskey/// ApplyToFields - Target the visitor to the fields of the BasicTypeDesc. 749f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey/// 750f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskeyvoid BasicTypeDesc::ApplyToFields(DIVisitor *Visitor) { 751f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey TypeDesc::ApplyToFields(Visitor); 752f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey 753f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey Visitor->Apply(Encoding); 754f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey} 755f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey 756f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// getDescString - Return a string used to compose global names and labels. 757f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// 758f8913f19ae83927521103b9c84189c8d716e85adJim Laskeyconst char *BasicTypeDesc::getDescString() const { 759f8913f19ae83927521103b9c84189c8d716e85adJim Laskey return "llvm.dbg.basictype"; 760f8913f19ae83927521103b9c84189c8d716e85adJim Laskey} 761f8913f19ae83927521103b9c84189c8d716e85adJim Laskey 762f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// getTypeString - Return a string used to label this descriptor's type. 763f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// 764f8913f19ae83927521103b9c84189c8d716e85adJim Laskeyconst char *BasicTypeDesc::getTypeString() const { 765f8913f19ae83927521103b9c84189c8d716e85adJim Laskey return "llvm.dbg.basictype.type"; 766f8913f19ae83927521103b9c84189c8d716e85adJim Laskey} 767f8913f19ae83927521103b9c84189c8d716e85adJim Laskey 768f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey#ifndef NDEBUG 769f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskeyvoid BasicTypeDesc::dump() { 770832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling cerr << getDescString() << " " 771832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Version(" << getVersion() << "), " 772832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Tag(" << getTag() << "), " 773832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Context(" << getContext() << "), " 774832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Name(\"" << getName() << "\"), " 775832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Size(" << getSize() << "), " 776832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Encoding(" << Encoding << ")\n"; 777f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey} 778f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey#endif 779f8913f19ae83927521103b9c84189c8d716e85adJim Laskey 780434b40b42f915822871d26ab3eb13db36d2984a3Jim Laskey//===----------------------------------------------------------------------===// 781434b40b42f915822871d26ab3eb13db36d2984a3Jim Laskey 7826990600f93c212bd73623d523eb8f53ae0b6eee5Jim LaskeyDerivedTypeDesc::DerivedTypeDesc(unsigned T) 7836990600f93c212bd73623d523eb8f53ae0b6eee5Jim Laskey: TypeDesc(T) 784434b40b42f915822871d26ab3eb13db36d2984a3Jim Laskey, FromType(NULL) 785f8913f19ae83927521103b9c84189c8d716e85adJim Laskey{} 786434b40b42f915822871d26ab3eb13db36d2984a3Jim Laskey 7879c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey// Implement isa/cast/dyncast. 7889c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskeybool DerivedTypeDesc::classof(const DebugInfoDesc *D) { 7899c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey unsigned T = D->getTag(); 7909c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey switch (T) { 7919c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_typedef: 7929c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_pointer_type: 7939c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_reference_type: 7949c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_const_type: 7959c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_volatile_type: 7969c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_restrict_type: 797f01e54770033fe6dde528eea655d91e279b43d21Jim Laskey case DW_TAG_member: 798760383e298f5b4633b4454ad4184b379d56f17e2Jim Laskey case DW_TAG_inheritance: 7999c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey return true; 8009c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey default: break; 8019c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey } 8029c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey return false; 8039c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey} 8049c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey 8056990600f93c212bd73623d523eb8f53ae0b6eee5Jim Laskey/// ApplyToFields - Target the visitor to the fields of the DerivedTypeDesc. 806434b40b42f915822871d26ab3eb13db36d2984a3Jim Laskey/// 8076990600f93c212bd73623d523eb8f53ae0b6eee5Jim Laskeyvoid DerivedTypeDesc::ApplyToFields(DIVisitor *Visitor) { 808434b40b42f915822871d26ab3eb13db36d2984a3Jim Laskey TypeDesc::ApplyToFields(Visitor); 809434b40b42f915822871d26ab3eb13db36d2984a3Jim Laskey 8107089f45987728197e80174e7640f0178d688080eJim Laskey Visitor->Apply(FromType); 811434b40b42f915822871d26ab3eb13db36d2984a3Jim Laskey} 812434b40b42f915822871d26ab3eb13db36d2984a3Jim Laskey 813f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// getDescString - Return a string used to compose global names and labels. 814f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// 815f8913f19ae83927521103b9c84189c8d716e85adJim Laskeyconst char *DerivedTypeDesc::getDescString() const { 816f8913f19ae83927521103b9c84189c8d716e85adJim Laskey return "llvm.dbg.derivedtype"; 817f8913f19ae83927521103b9c84189c8d716e85adJim Laskey} 818f8913f19ae83927521103b9c84189c8d716e85adJim Laskey 819f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// getTypeString - Return a string used to label this descriptor's type. 820f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// 821f8913f19ae83927521103b9c84189c8d716e85adJim Laskeyconst char *DerivedTypeDesc::getTypeString() const { 822f8913f19ae83927521103b9c84189c8d716e85adJim Laskey return "llvm.dbg.derivedtype.type"; 823f8913f19ae83927521103b9c84189c8d716e85adJim Laskey} 824f8913f19ae83927521103b9c84189c8d716e85adJim Laskey 825434b40b42f915822871d26ab3eb13db36d2984a3Jim Laskey#ifndef NDEBUG 8266990600f93c212bd73623d523eb8f53ae0b6eee5Jim Laskeyvoid DerivedTypeDesc::dump() { 827832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling cerr << getDescString() << " " 828832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Version(" << getVersion() << "), " 829832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Tag(" << getTag() << "), " 830832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Context(" << getContext() << "), " 831832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Name(\"" << getName() << "\"), " 832832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Size(" << getSize() << "), " 833832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "File(" << getFile() << "), " 834832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Line(" << getLine() << "), " 835832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "FromType(" << FromType << ")\n"; 836434b40b42f915822871d26ab3eb13db36d2984a3Jim Laskey} 837434b40b42f915822871d26ab3eb13db36d2984a3Jim Laskey#endif 838f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey 839f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey//===----------------------------------------------------------------------===// 840f4afdd9f413c472e5785355f0d69847eaf729192Jim Laskey 841f8913f19ae83927521103b9c84189c8d716e85adJim LaskeyCompositeTypeDesc::CompositeTypeDesc(unsigned T) 842f8913f19ae83927521103b9c84189c8d716e85adJim Laskey: DerivedTypeDesc(T) 843f8913f19ae83927521103b9c84189c8d716e85adJim Laskey, Elements() 844f8913f19ae83927521103b9c84189c8d716e85adJim Laskey{} 845f8913f19ae83927521103b9c84189c8d716e85adJim Laskey 8469c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey// Implement isa/cast/dyncast. 8479c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskeybool CompositeTypeDesc::classof(const DebugInfoDesc *D) { 8489c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey unsigned T = D->getTag(); 8499c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey switch (T) { 8509c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_array_type: 8519c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_structure_type: 8529c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_union_type: 8539c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey case DW_TAG_enumeration_type: 8547089f45987728197e80174e7640f0178d688080eJim Laskey case DW_TAG_vector_type: 855650f609734b0f948be89376acfebb56249990619Jim Laskey case DW_TAG_subroutine_type: 8569c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey return true; 8579c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey default: break; 8589c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey } 8599c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey return false; 8609c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey} 8619c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey 862f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// ApplyToFields - Target the visitor to the fields of the CompositeTypeDesc. 863f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// 864f8913f19ae83927521103b9c84189c8d716e85adJim Laskeyvoid CompositeTypeDesc::ApplyToFields(DIVisitor *Visitor) { 8657089f45987728197e80174e7640f0178d688080eJim Laskey DerivedTypeDesc::ApplyToFields(Visitor); 8667089f45987728197e80174e7640f0178d688080eJim Laskey 867f8913f19ae83927521103b9c84189c8d716e85adJim Laskey Visitor->Apply(Elements); 868f8913f19ae83927521103b9c84189c8d716e85adJim Laskey} 869f8913f19ae83927521103b9c84189c8d716e85adJim Laskey 870f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// getDescString - Return a string used to compose global names and labels. 871f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// 872f8913f19ae83927521103b9c84189c8d716e85adJim Laskeyconst char *CompositeTypeDesc::getDescString() const { 873f8913f19ae83927521103b9c84189c8d716e85adJim Laskey return "llvm.dbg.compositetype"; 874f8913f19ae83927521103b9c84189c8d716e85adJim Laskey} 875f8913f19ae83927521103b9c84189c8d716e85adJim Laskey 876f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// getTypeString - Return a string used to label this descriptor's type. 877f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// 878f8913f19ae83927521103b9c84189c8d716e85adJim Laskeyconst char *CompositeTypeDesc::getTypeString() const { 879f8913f19ae83927521103b9c84189c8d716e85adJim Laskey return "llvm.dbg.compositetype.type"; 880f8913f19ae83927521103b9c84189c8d716e85adJim Laskey} 881f8913f19ae83927521103b9c84189c8d716e85adJim Laskey 882f8913f19ae83927521103b9c84189c8d716e85adJim Laskey#ifndef NDEBUG 883f8913f19ae83927521103b9c84189c8d716e85adJim Laskeyvoid CompositeTypeDesc::dump() { 884832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling cerr << getDescString() << " " 885832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Version(" << getVersion() << "), " 886832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Tag(" << getTag() << "), " 887832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Context(" << getContext() << "), " 888832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Name(\"" << getName() << "\"), " 889832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Size(" << getSize() << "), " 890832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "File(" << getFile() << "), " 891832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Line(" << getLine() << "), " 892832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "FromType(" << getFromType() << "), " 893832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Elements.size(" << Elements.size() << ")\n"; 894f8913f19ae83927521103b9c84189c8d716e85adJim Laskey} 895f8913f19ae83927521103b9c84189c8d716e85adJim Laskey#endif 896f8913f19ae83927521103b9c84189c8d716e85adJim Laskey 897f8913f19ae83927521103b9c84189c8d716e85adJim Laskey//===----------------------------------------------------------------------===// 898f8913f19ae83927521103b9c84189c8d716e85adJim Laskey 899f8913f19ae83927521103b9c84189c8d716e85adJim LaskeySubrangeDesc::SubrangeDesc() 9009c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey: DebugInfoDesc(DW_TAG_subrange_type) 901f8913f19ae83927521103b9c84189c8d716e85adJim Laskey, Lo(0) 902f8913f19ae83927521103b9c84189c8d716e85adJim Laskey, Hi(0) 903f8913f19ae83927521103b9c84189c8d716e85adJim Laskey{} 904f8913f19ae83927521103b9c84189c8d716e85adJim Laskey 9059c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey// Implement isa/cast/dyncast. 9069c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskeybool SubrangeDesc::classof(const DebugInfoDesc *D) { 9079c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey return D->getTag() == DW_TAG_subrange_type; 9089c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey} 9099c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey 910f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// ApplyToFields - Target the visitor to the fields of the SubrangeDesc. 911f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// 912f8913f19ae83927521103b9c84189c8d716e85adJim Laskeyvoid SubrangeDesc::ApplyToFields(DIVisitor *Visitor) { 913f8913f19ae83927521103b9c84189c8d716e85adJim Laskey DebugInfoDesc::ApplyToFields(Visitor); 914f8913f19ae83927521103b9c84189c8d716e85adJim Laskey 915f8913f19ae83927521103b9c84189c8d716e85adJim Laskey Visitor->Apply(Lo); 916f8913f19ae83927521103b9c84189c8d716e85adJim Laskey Visitor->Apply(Hi); 917f8913f19ae83927521103b9c84189c8d716e85adJim Laskey} 918f8913f19ae83927521103b9c84189c8d716e85adJim Laskey 919f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// getDescString - Return a string used to compose global names and labels. 920f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// 921f8913f19ae83927521103b9c84189c8d716e85adJim Laskeyconst char *SubrangeDesc::getDescString() const { 922f8913f19ae83927521103b9c84189c8d716e85adJim Laskey return "llvm.dbg.subrange"; 923f8913f19ae83927521103b9c84189c8d716e85adJim Laskey} 924f8913f19ae83927521103b9c84189c8d716e85adJim Laskey 925f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// getTypeString - Return a string used to label this descriptor's type. 926f8913f19ae83927521103b9c84189c8d716e85adJim Laskey/// 927f8913f19ae83927521103b9c84189c8d716e85adJim Laskeyconst char *SubrangeDesc::getTypeString() const { 928f8913f19ae83927521103b9c84189c8d716e85adJim Laskey return "llvm.dbg.subrange.type"; 929f8913f19ae83927521103b9c84189c8d716e85adJim Laskey} 930f8913f19ae83927521103b9c84189c8d716e85adJim Laskey 931f8913f19ae83927521103b9c84189c8d716e85adJim Laskey#ifndef NDEBUG 932f8913f19ae83927521103b9c84189c8d716e85adJim Laskeyvoid SubrangeDesc::dump() { 933832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling cerr << getDescString() << " " 934832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Version(" << getVersion() << "), " 935832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Tag(" << getTag() << "), " 936832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Lo(" << Lo << "), " 937832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Hi(" << Hi << ")\n"; 938f8913f19ae83927521103b9c84189c8d716e85adJim Laskey} 939f8913f19ae83927521103b9c84189c8d716e85adJim Laskey#endif 940f8913f19ae83927521103b9c84189c8d716e85adJim Laskey 941f8913f19ae83927521103b9c84189c8d716e85adJim Laskey//===----------------------------------------------------------------------===// 942f8913f19ae83927521103b9c84189c8d716e85adJim Laskey 9436a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim LaskeyEnumeratorDesc::EnumeratorDesc() 9446a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey: DebugInfoDesc(DW_TAG_enumerator) 9456a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey, Name("") 9466a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey, Value(0) 9476a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey{} 9486a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey 9496a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey// Implement isa/cast/dyncast. 9506a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskeybool EnumeratorDesc::classof(const DebugInfoDesc *D) { 9516a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey return D->getTag() == DW_TAG_enumerator; 9526a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey} 9536a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey 9546a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey/// ApplyToFields - Target the visitor to the fields of the EnumeratorDesc. 9556a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey/// 9566a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskeyvoid EnumeratorDesc::ApplyToFields(DIVisitor *Visitor) { 9576a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey DebugInfoDesc::ApplyToFields(Visitor); 9586a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey 9596a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey Visitor->Apply(Name); 9606a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey Visitor->Apply(Value); 9616a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey} 9626a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey 9636a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey/// getDescString - Return a string used to compose global names and labels. 9646a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey/// 9656a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskeyconst char *EnumeratorDesc::getDescString() const { 9666a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey return "llvm.dbg.enumerator"; 9676a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey} 9686a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey 9696a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey/// getTypeString - Return a string used to label this descriptor's type. 9706a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey/// 9716a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskeyconst char *EnumeratorDesc::getTypeString() const { 9726a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey return "llvm.dbg.enumerator.type"; 9736a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey} 9746a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey 9756a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey#ifndef NDEBUG 9766a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskeyvoid EnumeratorDesc::dump() { 977832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling cerr << getDescString() << " " 978832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Version(" << getVersion() << "), " 979832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Tag(" << getTag() << "), " 980832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Name(" << Name << "), " 981832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Value(" << Value << ")\n"; 9826a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey} 9836a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey#endif 9846a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey 9856a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey//===----------------------------------------------------------------------===// 9866a3eb01084ff5fe0eee64a66cd050d86a38579c7Jim Laskey 987b8509c5752d58280178f611e0c3f8b89ed076598Jim LaskeyVariableDesc::VariableDesc(unsigned T) 988b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey: DebugInfoDesc(T) 989b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey, Context(NULL) 990b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey, Name("") 991b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey, File(NULL) 992b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey, Line(0) 993b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey, TyDesc(0) 994b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey{} 995b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey 996b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey// Implement isa/cast/dyncast. 997b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskeybool VariableDesc::classof(const DebugInfoDesc *D) { 998b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey unsigned T = D->getTag(); 999b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey switch (T) { 1000b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey case DW_TAG_auto_variable: 1001b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey case DW_TAG_arg_variable: 1002b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey case DW_TAG_return_variable: 1003b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey return true; 1004b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey default: break; 1005b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey } 1006b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey return false; 1007b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey} 1008b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey 1009b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey/// ApplyToFields - Target the visitor to the fields of the VariableDesc. 1010b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey/// 1011b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskeyvoid VariableDesc::ApplyToFields(DIVisitor *Visitor) { 1012b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey DebugInfoDesc::ApplyToFields(Visitor); 1013b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey 1014b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey Visitor->Apply(Context); 1015b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey Visitor->Apply(Name); 10167089f45987728197e80174e7640f0178d688080eJim Laskey Visitor->Apply(File); 1017b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey Visitor->Apply(Line); 10187089f45987728197e80174e7640f0178d688080eJim Laskey Visitor->Apply(TyDesc); 1019b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey} 1020b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey 1021b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey/// getDescString - Return a string used to compose global names and labels. 1022b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey/// 1023b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskeyconst char *VariableDesc::getDescString() const { 1024b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey return "llvm.dbg.variable"; 1025b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey} 1026b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey 1027b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey/// getTypeString - Return a string used to label this descriptor's type. 1028b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey/// 1029b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskeyconst char *VariableDesc::getTypeString() const { 1030b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey return "llvm.dbg.variable.type"; 1031b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey} 1032b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey 1033b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey#ifndef NDEBUG 1034b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskeyvoid VariableDesc::dump() { 1035832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling cerr << getDescString() << " " 1036832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Version(" << getVersion() << "), " 1037832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Tag(" << getTag() << "), " 1038832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Context(" << Context << "), " 1039832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Name(\"" << Name << "\"), " 1040832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "File(" << File << "), " 1041832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Line(" << Line << "), " 1042832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "TyDesc(" << TyDesc << ")\n"; 1043b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey} 1044b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey#endif 1045b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey 1046b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey//===----------------------------------------------------------------------===// 1047b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey 1048ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim LaskeyGlobalDesc::GlobalDesc(unsigned T) 1049ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey: AnchoredDesc(T) 1050ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey, Context(0) 1051ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey, Name("") 10522172f966ca6ddd805d914498851243099c778b54Jim Laskey, FullName("") 10532172f966ca6ddd805d914498851243099c778b54Jim Laskey, LinkageName("") 10549d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey, File(NULL) 10559d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey, Line(0) 1056ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey, TyDesc(NULL) 1057ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey, IsStatic(false) 1058ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey, IsDefinition(false) 1059ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey{} 1060ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 1061ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// ApplyToFields - Target the visitor to the fields of the global. 1062c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey/// 1063ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskeyvoid GlobalDesc::ApplyToFields(DIVisitor *Visitor) { 1064ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey AnchoredDesc::ApplyToFields(Visitor); 1065ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 1066c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey Visitor->Apply(Context); 1067c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey Visitor->Apply(Name); 10682172f966ca6ddd805d914498851243099c778b54Jim Laskey Visitor->Apply(FullName); 10692172f966ca6ddd805d914498851243099c778b54Jim Laskey Visitor->Apply(LinkageName); 10707089f45987728197e80174e7640f0178d688080eJim Laskey Visitor->Apply(File); 10719d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey Visitor->Apply(Line); 10727089f45987728197e80174e7640f0178d688080eJim Laskey Visitor->Apply(TyDesc); 1073c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey Visitor->Apply(IsStatic); 1074c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey Visitor->Apply(IsDefinition); 1075ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 1076ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 1077ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey//===----------------------------------------------------------------------===// 1078ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 1079ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim LaskeyGlobalVariableDesc::GlobalVariableDesc() 10809c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey: GlobalDesc(DW_TAG_variable) 1081ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey, Global(NULL) 1082ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey{} 1083ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 10849c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey// Implement isa/cast/dyncast. 10859c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskeybool GlobalVariableDesc::classof(const DebugInfoDesc *D) { 10869c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey return D->getTag() == DW_TAG_variable; 10879c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey} 10889c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey 1089ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// ApplyToFields - Target the visitor to the fields of the GlobalVariableDesc. 1090ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// 1091ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskeyvoid GlobalVariableDesc::ApplyToFields(DIVisitor *Visitor) { 1092ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey GlobalDesc::ApplyToFields(Visitor); 1093ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 1094c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey Visitor->Apply(Global); 1095b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 1096b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 1097ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// getDescString - Return a string used to compose global names and labels. 1098b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey/// 1099ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskeyconst char *GlobalVariableDesc::getDescString() const { 1100ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey return "llvm.dbg.global_variable"; 1101ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 1102ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 1103ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// getTypeString - Return a string used to label this descriptors type. 1104ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// 1105ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskeyconst char *GlobalVariableDesc::getTypeString() const { 1106ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey return "llvm.dbg.global_variable.type"; 1107ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 1108ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 1109ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// getAnchorString - Return a string used to label this descriptor's anchor. 1110ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// 1111e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskeyconst char *GlobalVariableDesc::AnchorString = "llvm.dbg.global_variables"; 1112ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskeyconst char *GlobalVariableDesc::getAnchorString() const { 1113e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey return AnchorString; 1114b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 1115b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 111686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey#ifndef NDEBUG 111786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskeyvoid GlobalVariableDesc::dump() { 1118832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling cerr << getDescString() << " " 1119832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Version(" << getVersion() << "), " 1120832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Tag(" << getTag() << "), " 1121832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Anchor(" << getAnchor() << "), " 1122832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Name(\"" << getName() << "\"), " 1123832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "FullName(\"" << getFullName() << "\"), " 1124832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "LinkageName(\"" << getLinkageName() << "\"), " 1125832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "File(" << getFile() << ")," 1126832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Line(" << getLine() << ")," 1127832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Type(" << getType() << "), " 1128832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "IsStatic(" << (isStatic() ? "true" : "false") << "), " 1129832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "IsDefinition(" << (isDefinition() ? "true" : "false") << "), " 1130832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Global(" << Global << ")\n"; 1131b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 113286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey#endif 113386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 113486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey//===----------------------------------------------------------------------===// 113586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 1136ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim LaskeySubprogramDesc::SubprogramDesc() 11379c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey: GlobalDesc(DW_TAG_subprogram) 1138ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey{} 1139ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 11409c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey// Implement isa/cast/dyncast. 11419c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskeybool SubprogramDesc::classof(const DebugInfoDesc *D) { 11429c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey return D->getTag() == DW_TAG_subprogram; 11439c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey} 11449c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskey 1145c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey/// ApplyToFields - Target the visitor to the fields of the 114686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// SubprogramDesc. 1147c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskeyvoid SubprogramDesc::ApplyToFields(DIVisitor *Visitor) { 1148ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey GlobalDesc::ApplyToFields(Visitor); 1149ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 1150ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 1151ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// getDescString - Return a string used to compose global names and labels. 1152ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// 1153ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskeyconst char *SubprogramDesc::getDescString() const { 1154ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey return "llvm.dbg.subprogram"; 1155ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 1156ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 1157ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// getTypeString - Return a string used to label this descriptors type. 1158ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// 1159ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskeyconst char *SubprogramDesc::getTypeString() const { 1160ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey return "llvm.dbg.subprogram.type"; 116186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey} 116286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 1163ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// getAnchorString - Return a string used to label this descriptor's anchor. 1164b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey/// 1165e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskeyconst char *SubprogramDesc::AnchorString = "llvm.dbg.subprograms"; 1166ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskeyconst char *SubprogramDesc::getAnchorString() const { 1167e8c3e3b51c21dad94f0b427d7e0d6722e663fc64Jim Laskey return AnchorString; 1168b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 1169b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 117086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey#ifndef NDEBUG 117186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskeyvoid SubprogramDesc::dump() { 1172832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling cerr << getDescString() << " " 1173832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Version(" << getVersion() << "), " 1174832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Tag(" << getTag() << "), " 1175832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Anchor(" << getAnchor() << "), " 1176832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Name(\"" << getName() << "\"), " 1177832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "FullName(\"" << getFullName() << "\"), " 1178832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "LinkageName(\"" << getLinkageName() << "\"), " 1179832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "File(" << getFile() << ")," 1180832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Line(" << getLine() << ")," 1181832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Type(" << getType() << "), " 1182832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "IsStatic(" << (isStatic() ? "true" : "false") << "), " 1183832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "IsDefinition(" << (isDefinition() ? "true" : "false") << ")\n"; 118486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey} 118586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey#endif 118686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 118745ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey//===----------------------------------------------------------------------===// 118845ccae5b7d658e9948f3cdfc8f06facaca536e1fJim Laskey 11899d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim LaskeyBlockDesc::BlockDesc() 11909d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey: DebugInfoDesc(DW_TAG_lexical_block) 1191b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey, Context(NULL) 11929d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey{} 11939d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey 11949d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey// Implement isa/cast/dyncast. 11959d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskeybool BlockDesc::classof(const DebugInfoDesc *D) { 11969d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey return D->getTag() == DW_TAG_lexical_block; 11979d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey} 11989d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey 11999d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey/// ApplyToFields - Target the visitor to the fields of the BlockDesc. 12009d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey/// 12019d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskeyvoid BlockDesc::ApplyToFields(DIVisitor *Visitor) { 12029d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey DebugInfoDesc::ApplyToFields(Visitor); 12039d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey 1204b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey Visitor->Apply(Context); 12059d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey} 12069d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey 12079d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey/// getDescString - Return a string used to compose global names and labels. 12089d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey/// 12099d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskeyconst char *BlockDesc::getDescString() const { 12109d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey return "llvm.dbg.block"; 12119d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey} 12129d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey 12139d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey/// getTypeString - Return a string used to label this descriptors type. 12149d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey/// 12159d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskeyconst char *BlockDesc::getTypeString() const { 12169d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey return "llvm.dbg.block.type"; 12179d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey} 12189d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey 12199d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey#ifndef NDEBUG 12209d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskeyvoid BlockDesc::dump() { 1221832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling cerr << getDescString() << " " 1222832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Version(" << getVersion() << "), " 1223832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Tag(" << getTag() << ")," 1224832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling << "Context(" << Context << ")\n"; 12259d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey} 12269d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey#endif 12279d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey 12289d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey//===----------------------------------------------------------------------===// 12299d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey 123086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim LaskeyDebugInfoDesc *DIDeserializer::Deserialize(Value *V) { 1231ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey return Deserialize(getGlobalVariable(V)); 1232b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 123386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim LaskeyDebugInfoDesc *DIDeserializer::Deserialize(GlobalVariable *GV) { 1234ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey // Handle NULL. 1235ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey if (!GV) return NULL; 1236ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 123786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Check to see if it has been already deserialized. 123886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey DebugInfoDesc *&Slot = GlobalDescs[GV]; 123986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey if (Slot) return Slot; 1240b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 124186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Get the Tag from the global. 124286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey unsigned Tag = DebugInfoDesc::TagFromGlobal(GV); 124386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 124486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Create an empty instance of the correct sort. 124586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Slot = DebugInfoDesc::DescFactory(Tag); 124686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 12472140798cc4fe05fdaf04082abf6a3b03b2a005abJim Laskey // If not a user defined descriptor. 12482140798cc4fe05fdaf04082abf6a3b03b2a005abJim Laskey if (Slot) { 12492140798cc4fe05fdaf04082abf6a3b03b2a005abJim Laskey // Deserialize the fields. 12502140798cc4fe05fdaf04082abf6a3b03b2a005abJim Laskey DIDeserializeVisitor DRAM(*this, GV); 12512140798cc4fe05fdaf04082abf6a3b03b2a005abJim Laskey DRAM.ApplyToFields(Slot); 12522140798cc4fe05fdaf04082abf6a3b03b2a005abJim Laskey } 125386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 125486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey return Slot; 1255b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 1256b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 125786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey//===----------------------------------------------------------------------===// 125886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 125986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// getStrPtrType - Return a "sbyte *" type. 1260b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey/// 126186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskeyconst PointerType *DISerializer::getStrPtrType() { 126286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // If not already defined. 126386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey if (!StrPtrTy) { 126486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Construct the pointer to signed bytes. 126547857812e29324a9d1560796a05b53d3a9217fd9Reid Spencer StrPtrTy = PointerType::get(Type::Int8Ty); 126686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 126786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 126886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey return StrPtrTy; 1269b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 1270b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 127186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// getEmptyStructPtrType - Return a "{ }*" type. 1272b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey/// 127386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskeyconst PointerType *DISerializer::getEmptyStructPtrType() { 127486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // If not already defined. 127586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey if (!EmptyStructPtrTy) { 127686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Construct the empty structure type. 127786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey const StructType *EmptyStructTy = 127886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey StructType::get(std::vector<const Type*>()); 127986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Construct the pointer to empty structure type. 128086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey EmptyStructPtrTy = PointerType::get(EmptyStructTy); 128186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 128286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 128386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey return EmptyStructPtrTy; 1284b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 1285b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 128686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// getTagType - Return the type describing the specified descriptor (via tag.) 1287b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey/// 128886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskeyconst StructType *DISerializer::getTagType(DebugInfoDesc *DD) { 128986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Attempt to get the previously defined type. 129086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey StructType *&Ty = TagTypes[DD->getTag()]; 129186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 129286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // If not already defined. 129386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey if (!Ty) { 129486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Set up fields vector. 129586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey std::vector<const Type*> Fields; 1296ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey // Get types of fields. 1297c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey DIGetTypesVisitor GTAM(*this, Fields); 129886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey GTAM.ApplyToFields(DD); 129986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 130086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Construct structured type. 130186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Ty = StructType::get(Fields); 130286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 130386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Register type name with module. 1304ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey M->addTypeName(DD->getTypeString(), Ty); 130586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 130686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 130786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey return Ty; 1308b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 1309b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 131086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// getString - Construct the string as constant string global. 1311b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey/// 1312ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim LaskeyConstant *DISerializer::getString(const std::string &String) { 131386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Check string cache for previous edition. 1314ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey Constant *&Slot = StringCache[String]; 13159d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey // Return Constant if previously defined. 131686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey if (Slot) return Slot; 13179d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey // If empty string then use a sbyte* null instead. 13189d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey if (String.empty()) { 13199d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey Slot = ConstantPointerNull::get(getStrPtrType()); 13209d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey } else { 13219d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey // Construct string as an llvm constant. 13229d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey Constant *ConstStr = ConstantArray::get(String); 13239d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey // Otherwise create and return a new string global. 13249d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey GlobalVariable *StrGV = new GlobalVariable(ConstStr->getType(), true, 13259d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey GlobalVariable::InternalLinkage, 13261e4c23a2d192479d264e2028843f204de2658cdaDevang Patel ConstStr, ".str", M); 13279d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey StrGV->setSection("llvm.metadata"); 13289d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey // Convert to generic string pointer. 132915f46d6c280cc91be70c60ed181931fbe0088652Reid Spencer Slot = ConstantExpr::getBitCast(StrGV, getStrPtrType()); 13309d0ff8e6f9077dd7fe4836c7f06524eb12cd3a7eJim Laskey } 1331ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey return Slot; 1332ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 1333b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 1334b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 133586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// Serialize - Recursively cast the specified descriptor into a GlobalVariable 133686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// so that it can be serialized to a .bc or .ll file. 133786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim LaskeyGlobalVariable *DISerializer::Serialize(DebugInfoDesc *DD) { 133886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Check if the DebugInfoDesc is already in the map. 133986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey GlobalVariable *&Slot = DescGlobals[DD]; 134086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 134186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // See if DebugInfoDesc exists, if so return prior GlobalVariable. 134286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey if (Slot) return Slot; 134386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 134486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Get the type associated with the Tag. 134586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey const StructType *Ty = getTagType(DD); 134686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 134786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Create the GlobalVariable early to prevent infinite recursion. 1348ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey GlobalVariable *GV = new GlobalVariable(Ty, true, DD->getLinkage(), 1349ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey NULL, DD->getDescString(), M); 13507809811e4ed3c2462efa327cef0464b9844baea2Jim Laskey GV->setSection("llvm.metadata"); 135186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 135286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Insert new GlobalVariable in DescGlobals map. 135386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey Slot = GV; 135486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 135586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Set up elements vector 135686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey std::vector<Constant*> Elements; 1357ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey // Add fields. 1358c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey DISerializeVisitor SRAM(*this, Elements); 135986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey SRAM.ApplyToFields(DD); 136086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 136186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Set the globals initializer. 136286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey GV->setInitializer(ConstantStruct::get(Ty, Elements)); 136386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 136486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey return GV; 1365b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 1366b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 136786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey//===----------------------------------------------------------------------===// 136886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 136986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// Verify - Return true if the GlobalVariable appears to be a valid 137086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey/// serialization of a DebugInfoDesc. 1371ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskeybool DIVerifier::Verify(Value *V) { 1372aaa80ebd10c62a903537d386b0d3738b0595491fJim Laskey return !V || Verify(getGlobalVariable(V)); 1373ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 137486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskeybool DIVerifier::Verify(GlobalVariable *GV) { 137598e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey // NULLs are valid. 137698e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey if (!GV) return true; 137798e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey 137898e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey // Check prior validity. 137998e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey unsigned &ValiditySlot = Validity[GV]; 138086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 138198e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey // If visited before then use old state. 138298e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey if (ValiditySlot) return ValiditySlot == Valid; 138398e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey 138498e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey // Assume validity for the time being (recursion.) 138598e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey ValiditySlot = Valid; 1386a8299deab75b9675f46a2ba03ea8a1ba19ffe280Jim Laskey 1387a8299deab75b9675f46a2ba03ea8a1ba19ffe280Jim Laskey // Make sure the global is internal or link once (anchor.) 1388a8299deab75b9675f46a2ba03ea8a1ba19ffe280Jim Laskey if (GV->getLinkage() != GlobalValue::InternalLinkage && 1389a8299deab75b9675f46a2ba03ea8a1ba19ffe280Jim Laskey GV->getLinkage() != GlobalValue::LinkOnceLinkage) { 1390a8299deab75b9675f46a2ba03ea8a1ba19ffe280Jim Laskey ValiditySlot = Invalid; 1391a8299deab75b9675f46a2ba03ea8a1ba19ffe280Jim Laskey return false; 1392a8299deab75b9675f46a2ba03ea8a1ba19ffe280Jim Laskey } 139398e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey 13942bbff6d17350edae5d9ae48b3f0735386d69cccfJim Laskey // Get the Tag. 1395c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey unsigned Tag = DebugInfoDesc::TagFromGlobal(GV); 1396b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey 1397b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey // Check for user defined descriptors. 13982bbff6d17350edae5d9ae48b3f0735386d69cccfJim Laskey if (Tag == DW_TAG_invalid) { 13992bbff6d17350edae5d9ae48b3f0735386d69cccfJim Laskey ValiditySlot = Valid; 14002bbff6d17350edae5d9ae48b3f0735386d69cccfJim Laskey return true; 14012bbff6d17350edae5d9ae48b3f0735386d69cccfJim Laskey } 14022bbff6d17350edae5d9ae48b3f0735386d69cccfJim Laskey 14032bbff6d17350edae5d9ae48b3f0735386d69cccfJim Laskey // Get the Version. 14042bbff6d17350edae5d9ae48b3f0735386d69cccfJim Laskey unsigned Version = DebugInfoDesc::VersionFromGlobal(GV); 14052bbff6d17350edae5d9ae48b3f0735386d69cccfJim Laskey 14062bbff6d17350edae5d9ae48b3f0735386d69cccfJim Laskey // Check for version mismatch. 14072bbff6d17350edae5d9ae48b3f0735386d69cccfJim Laskey if (Version != LLVMDebugVersion) { 14082bbff6d17350edae5d9ae48b3f0735386d69cccfJim Laskey ValiditySlot = Invalid; 14092bbff6d17350edae5d9ae48b3f0735386d69cccfJim Laskey return false; 14102bbff6d17350edae5d9ae48b3f0735386d69cccfJim Laskey } 141186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 141286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Construct an empty DebugInfoDesc. 141386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey DebugInfoDesc *DD = DebugInfoDesc::DescFactory(Tag); 14142140798cc4fe05fdaf04082abf6a3b03b2a005abJim Laskey 14152140798cc4fe05fdaf04082abf6a3b03b2a005abJim Laskey // Allow for user defined descriptors. 14162140798cc4fe05fdaf04082abf6a3b03b2a005abJim Laskey if (!DD) return true; 141786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 141886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Get the initializer constant. 141986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey ConstantStruct *CI = cast<ConstantStruct>(GV->getInitializer()); 142086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 142186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Get the operand count. 142286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey unsigned N = CI->getNumOperands(); 142386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 142486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Get the field count. 142598e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey unsigned &CountSlot = Counts[Tag]; 142698e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey if (!CountSlot) { 142786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Check the operand count to the field count 1428c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey DICountVisitor CTAM; 142986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey CTAM.ApplyToFields(DD); 143098e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey CountSlot = CTAM.getCount(); 143186cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 143286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 14332140798cc4fe05fdaf04082abf6a3b03b2a005abJim Laskey // Field count must be at most equal operand count. 143498e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey if (CountSlot > N) { 143586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey delete DD; 143698e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey ValiditySlot = Invalid; 143786cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey return false; 143886cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey } 143986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 144086cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Check each field for valid type. 1441c2f0c8def74dcdf5b142291029fdfc2a8d161cb9Jim Laskey DIVerifyVisitor VRAM(*this, GV); 144286cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey VRAM.ApplyToFields(DD); 144386cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 144486cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey // Release empty DebugInfoDesc. 144586cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey delete DD; 144686cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey 144798e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey // If fields are not valid. 144898e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey if (!VRAM.isValid()) { 144998e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey ValiditySlot = Invalid; 145098e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey return false; 145198e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey } 145298e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey 145398e0410f078185d54195d2594be3cb96e6e8ab5dJim Laskey return true; 1454b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 1455b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 1456b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey//===----------------------------------------------------------------------===// 1457b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 1458b8509c5752d58280178f611e0c3f8b89ed076598Jim LaskeyDebugScope::~DebugScope() { 1459b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey for (unsigned i = 0, N = Scopes.size(); i < N; ++i) delete Scopes[i]; 1460b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey for (unsigned j = 0, M = Variables.size(); j < M; ++j) delete Variables[j]; 1461b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey} 1462b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey 1463b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey//===----------------------------------------------------------------------===// 1464b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 14656da186480b55c10b96a255ce0a4ab731155da907Jim LaskeyMachineModuleInfo::MachineModuleInfo() 1466794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel: ImmutablePass((intptr_t)&ID) 1467794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel, DR() 1468b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey, VR() 146986cbdba5228a3cb043a73c630e8d93e1a943cbe3Jim Laskey, CompileUnits() 1470b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey, Directories() 1471b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey, SourceFiles() 1472b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey, Lines() 14739d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey, LabelIDList() 1474b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey, ScopeMap() 1475b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey, RootScope(NULL) 14764188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey, FrameMoves() 147759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey, LandingPads() 14788c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov, Personalities() 14792365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov, CallsEHReturn(0) 14802365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov, CallsUnwindInit(0) 14818c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov{ 14828c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov // Always emit "no personality" info 14838c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov Personalities.push_back(NULL); 14848c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov} 14856da186480b55c10b96a255ce0a4ab731155da907Jim LaskeyMachineModuleInfo::~MachineModuleInfo() { 1486b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 1487b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 1488b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 14896da186480b55c10b96a255ce0a4ab731155da907Jim Laskey/// doInitialization - Initialize the state for a new module. 1490b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey/// 14916da186480b55c10b96a255ce0a4ab731155da907Jim Laskeybool MachineModuleInfo::doInitialization() { 1492b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey return false; 1493b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey} 14946af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey 14956da186480b55c10b96a255ce0a4ab731155da907Jim Laskey/// doFinalization - Tear down the state after completion of a module. 1496b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey/// 14976da186480b55c10b96a255ce0a4ab731155da907Jim Laskeybool MachineModuleInfo::doFinalization() { 1498b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey return false; 1499b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey} 1500b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 15016da186480b55c10b96a255ce0a4ab731155da907Jim Laskey/// BeginFunction - Begin gathering function meta information. 15024188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey/// 15036da186480b55c10b96a255ce0a4ab731155da907Jim Laskeyvoid MachineModuleInfo::BeginFunction(MachineFunction *MF) { 15044188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey // Coming soon. 15054188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey} 15064188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey 15076da186480b55c10b96a255ce0a4ab731155da907Jim Laskey/// EndFunction - Discard function meta information. 15084188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey/// 15096da186480b55c10b96a255ce0a4ab731155da907Jim Laskeyvoid MachineModuleInfo::EndFunction() { 15104188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey // Clean up scope information. 15114188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey if (RootScope) { 15124188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey delete RootScope; 15134188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey ScopeMap.clear(); 15144188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey RootScope = NULL; 15154188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey } 15164188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey 1517b82313fdc21e8190768addf0f16710b94f0e1441Jim Laskey // Clean up line info. 1518b82313fdc21e8190768addf0f16710b94f0e1441Jim Laskey Lines.clear(); 1519b82313fdc21e8190768addf0f16710b94f0e1441Jim Laskey 15204188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey // Clean up frame info. 15214188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey FrameMoves.clear(); 152259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 152359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey // Clean up exception info. 152459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey LandingPads.clear(); 152559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey TypeInfos.clear(); 152673ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands FilterIds.clear(); 152714da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands FilterEnds.clear(); 15282365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov CallsEHReturn = 0; 15292365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov CallsUnwindInit = 0; 15304188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey} 15314188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey 1532d96185aa62dacf5c75d889231a8ab2e0f1ceb073Jim Laskey/// getDescFor - Convert a Value to a debug information descriptor. 1533ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// 1534d96185aa62dacf5c75d889231a8ab2e0f1ceb073Jim Laskey// FIXME - use new Value type when available. 15356da186480b55c10b96a255ce0a4ab731155da907Jim LaskeyDebugInfoDesc *MachineModuleInfo::getDescFor(Value *V) { 1536ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey return DR.Deserialize(V); 1537ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 1538ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 1539ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// Verify - Verify that a Value is debug information descriptor. 1540ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey/// 15416da186480b55c10b96a255ce0a4ab731155da907Jim Laskeybool MachineModuleInfo::Verify(Value *V) { 1542ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey return VR.Verify(V); 1543ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey} 1544ce72b1755f5993a42c2e04e32a93fa5228a285d4Jim Laskey 1545b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey/// AnalyzeModule - Scan the module for global debug information. 1546b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey/// 15476da186480b55c10b96a255ce0a4ab731155da907Jim Laskeyvoid MachineModuleInfo::AnalyzeModule(Module &M) { 1548b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey SetupCompileUnits(M); 1549b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 1550b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 1551c1c47c3fa4d6d21b65924c02ab2f228e6285152dJim Laskey/// needsFrameInfo - Returns true if we need to gather callee-saved register 1552c1c47c3fa4d6d21b65924c02ab2f228e6285152dJim Laskey/// move info for the frame. 1553c1c47c3fa4d6d21b65924c02ab2f228e6285152dJim Laskeybool MachineModuleInfo::needsFrameInfo() const { 1554c1c47c3fa4d6d21b65924c02ab2f228e6285152dJim Laskey return hasDebugInfo() || ExceptionHandling; 1555c1c47c3fa4d6d21b65924c02ab2f228e6285152dJim Laskey} 1556c1c47c3fa4d6d21b65924c02ab2f228e6285152dJim Laskey 1557b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey/// SetupCompileUnits - Set up the unique vector of compile units. 1558b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey/// 15596da186480b55c10b96a255ce0a4ab731155da907Jim Laskeyvoid MachineModuleInfo::SetupCompileUnits(Module &M) { 15600420f2aaf9551a10e2060d076de2fcdd7b316370Jim Laskey std::vector<CompileUnitDesc *>CU = getAnchoredDescriptors<CompileUnitDesc>(M); 1561b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 15620420f2aaf9551a10e2060d076de2fcdd7b316370Jim Laskey for (unsigned i = 0, N = CU.size(); i < N; i++) { 15630420f2aaf9551a10e2060d076de2fcdd7b316370Jim Laskey CompileUnits.insert(CU[i]); 1564b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey } 1565b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 1566b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 15676e87c0e029c011b9ee61068c607080ca4934378aJim Laskey/// getCompileUnits - Return a vector of debug compile units. 15686e87c0e029c011b9ee61068c607080ca4934378aJim Laskey/// 15696da186480b55c10b96a255ce0a4ab731155da907Jim Laskeyconst UniqueVector<CompileUnitDesc *> MachineModuleInfo::getCompileUnits()const{ 15706e87c0e029c011b9ee61068c607080ca4934378aJim Laskey return CompileUnits; 15716e87c0e029c011b9ee61068c607080ca4934378aJim Laskey} 15726e87c0e029c011b9ee61068c607080ca4934378aJim Laskey 15730420f2aaf9551a10e2060d076de2fcdd7b316370Jim Laskey/// getGlobalVariablesUsing - Return all of the GlobalVariables that use the 15740420f2aaf9551a10e2060d076de2fcdd7b316370Jim Laskey/// named GlobalVariable. 15750420f2aaf9551a10e2060d076de2fcdd7b316370Jim Laskeystd::vector<GlobalVariable*> 15766da186480b55c10b96a255ce0a4ab731155da907Jim LaskeyMachineModuleInfo::getGlobalVariablesUsing(Module &M, 15776da186480b55c10b96a255ce0a4ab731155da907Jim Laskey const std::string &RootName) { 15780420f2aaf9551a10e2060d076de2fcdd7b316370Jim Laskey return ::getGlobalVariablesUsing(M, RootName); 1579b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 1580b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey 1581b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey/// RecordLabel - Records location information and associates it with a 1582b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey/// debug label. Returns a unique label ID used to generate a label and 1583b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey/// provide correspondence to the source line list. 15846da186480b55c10b96a255ce0a4ab731155da907Jim Laskeyunsigned MachineModuleInfo::RecordLabel(unsigned Line, unsigned Column, 1585b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey unsigned Source) { 1586b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey unsigned ID = NextLabelID(); 15878466b214328b162a0be648dd324db8b6a1cfe0dfChris Lattner Lines.push_back(SourceLineInfo(Line, Column, Source, ID)); 1588b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey return ID; 1589b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey} 1590b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey 1591b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey/// RecordSource - Register a source file with debug info. Returns an source 1592b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey/// ID. 15936da186480b55c10b96a255ce0a4ab731155da907Jim Laskeyunsigned MachineModuleInfo::RecordSource(const std::string &Directory, 15946da186480b55c10b96a255ce0a4ab731155da907Jim Laskey const std::string &Source) { 1595b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey unsigned DirectoryID = Directories.insert(Directory); 1596b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey return SourceFiles.insert(SourceFileInfo(DirectoryID, Source)); 1597b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey} 15986da186480b55c10b96a255ce0a4ab731155da907Jim Laskeyunsigned MachineModuleInfo::RecordSource(const CompileUnitDesc *CompileUnit) { 1599b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey return RecordSource(CompileUnit->getDirectory(), 1600b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey CompileUnit->getFileName()); 1601b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey} 1602b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey 1603b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey/// RecordRegionStart - Indicate the start of a region. 1604b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey/// 16056da186480b55c10b96a255ce0a4ab731155da907Jim Laskeyunsigned MachineModuleInfo::RecordRegionStart(Value *V) { 1606b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey // FIXME - need to be able to handle split scopes because of bb cloning. 1607b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey DebugInfoDesc *ScopeDesc = DR.Deserialize(V); 1608b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey DebugScope *Scope = getOrCreateScope(ScopeDesc); 1609b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey unsigned ID = NextLabelID(); 1610b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey if (!Scope->getStartLabelID()) Scope->setStartLabelID(ID); 1611b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey return ID; 1612b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey} 1613b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey 1614b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey/// RecordRegionEnd - Indicate the end of a region. 1615b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey/// 16166da186480b55c10b96a255ce0a4ab731155da907Jim Laskeyunsigned MachineModuleInfo::RecordRegionEnd(Value *V) { 1617b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey // FIXME - need to be able to handle split scopes because of bb cloning. 1618b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey DebugInfoDesc *ScopeDesc = DR.Deserialize(V); 1619b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey DebugScope *Scope = getOrCreateScope(ScopeDesc); 1620b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey unsigned ID = NextLabelID(); 1621b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey Scope->setEndLabelID(ID); 1622b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey return ID; 1623b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey} 1624b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey 1625b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey/// RecordVariable - Indicate the declaration of a local variable. 1626b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey/// 16276da186480b55c10b96a255ce0a4ab731155da907Jim Laskeyvoid MachineModuleInfo::RecordVariable(Value *V, unsigned FrameIndex) { 1628b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey VariableDesc *VD = cast<VariableDesc>(DR.Deserialize(V)); 1629b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey DebugScope *Scope = getOrCreateScope(VD->getContext()); 1630b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey DebugVariable *DV = new DebugVariable(VD, FrameIndex); 1631b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey Scope->AddVariable(DV); 1632b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey} 1633b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey 1634b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey/// getOrCreateScope - Returns the scope associated with the given descriptor. 1635b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey/// 16366da186480b55c10b96a255ce0a4ab731155da907Jim LaskeyDebugScope *MachineModuleInfo::getOrCreateScope(DebugInfoDesc *ScopeDesc) { 1637b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey DebugScope *&Slot = ScopeMap[ScopeDesc]; 1638b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey if (!Slot) { 1639b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey // FIXME - breaks down when the context is an inlined function. 1640b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey DebugInfoDesc *ParentDesc = NULL; 1641b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey if (BlockDesc *Block = dyn_cast<BlockDesc>(ScopeDesc)) { 1642b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey ParentDesc = Block->getContext(); 1643b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey } 1644b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey DebugScope *Parent = ParentDesc ? getOrCreateScope(ParentDesc) : NULL; 1645b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey Slot = new DebugScope(Parent, ScopeDesc); 1646b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey if (Parent) { 1647b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey Parent->AddScope(Slot); 1648b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey } else if (RootScope) { 1649b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey // FIXME - Add inlined function scopes to the root so we can delete 1650b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey // them later. Long term, handle inlined functions properly. 1651b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey RootScope->AddScope(Slot); 1652b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey } else { 1653b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey // First function is top level function. 1654b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey RootScope = Slot; 1655b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey } 1656b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey } 1657b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey return Slot; 1658b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey} 1659b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey 166059667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey//===-EH-------------------------------------------------------------------===// 166159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 166259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the 166359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// specified MachineBasicBlock. 166459667fe20379d65129ef5f3665e9f87e654c8623Jim LaskeyLandingPadInfo &MachineModuleInfo::getOrCreateLandingPadInfo 166559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey (MachineBasicBlock *LandingPad) { 166659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey unsigned N = LandingPads.size(); 166759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey for (unsigned i = 0; i < N; ++i) { 166859e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = LandingPads[i]; 166959e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey if (LP.LandingPadBlock == LandingPad) 167059e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey return LP; 167159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey } 167259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 167359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey LandingPads.push_back(LandingPadInfo(LandingPad)); 167459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey return LandingPads[N]; 167559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 167659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 167759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// addInvoke - Provide the begin and end labels of an invoke style call and 167859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// associate it with a try landing pad block. 167959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskeyvoid MachineModuleInfo::addInvoke(MachineBasicBlock *LandingPad, 168059667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey unsigned BeginLabel, unsigned EndLabel) { 168159e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 1682eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov LP.BeginLabels.push_back(BeginLabel); 1683eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov LP.EndLabels.push_back(EndLabel); 168459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 168559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 168659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// addLandingPad - Provide the label of a try LandingPad block. 168759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// 168859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskeyunsigned MachineModuleInfo::addLandingPad(MachineBasicBlock *LandingPad) { 168959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey unsigned LandingPadLabel = NextLabelID(); 169059e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 169159e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LP.LandingPadLabel = LandingPadLabel; 169259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey return LandingPadLabel; 169359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 169459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 169559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// addPersonality - Provide the personality function for the exception 169659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// information. 169759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskeyvoid MachineModuleInfo::addPersonality(MachineBasicBlock *LandingPad, 16988c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov Function *Personality) { 169959e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 17008c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov LP.Personality = Personality; 17010ff3ca4f9240048462d4cf8e708b519177acf1b4Anton Korobeynikov 17028c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov for (unsigned i = 0; i < Personalities.size(); ++i) 17038c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov if (Personalities[i] == Personality) 17048c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov return; 17058c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov 17068c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov Personalities.push_back(Personality); 170759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 170859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 170959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// addCatchTypeInfo - Provide the catch typeinfo for a landing pad. 171059667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// 171159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskeyvoid MachineModuleInfo::addCatchTypeInfo(MachineBasicBlock *LandingPad, 171259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey std::vector<GlobalVariable *> &TyInfo) { 171359e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 171459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey for (unsigned N = TyInfo.size(); N; --N) 171559e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LP.TypeIds.push_back(getTypeIDFor(TyInfo[N - 1])); 171659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 171773ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands 171873ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands/// addFilterTypeInfo - Provide the filter typeinfo for a landing pad. 171959e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey/// 172073ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sandsvoid MachineModuleInfo::addFilterTypeInfo(MachineBasicBlock *LandingPad, 172173ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands std::vector<GlobalVariable *> &TyInfo) { 172259e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 172373ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands std::vector<unsigned> IdsInFilter (TyInfo.size()); 172473ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands for (unsigned I = 0, E = TyInfo.size(); I != E; ++I) 172573ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands IdsInFilter[I] = getTypeIDFor(TyInfo[I]); 172673ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands LP.TypeIds.push_back(getFilterIDFor(IdsInFilter)); 172759e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey} 172859e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey 17296590b0457c5e28a7336ae31de194953d8127217aDuncan Sands/// addCleanup - Add a cleanup action for a landing pad. 17306590b0457c5e28a7336ae31de194953d8127217aDuncan Sands/// 17316590b0457c5e28a7336ae31de194953d8127217aDuncan Sandsvoid MachineModuleInfo::addCleanup(MachineBasicBlock *LandingPad) { 17326590b0457c5e28a7336ae31de194953d8127217aDuncan Sands LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 17336590b0457c5e28a7336ae31de194953d8127217aDuncan Sands LP.TypeIds.push_back(0); 17346590b0457c5e28a7336ae31de194953d8127217aDuncan Sands} 17356590b0457c5e28a7336ae31de194953d8127217aDuncan Sands 173659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// TidyLandingPads - Remap landing pad labels and remove any deleted landing 173759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// pads. 173859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskeyvoid MachineModuleInfo::TidyLandingPads() { 173959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey for (unsigned i = 0; i != LandingPads.size(); ) { 174059667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey LandingPadInfo &LandingPad = LandingPads[i]; 174159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey LandingPad.LandingPadLabel = MappedLabel(LandingPad.LandingPadLabel); 1742eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov 1743070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov // Special case: we *should* emit LPs with null LP MBB. This indicates 1744070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov // "rethrow" case. 1745070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov if (!LandingPad.LandingPadLabel && LandingPad.LandingPadBlock) { 174659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey LandingPads.erase(LandingPads.begin() + i); 174759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey continue; 174859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey } 174957810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands 1750eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov for (unsigned j=0; j != LandingPads[i].BeginLabels.size(); ) { 1751eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov unsigned BeginLabel = MappedLabel(LandingPad.BeginLabels[j]); 1752eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov unsigned EndLabel = MappedLabel(LandingPad.EndLabels[j]); 175357810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands 175457810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands 1755eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov if (!BeginLabel || !EndLabel) { 1756eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov LandingPad.BeginLabels.erase(LandingPad.BeginLabels.begin() + j); 1757eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov LandingPad.EndLabels.erase(LandingPad.EndLabels.begin() + j); 1758eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov continue; 1759eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov } 1760eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov 1761eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov LandingPad.BeginLabels[j] = BeginLabel; 1762eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov LandingPad.EndLabels[j] = EndLabel; 1763eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov ++j; 1764eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov } 176557810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands 176657810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands // Remove landing pads with no try-ranges. 176757810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands if (!LandingPads[i].BeginLabels.size()) { 176857810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands LandingPads.erase(LandingPads.begin() + i); 176957810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands continue; 177057810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands } 177157810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands 177257810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands // If there is no landing pad, ensure that the list of typeids is empty. 177357810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands // If the only typeid is a cleanup, this is the same as having no typeids. 177457810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands if (!LandingPad.LandingPadBlock || 177557810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands (LandingPad.TypeIds.size() == 1 && !LandingPad.TypeIds[0])) 177657810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands LandingPad.TypeIds.clear(); 177757810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands 177859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey ++i; 177959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey } 178059667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 178159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 178259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// getTypeIDFor - Return the type id for the specified typeinfo. This is 178359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// function wide. 178459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskeyunsigned MachineModuleInfo::getTypeIDFor(GlobalVariable *TI) { 178559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey for (unsigned i = 0, N = TypeInfos.size(); i != N; ++i) 178659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey if (TypeInfos[i] == TI) return i + 1; 178759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 178859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey TypeInfos.push_back(TI); 178959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey return TypeInfos.size(); 179059667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 179159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 179273ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands/// getFilterIDFor - Return the filter id for the specified typeinfos. This is 179373ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands/// function wide. 179473ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sandsint MachineModuleInfo::getFilterIDFor(std::vector<unsigned> &TyIds) { 179514da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // If the new filter coincides with the tail of an existing filter, then 179614da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // re-use the existing filter. Folding filters more than this requires 179714da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // re-ordering filters and/or their elements - probably not worth it. 179814da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands for (std::vector<unsigned>::iterator I = FilterEnds.begin(), 179914da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands E = FilterEnds.end(); I != E; ++I) { 180014da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands unsigned i = *I, j = TyIds.size(); 180114da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands 180214da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands while (i && j) 180314da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands if (FilterIds[--i] != TyIds[--j]) 180414da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands goto try_next; 180514da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands 180614da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands if (!j) 180714da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // The new filter coincides with range [i, end) of the existing filter. 180814da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands return -(1 + i); 180914da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands 181014da32a486f31ba695de9080830e6fadf4942d5bDuncan Sandstry_next:; 181114da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands } 181214da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands 181314da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // Add the new filter. 181473ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands int FilterID = -(1 + FilterIds.size()); 181573ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands FilterIds.reserve(FilterIds.size() + TyIds.size() + 1); 181673ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands for (unsigned I = 0, N = TyIds.size(); I != N; ++I) 181773ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands FilterIds.push_back(TyIds[I]); 181814da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands FilterEnds.push_back(FilterIds.size()); 181973ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands FilterIds.push_back(0); // terminator 182073ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands return FilterID; 182173ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands} 182273ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands 18238c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov/// getPersonality - Return the personality function for the current function. 182459667fe20379d65129ef5f3665e9f87e654c8623Jim LaskeyFunction *MachineModuleInfo::getPersonality() const { 18250ff3ca4f9240048462d4cf8e708b519177acf1b4Anton Korobeynikov // FIXME: Until PR1414 will be fixed, we're using 1 personality function per 18268c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov // function 18278c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov return !LandingPads.empty() ? LandingPads[0].Personality : NULL; 182859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 182959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 18308c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov/// getPersonalityIndex - Return unique index for current personality 18318c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov/// function. NULL personality function should always get zero index. 18328c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikovunsigned MachineModuleInfo::getPersonalityIndex() const { 1833070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov const Function* Personality = NULL; 1834070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov 1835070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov // Scan landing pads. If there is at least one non-NULL personality - use it. 1836070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov for (unsigned i = 0; i != LandingPads.size(); ++i) 1837070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov if (LandingPads[i].Personality) { 1838070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov Personality = LandingPads[i].Personality; 1839070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov break; 1840070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov } 1841070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov 18428c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov for (unsigned i = 0; i < Personalities.size(); ++i) { 18438c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov if (Personalities[i] == Personality) 18448c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov return i; 18458c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov } 18468c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov 18478c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov // This should never happen 18488c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov assert(0 && "Personality function should be set!"); 18498c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov return 0; 18508c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov} 185159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 18529d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey//===----------------------------------------------------------------------===// 18536da186480b55c10b96a255ce0a4ab731155da907Jim Laskey/// DebugLabelFolding pass - This pass prunes out redundant labels. This allows 18546da186480b55c10b96a255ce0a4ab731155da907Jim Laskey/// a info consumer to determine if the range of two labels is empty, by seeing 18556da186480b55c10b96a255ce0a4ab731155da907Jim Laskey/// if the labels map to the same reduced label. 18569d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey 18579d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskeynamespace llvm { 18589d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey 18599d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskeystruct DebugLabelFolder : public MachineFunctionPass { 18601997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel static char ID; 1861794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel DebugLabelFolder() : MachineFunctionPass((intptr_t)&ID) {} 1862794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel 18639d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey virtual bool runOnMachineFunction(MachineFunction &MF); 18646da186480b55c10b96a255ce0a4ab731155da907Jim Laskey virtual const char *getPassName() const { return "Label Folder"; } 18659d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey}; 18669d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey 18671997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patelchar DebugLabelFolder::ID = 0; 1868794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel 18699d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskeybool DebugLabelFolder::runOnMachineFunction(MachineFunction &MF) { 18706da186480b55c10b96a255ce0a4ab731155da907Jim Laskey // Get machine module info. 18716da186480b55c10b96a255ce0a4ab731155da907Jim Laskey MachineModuleInfo *MMI = getAnalysisToUpdate<MachineModuleInfo>(); 18726da186480b55c10b96a255ce0a4ab731155da907Jim Laskey if (!MMI) return false; 18739d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey // Get target instruction info. 18749d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey const TargetInstrInfo *TII = MF.getTarget().getInstrInfo(); 18759d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey if (!TII) return false; 18769d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey 18779d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey // Track if change is made. 18789d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey bool MadeChange = false; 18799d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey // No prior label to begin. 18809d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey unsigned PriorLabel = 0; 18819d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey 18829d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey // Iterate through basic blocks. 18839d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey for (MachineFunction::iterator BB = MF.begin(), E = MF.end(); 18849d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey BB != E; ++BB) { 18859d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey // Iterate through instructions. 18869d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey for (MachineBasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ) { 18876da186480b55c10b96a255ce0a4ab731155da907Jim Laskey // Is it a label. 18881ee29257428960fede862fcfdbe80d5d007927e9Jim Laskey if ((unsigned)I->getOpcode() == TargetInstrInfo::LABEL) { 18899d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey // The label ID # is always operand #0, an immediate. 18909d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey unsigned NextLabel = I->getOperand(0).getImm(); 18919d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey 18929d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey // If there was an immediate prior label. 18939d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey if (PriorLabel) { 18949d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey // Remap the current label to prior label. 18956da186480b55c10b96a255ce0a4ab731155da907Jim Laskey MMI->RemapLabel(NextLabel, PriorLabel); 18969d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey // Delete the current label. 18979d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey I = BB->erase(I); 18989d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey // Indicate a change has been made. 18999d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey MadeChange = true; 19009d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey continue; 19019d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey } else { 19029d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey // Start a new round. 19039d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey PriorLabel = NextLabel; 19049d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey } 19059d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey } else { 19069d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey // No consecutive labels. 19079d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey PriorLabel = 0; 19089d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey } 19099d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey 19109d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey ++I; 19119d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey } 19129d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey } 19139d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey 19149d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey return MadeChange; 19159d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey} 19169d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey 19179d4209fb82cab74bae76511e3f21ef1c24ec948aJim LaskeyFunctionPass *createDebugLabelFoldingPass() { return new DebugLabelFolder(); } 19189d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey 19199d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey} 1920b8509c5752d58280178f611e0c3f8b89ed076598Jim Laskey 1921