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