MachineModuleInfo.cpp revision a844bdeab31ef04221e7ef59a8467893584cc14d
1//===-- llvm/CodeGen/MachineModuleInfo.cpp ----------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#include "llvm/CodeGen/MachineModuleInfo.h" 11 12#include "llvm/Constants.h" 13#include "llvm/CodeGen/MachineFunctionPass.h" 14#include "llvm/CodeGen/MachineFunction.h" 15#include "llvm/CodeGen/MachineLocation.h" 16#include "llvm/Target/TargetInstrInfo.h" 17#include "llvm/Target/TargetMachine.h" 18#include "llvm/Target/TargetOptions.h" 19#include "llvm/DerivedTypes.h" 20#include "llvm/GlobalVariable.h" 21#include "llvm/Intrinsics.h" 22#include "llvm/Instructions.h" 23#include "llvm/Module.h" 24#include "llvm/Support/Dwarf.h" 25#include "llvm/Support/Streams.h" 26using namespace llvm; 27using namespace llvm::dwarf; 28 29// Handle the Pass registration stuff necessary to use TargetData's. 30namespace { 31 RegisterPass<MachineModuleInfo> X("machinemoduleinfo", "Module Information"); 32} 33char MachineModuleInfo::ID = 0; 34 35//===----------------------------------------------------------------------===// 36 37/// getGlobalVariablesUsing - Return all of the GlobalVariables which have the 38/// specified value in their initializer somewhere. 39static void 40getGlobalVariablesUsing(Value *V, std::vector<GlobalVariable*> &Result) { 41 // Scan though value users. 42 for (Value::use_iterator I = V->use_begin(), E = V->use_end(); I != E; ++I) { 43 if (GlobalVariable *GV = dyn_cast<GlobalVariable>(*I)) { 44 // If the user is a GlobalVariable then add to result. 45 Result.push_back(GV); 46 } else if (Constant *C = dyn_cast<Constant>(*I)) { 47 // If the user is a constant variable then scan its users 48 getGlobalVariablesUsing(C, Result); 49 } 50 } 51} 52 53/// getGlobalVariablesUsing - Return all of the GlobalVariables that use the 54/// named GlobalVariable. 55static std::vector<GlobalVariable*> 56getGlobalVariablesUsing(Module &M, const std::string &RootName) { 57 std::vector<GlobalVariable*> Result; // GlobalVariables matching criteria. 58 59 std::vector<const Type*> FieldTypes; 60 FieldTypes.push_back(Type::Int32Ty); 61 FieldTypes.push_back(Type::Int32Ty); 62 63 // Get the GlobalVariable root. 64 GlobalVariable *UseRoot = M.getGlobalVariable(RootName, 65 StructType::get(FieldTypes)); 66 67 // If present and linkonce then scan for users. 68 if (UseRoot && UseRoot->hasLinkOnceLinkage()) { 69 getGlobalVariablesUsing(UseRoot, Result); 70 } 71 72 return Result; 73} 74 75/// isStringValue - Return true if the given value can be coerced to a string. 76/// 77static bool isStringValue(Value *V) { 78 if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V)) { 79 if (GV->hasInitializer() && isa<ConstantArray>(GV->getInitializer())) { 80 ConstantArray *Init = cast<ConstantArray>(GV->getInitializer()); 81 return Init->isString(); 82 } 83 } else if (Constant *C = dyn_cast<Constant>(V)) { 84 if (GlobalValue *GV = dyn_cast<GlobalValue>(C)) 85 return isStringValue(GV); 86 else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) { 87 if (CE->getOpcode() == Instruction::GetElementPtr) { 88 if (CE->getNumOperands() == 3 && 89 cast<Constant>(CE->getOperand(1))->isNullValue() && 90 isa<ConstantInt>(CE->getOperand(2))) { 91 return isStringValue(CE->getOperand(0)); 92 } 93 } 94 } 95 } 96 return false; 97} 98 99/// getGlobalVariable - Return either a direct or cast Global value. 100/// 101static GlobalVariable *getGlobalVariable(Value *V) { 102 if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V)) { 103 return GV; 104 } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) { 105 if (CE->getOpcode() == Instruction::BitCast) { 106 return dyn_cast<GlobalVariable>(CE->getOperand(0)); 107 } else if (CE->getOpcode() == Instruction::GetElementPtr) { 108 for (unsigned int i=1; i<CE->getNumOperands(); i++) { 109 if (!CE->getOperand(i)->isNullValue()) 110 return NULL; 111 } 112 return dyn_cast<GlobalVariable>(CE->getOperand(0)); 113 } 114 } 115 return NULL; 116} 117 118/// isGlobalVariable - Return true if the given value can be coerced to a 119/// GlobalVariable. 120static bool isGlobalVariable(Value *V) { 121 if (isa<GlobalVariable>(V) || isa<ConstantPointerNull>(V)) { 122 return true; 123 } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) { 124 if (CE->getOpcode() == Instruction::BitCast) { 125 return isa<GlobalVariable>(CE->getOperand(0)); 126 } else if (CE->getOpcode() == Instruction::GetElementPtr) { 127 for (unsigned int i=1; i<CE->getNumOperands(); i++) { 128 if (!CE->getOperand(i)->isNullValue()) 129 return false; 130 } 131 return isa<GlobalVariable>(CE->getOperand(0)); 132 } 133 } 134 return false; 135} 136 137/// getUIntOperand - Return ith operand if it is an unsigned integer. 138/// 139static ConstantInt *getUIntOperand(GlobalVariable *GV, unsigned i) { 140 // Make sure the GlobalVariable has an initializer. 141 if (!GV->hasInitializer()) return NULL; 142 143 // Get the initializer constant. 144 ConstantStruct *CI = dyn_cast<ConstantStruct>(GV->getInitializer()); 145 if (!CI) return NULL; 146 147 // Check if there is at least i + 1 operands. 148 unsigned N = CI->getNumOperands(); 149 if (i >= N) return NULL; 150 151 // Check constant. 152 return dyn_cast<ConstantInt>(CI->getOperand(i)); 153} 154 155//===----------------------------------------------------------------------===// 156 157/// ApplyToFields - Target the visitor to each field of the debug information 158/// descriptor. 159void DIVisitor::ApplyToFields(DebugInfoDesc *DD) { 160 DD->ApplyToFields(this); 161} 162 163//===----------------------------------------------------------------------===// 164/// DICountVisitor - This DIVisitor counts all the fields in the supplied debug 165/// the supplied DebugInfoDesc. 166class DICountVisitor : public DIVisitor { 167private: 168 unsigned Count; // Running count of fields. 169 170public: 171 DICountVisitor() : DIVisitor(), Count(0) {} 172 173 // Accessors. 174 unsigned getCount() const { return Count; } 175 176 /// Apply - Count each of the fields. 177 /// 178 virtual void Apply(int &Field) { ++Count; } 179 virtual void Apply(unsigned &Field) { ++Count; } 180 virtual void Apply(int64_t &Field) { ++Count; } 181 virtual void Apply(uint64_t &Field) { ++Count; } 182 virtual void Apply(bool &Field) { ++Count; } 183 virtual void Apply(std::string &Field) { ++Count; } 184 virtual void Apply(DebugInfoDesc *&Field) { ++Count; } 185 virtual void Apply(GlobalVariable *&Field) { ++Count; } 186 virtual void Apply(std::vector<DebugInfoDesc *> &Field) { 187 ++Count; 188 } 189}; 190 191//===----------------------------------------------------------------------===// 192/// DIDeserializeVisitor - This DIVisitor deserializes all the fields in the 193/// supplied DebugInfoDesc. 194class DIDeserializeVisitor : public DIVisitor { 195private: 196 DIDeserializer &DR; // Active deserializer. 197 unsigned I; // Current operand index. 198 ConstantStruct *CI; // GlobalVariable constant initializer. 199 200public: 201 DIDeserializeVisitor(DIDeserializer &D, GlobalVariable *GV) 202 : DIVisitor() 203 , DR(D) 204 , I(0) 205 , CI(cast<ConstantStruct>(GV->getInitializer())) 206 {} 207 208 /// Apply - Set the value of each of the fields. 209 /// 210 virtual void Apply(int &Field) { 211 Constant *C = CI->getOperand(I++); 212 Field = cast<ConstantInt>(C)->getSExtValue(); 213 } 214 virtual void Apply(unsigned &Field) { 215 Constant *C = CI->getOperand(I++); 216 Field = cast<ConstantInt>(C)->getZExtValue(); 217 } 218 virtual void Apply(int64_t &Field) { 219 Constant *C = CI->getOperand(I++); 220 Field = cast<ConstantInt>(C)->getSExtValue(); 221 } 222 virtual void Apply(uint64_t &Field) { 223 Constant *C = CI->getOperand(I++); 224 Field = cast<ConstantInt>(C)->getZExtValue(); 225 } 226 virtual void Apply(bool &Field) { 227 Constant *C = CI->getOperand(I++); 228 Field = cast<ConstantInt>(C)->getZExtValue(); 229 } 230 virtual void Apply(std::string &Field) { 231 Constant *C = CI->getOperand(I++); 232 Field = C->getStringValue(); 233 } 234 virtual void Apply(DebugInfoDesc *&Field) { 235 Constant *C = CI->getOperand(I++); 236 Field = DR.Deserialize(C); 237 } 238 virtual void Apply(GlobalVariable *&Field) { 239 Constant *C = CI->getOperand(I++); 240 Field = getGlobalVariable(C); 241 } 242 virtual void Apply(std::vector<DebugInfoDesc *> &Field) { 243 Field.resize(0); 244 Constant *C = CI->getOperand(I++); 245 GlobalVariable *GV = getGlobalVariable(C); 246 if (GV->hasInitializer()) { 247 if (ConstantArray *CA = dyn_cast<ConstantArray>(GV->getInitializer())) { 248 for (unsigned i = 0, N = CA->getNumOperands(); i < N; ++i) { 249 GlobalVariable *GVE = getGlobalVariable(CA->getOperand(i)); 250 DebugInfoDesc *DE = DR.Deserialize(GVE); 251 Field.push_back(DE); 252 } 253 } else if (GV->getInitializer()->isNullValue()) { 254 if (const ArrayType *T = 255 dyn_cast<ArrayType>(GV->getType()->getElementType())) { 256 Field.resize(T->getNumElements()); 257 } 258 } 259 } 260 } 261}; 262 263//===----------------------------------------------------------------------===// 264/// DISerializeVisitor - This DIVisitor serializes all the fields in 265/// the supplied DebugInfoDesc. 266class DISerializeVisitor : public DIVisitor { 267private: 268 DISerializer &SR; // Active serializer. 269 std::vector<Constant*> &Elements; // Element accumulator. 270 271public: 272 DISerializeVisitor(DISerializer &S, std::vector<Constant*> &E) 273 : DIVisitor() 274 , SR(S) 275 , Elements(E) 276 {} 277 278 /// Apply - Set the value of each of the fields. 279 /// 280 virtual void Apply(int &Field) { 281 Elements.push_back(ConstantInt::get(Type::Int32Ty, int32_t(Field))); 282 } 283 virtual void Apply(unsigned &Field) { 284 Elements.push_back(ConstantInt::get(Type::Int32Ty, uint32_t(Field))); 285 } 286 virtual void Apply(int64_t &Field) { 287 Elements.push_back(ConstantInt::get(Type::Int64Ty, int64_t(Field))); 288 } 289 virtual void Apply(uint64_t &Field) { 290 Elements.push_back(ConstantInt::get(Type::Int64Ty, uint64_t(Field))); 291 } 292 virtual void Apply(bool &Field) { 293 Elements.push_back(ConstantInt::get(Type::Int1Ty, Field)); 294 } 295 virtual void Apply(std::string &Field) { 296 Elements.push_back(SR.getString(Field)); 297 } 298 virtual void Apply(DebugInfoDesc *&Field) { 299 GlobalVariable *GV = NULL; 300 301 // If non-NULL then convert to global. 302 if (Field) GV = SR.Serialize(Field); 303 304 // FIXME - At some point should use specific type. 305 const PointerType *EmptyTy = SR.getEmptyStructPtrType(); 306 307 if (GV) { 308 // Set to pointer to global. 309 Elements.push_back(ConstantExpr::getBitCast(GV, EmptyTy)); 310 } else { 311 // Use NULL. 312 Elements.push_back(ConstantPointerNull::get(EmptyTy)); 313 } 314 } 315 virtual void Apply(GlobalVariable *&Field) { 316 const PointerType *EmptyTy = SR.getEmptyStructPtrType(); 317 if (Field) { 318 Elements.push_back(ConstantExpr::getBitCast(Field, EmptyTy)); 319 } else { 320 Elements.push_back(ConstantPointerNull::get(EmptyTy)); 321 } 322 } 323 virtual void Apply(std::vector<DebugInfoDesc *> &Field) { 324 const PointerType *EmptyTy = SR.getEmptyStructPtrType(); 325 unsigned N = Field.size(); 326 ArrayType *AT = ArrayType::get(EmptyTy, N); 327 std::vector<Constant *> ArrayElements; 328 329 for (unsigned i = 0, N = Field.size(); i < N; ++i) { 330 if (DebugInfoDesc *Element = Field[i]) { 331 GlobalVariable *GVE = SR.Serialize(Element); 332 Constant *CE = ConstantExpr::getBitCast(GVE, EmptyTy); 333 ArrayElements.push_back(cast<Constant>(CE)); 334 } else { 335 ArrayElements.push_back(ConstantPointerNull::get(EmptyTy)); 336 } 337 } 338 339 Constant *CA = ConstantArray::get(AT, ArrayElements); 340 GlobalVariable *CAGV = new GlobalVariable(AT, true, 341 GlobalValue::InternalLinkage, 342 CA, "llvm.dbg.array", 343 SR.getModule()); 344 CAGV->setSection("llvm.metadata"); 345 Constant *CAE = ConstantExpr::getBitCast(CAGV, EmptyTy); 346 Elements.push_back(CAE); 347 } 348}; 349 350//===----------------------------------------------------------------------===// 351/// DIGetTypesVisitor - This DIVisitor gathers all the field types in 352/// the supplied DebugInfoDesc. 353class DIGetTypesVisitor : public DIVisitor { 354private: 355 DISerializer &SR; // Active serializer. 356 std::vector<const Type*> &Fields; // Type accumulator. 357 358public: 359 DIGetTypesVisitor(DISerializer &S, std::vector<const Type*> &F) 360 : DIVisitor() 361 , SR(S) 362 , Fields(F) 363 {} 364 365 /// Apply - Set the value of each of the fields. 366 /// 367 virtual void Apply(int &Field) { 368 Fields.push_back(Type::Int32Ty); 369 } 370 virtual void Apply(unsigned &Field) { 371 Fields.push_back(Type::Int32Ty); 372 } 373 virtual void Apply(int64_t &Field) { 374 Fields.push_back(Type::Int64Ty); 375 } 376 virtual void Apply(uint64_t &Field) { 377 Fields.push_back(Type::Int64Ty); 378 } 379 virtual void Apply(bool &Field) { 380 Fields.push_back(Type::Int1Ty); 381 } 382 virtual void Apply(std::string &Field) { 383 Fields.push_back(SR.getStrPtrType()); 384 } 385 virtual void Apply(DebugInfoDesc *&Field) { 386 // FIXME - At some point should use specific type. 387 const PointerType *EmptyTy = SR.getEmptyStructPtrType(); 388 Fields.push_back(EmptyTy); 389 } 390 virtual void Apply(GlobalVariable *&Field) { 391 const PointerType *EmptyTy = SR.getEmptyStructPtrType(); 392 Fields.push_back(EmptyTy); 393 } 394 virtual void Apply(std::vector<DebugInfoDesc *> &Field) { 395 const PointerType *EmptyTy = SR.getEmptyStructPtrType(); 396 Fields.push_back(EmptyTy); 397 } 398}; 399 400//===----------------------------------------------------------------------===// 401/// DIVerifyVisitor - This DIVisitor verifies all the field types against 402/// a constant initializer. 403class DIVerifyVisitor : public DIVisitor { 404private: 405 DIVerifier &VR; // Active verifier. 406 bool IsValid; // Validity status. 407 unsigned I; // Current operand index. 408 ConstantStruct *CI; // GlobalVariable constant initializer. 409 410public: 411 DIVerifyVisitor(DIVerifier &V, GlobalVariable *GV) 412 : DIVisitor() 413 , VR(V) 414 , IsValid(true) 415 , I(0) 416 , CI(cast<ConstantStruct>(GV->getInitializer())) 417 { 418 } 419 420 // Accessors. 421 bool isValid() const { return IsValid; } 422 423 /// Apply - Set the value of each of the fields. 424 /// 425 virtual void Apply(int &Field) { 426 Constant *C = CI->getOperand(I++); 427 IsValid = IsValid && isa<ConstantInt>(C); 428 } 429 virtual void Apply(unsigned &Field) { 430 Constant *C = CI->getOperand(I++); 431 IsValid = IsValid && isa<ConstantInt>(C); 432 } 433 virtual void Apply(int64_t &Field) { 434 Constant *C = CI->getOperand(I++); 435 IsValid = IsValid && isa<ConstantInt>(C); 436 } 437 virtual void Apply(uint64_t &Field) { 438 Constant *C = CI->getOperand(I++); 439 IsValid = IsValid && isa<ConstantInt>(C); 440 } 441 virtual void Apply(bool &Field) { 442 Constant *C = CI->getOperand(I++); 443 IsValid = IsValid && isa<ConstantInt>(C) && C->getType() == Type::Int1Ty; 444 } 445 virtual void Apply(std::string &Field) { 446 Constant *C = CI->getOperand(I++); 447 IsValid = IsValid && 448 (!C || isStringValue(C) || C->isNullValue()); 449 } 450 virtual void Apply(DebugInfoDesc *&Field) { 451 // FIXME - Prepare the correct descriptor. 452 Constant *C = CI->getOperand(I++); 453 IsValid = IsValid && isGlobalVariable(C); 454 } 455 virtual void Apply(GlobalVariable *&Field) { 456 Constant *C = CI->getOperand(I++); 457 IsValid = IsValid && isGlobalVariable(C); 458 } 459 virtual void Apply(std::vector<DebugInfoDesc *> &Field) { 460 Constant *C = CI->getOperand(I++); 461 IsValid = IsValid && isGlobalVariable(C); 462 if (!IsValid) return; 463 464 GlobalVariable *GV = getGlobalVariable(C); 465 IsValid = IsValid && GV && GV->hasInitializer(); 466 if (!IsValid) return; 467 468 ConstantArray *CA = dyn_cast<ConstantArray>(GV->getInitializer()); 469 IsValid = IsValid && CA; 470 if (!IsValid) return; 471 472 for (unsigned i = 0, N = CA->getNumOperands(); IsValid && i < N; ++i) { 473 IsValid = IsValid && isGlobalVariable(CA->getOperand(i)); 474 if (!IsValid) return; 475 476 GlobalVariable *GVE = getGlobalVariable(CA->getOperand(i)); 477 VR.Verify(GVE); 478 } 479 } 480}; 481 482 483//===----------------------------------------------------------------------===// 484 485/// TagFromGlobal - Returns the tag number from a debug info descriptor 486/// GlobalVariable. Return DIIValid if operand is not an unsigned int. 487unsigned DebugInfoDesc::TagFromGlobal(GlobalVariable *GV) { 488 ConstantInt *C = getUIntOperand(GV, 0); 489 return C ? ((unsigned)C->getZExtValue() & ~LLVMDebugVersionMask) : 490 (unsigned)DW_TAG_invalid; 491} 492 493/// VersionFromGlobal - Returns the version number from a debug info 494/// descriptor GlobalVariable. Return DIIValid if operand is not an unsigned 495/// int. 496unsigned DebugInfoDesc::VersionFromGlobal(GlobalVariable *GV) { 497 ConstantInt *C = getUIntOperand(GV, 0); 498 return C ? ((unsigned)C->getZExtValue() & LLVMDebugVersionMask) : 499 (unsigned)DW_TAG_invalid; 500} 501 502/// DescFactory - Create an instance of debug info descriptor based on Tag. 503/// Return NULL if not a recognized Tag. 504DebugInfoDesc *DebugInfoDesc::DescFactory(unsigned Tag) { 505 switch (Tag) { 506 case DW_TAG_anchor: return new AnchorDesc(); 507 case DW_TAG_compile_unit: return new CompileUnitDesc(); 508 case DW_TAG_variable: return new GlobalVariableDesc(); 509 case DW_TAG_subprogram: return new SubprogramDesc(); 510 case DW_TAG_lexical_block: return new BlockDesc(); 511 case DW_TAG_base_type: return new BasicTypeDesc(); 512 case DW_TAG_typedef: 513 case DW_TAG_pointer_type: 514 case DW_TAG_reference_type: 515 case DW_TAG_const_type: 516 case DW_TAG_volatile_type: 517 case DW_TAG_restrict_type: 518 case DW_TAG_member: 519 case DW_TAG_inheritance: return new DerivedTypeDesc(Tag); 520 case DW_TAG_array_type: 521 case DW_TAG_structure_type: 522 case DW_TAG_union_type: 523 case DW_TAG_enumeration_type: 524 case DW_TAG_vector_type: 525 case DW_TAG_subroutine_type: return new CompositeTypeDesc(Tag); 526 case DW_TAG_subrange_type: return new SubrangeDesc(); 527 case DW_TAG_enumerator: return new EnumeratorDesc(); 528 case DW_TAG_return_variable: 529 case DW_TAG_arg_variable: 530 case DW_TAG_auto_variable: return new VariableDesc(Tag); 531 default: break; 532 } 533 return NULL; 534} 535 536/// getLinkage - get linkage appropriate for this type of descriptor. 537/// 538GlobalValue::LinkageTypes DebugInfoDesc::getLinkage() const { 539 return GlobalValue::InternalLinkage; 540} 541 542/// ApplyToFields - Target the vistor to the fields of the descriptor. 543/// 544void DebugInfoDesc::ApplyToFields(DIVisitor *Visitor) { 545 Visitor->Apply(Tag); 546} 547 548//===----------------------------------------------------------------------===// 549 550AnchorDesc::AnchorDesc() 551: DebugInfoDesc(DW_TAG_anchor) 552, AnchorTag(0) 553{} 554AnchorDesc::AnchorDesc(AnchoredDesc *D) 555: DebugInfoDesc(DW_TAG_anchor) 556, AnchorTag(D->getTag()) 557{} 558 559// Implement isa/cast/dyncast. 560bool AnchorDesc::classof(const DebugInfoDesc *D) { 561 return D->getTag() == DW_TAG_anchor; 562} 563 564/// getLinkage - get linkage appropriate for this type of descriptor. 565/// 566GlobalValue::LinkageTypes AnchorDesc::getLinkage() const { 567 return GlobalValue::LinkOnceLinkage; 568} 569 570/// ApplyToFields - Target the visitor to the fields of the TransUnitDesc. 571/// 572void AnchorDesc::ApplyToFields(DIVisitor *Visitor) { 573 DebugInfoDesc::ApplyToFields(Visitor); 574 575 Visitor->Apply(AnchorTag); 576} 577 578/// getDescString - Return a string used to compose global names and labels. A 579/// A global variable name needs to be defined for each debug descriptor that is 580/// anchored. NOTE: that each global variable named here also needs to be added 581/// to the list of names left external in the internalizer. 582/// ExternalNames.insert("llvm.dbg.compile_units"); 583/// ExternalNames.insert("llvm.dbg.global_variables"); 584/// ExternalNames.insert("llvm.dbg.subprograms"); 585const char *AnchorDesc::getDescString() const { 586 switch (AnchorTag) { 587 case DW_TAG_compile_unit: return CompileUnitDesc::AnchorString; 588 case DW_TAG_variable: return GlobalVariableDesc::AnchorString; 589 case DW_TAG_subprogram: return SubprogramDesc::AnchorString; 590 default: break; 591 } 592 593 assert(0 && "Tag does not have a case for anchor string"); 594 return ""; 595} 596 597/// getTypeString - Return a string used to label this descriptors type. 598/// 599const char *AnchorDesc::getTypeString() const { 600 return "llvm.dbg.anchor.type"; 601} 602 603#ifndef NDEBUG 604void AnchorDesc::dump() { 605 cerr << getDescString() << " " 606 << "Version(" << getVersion() << "), " 607 << "Tag(" << getTag() << "), " 608 << "AnchorTag(" << AnchorTag << ")\n"; 609} 610#endif 611 612//===----------------------------------------------------------------------===// 613 614AnchoredDesc::AnchoredDesc(unsigned T) 615: DebugInfoDesc(T) 616, Anchor(NULL) 617{} 618 619/// ApplyToFields - Target the visitor to the fields of the AnchoredDesc. 620/// 621void AnchoredDesc::ApplyToFields(DIVisitor *Visitor) { 622 DebugInfoDesc::ApplyToFields(Visitor); 623 624 Visitor->Apply(Anchor); 625} 626 627//===----------------------------------------------------------------------===// 628 629CompileUnitDesc::CompileUnitDesc() 630: AnchoredDesc(DW_TAG_compile_unit) 631, Language(0) 632, FileName("") 633, Directory("") 634, Producer("") 635{} 636 637// Implement isa/cast/dyncast. 638bool CompileUnitDesc::classof(const DebugInfoDesc *D) { 639 return D->getTag() == DW_TAG_compile_unit; 640} 641 642/// ApplyToFields - Target the visitor to the fields of the CompileUnitDesc. 643/// 644void CompileUnitDesc::ApplyToFields(DIVisitor *Visitor) { 645 AnchoredDesc::ApplyToFields(Visitor); 646 647 // Handle cases out of sync with compiler. 648 if (getVersion() == 0) { 649 unsigned DebugVersion; 650 Visitor->Apply(DebugVersion); 651 } 652 653 Visitor->Apply(Language); 654 Visitor->Apply(FileName); 655 Visitor->Apply(Directory); 656 Visitor->Apply(Producer); 657} 658 659/// getDescString - Return a string used to compose global names and labels. 660/// 661const char *CompileUnitDesc::getDescString() const { 662 return "llvm.dbg.compile_unit"; 663} 664 665/// getTypeString - Return a string used to label this descriptors type. 666/// 667const char *CompileUnitDesc::getTypeString() const { 668 return "llvm.dbg.compile_unit.type"; 669} 670 671/// getAnchorString - Return a string used to label this descriptor's anchor. 672/// 673const char *CompileUnitDesc::AnchorString = "llvm.dbg.compile_units"; 674const char *CompileUnitDesc::getAnchorString() const { 675 return AnchorString; 676} 677 678#ifndef NDEBUG 679void CompileUnitDesc::dump() { 680 cerr << getDescString() << " " 681 << "Version(" << getVersion() << "), " 682 << "Tag(" << getTag() << "), " 683 << "Anchor(" << getAnchor() << "), " 684 << "Language(" << Language << "), " 685 << "FileName(\"" << FileName << "\"), " 686 << "Directory(\"" << Directory << "\"), " 687 << "Producer(\"" << Producer << "\")\n"; 688} 689#endif 690 691//===----------------------------------------------------------------------===// 692 693TypeDesc::TypeDesc(unsigned T) 694: DebugInfoDesc(T) 695, Context(NULL) 696, Name("") 697, File(NULL) 698, Line(0) 699, Size(0) 700, Align(0) 701, Offset(0) 702, Flags(0) 703{} 704 705/// ApplyToFields - Target the visitor to the fields of the TypeDesc. 706/// 707void TypeDesc::ApplyToFields(DIVisitor *Visitor) { 708 DebugInfoDesc::ApplyToFields(Visitor); 709 710 Visitor->Apply(Context); 711 Visitor->Apply(Name); 712 Visitor->Apply(File); 713 Visitor->Apply(Line); 714 Visitor->Apply(Size); 715 Visitor->Apply(Align); 716 Visitor->Apply(Offset); 717 if (getVersion() > LLVMDebugVersion4) Visitor->Apply(Flags); 718} 719 720/// getDescString - Return a string used to compose global names and labels. 721/// 722const char *TypeDesc::getDescString() const { 723 return "llvm.dbg.type"; 724} 725 726/// getTypeString - Return a string used to label this descriptor's type. 727/// 728const char *TypeDesc::getTypeString() const { 729 return "llvm.dbg.type.type"; 730} 731 732#ifndef NDEBUG 733void TypeDesc::dump() { 734 cerr << getDescString() << " " 735 << "Version(" << getVersion() << "), " 736 << "Tag(" << getTag() << "), " 737 << "Context(" << Context << "), " 738 << "Name(\"" << Name << "\"), " 739 << "File(" << File << "), " 740 << "Line(" << Line << "), " 741 << "Size(" << Size << "), " 742 << "Align(" << Align << "), " 743 << "Offset(" << Offset << "), " 744 << "Flags(" << Flags << ")\n"; 745} 746#endif 747 748//===----------------------------------------------------------------------===// 749 750BasicTypeDesc::BasicTypeDesc() 751: TypeDesc(DW_TAG_base_type) 752, Encoding(0) 753{} 754 755// Implement isa/cast/dyncast. 756bool BasicTypeDesc::classof(const DebugInfoDesc *D) { 757 return D->getTag() == DW_TAG_base_type; 758} 759 760/// ApplyToFields - Target the visitor to the fields of the BasicTypeDesc. 761/// 762void BasicTypeDesc::ApplyToFields(DIVisitor *Visitor) { 763 TypeDesc::ApplyToFields(Visitor); 764 765 Visitor->Apply(Encoding); 766} 767 768/// getDescString - Return a string used to compose global names and labels. 769/// 770const char *BasicTypeDesc::getDescString() const { 771 return "llvm.dbg.basictype"; 772} 773 774/// getTypeString - Return a string used to label this descriptor's type. 775/// 776const char *BasicTypeDesc::getTypeString() const { 777 return "llvm.dbg.basictype.type"; 778} 779 780#ifndef NDEBUG 781void BasicTypeDesc::dump() { 782 cerr << getDescString() << " " 783 << "Version(" << getVersion() << "), " 784 << "Tag(" << getTag() << "), " 785 << "Context(" << getContext() << "), " 786 << "Name(\"" << getName() << "\"), " 787 << "Size(" << getSize() << "), " 788 << "Encoding(" << Encoding << ")\n"; 789} 790#endif 791 792//===----------------------------------------------------------------------===// 793 794DerivedTypeDesc::DerivedTypeDesc(unsigned T) 795: TypeDesc(T) 796, FromType(NULL) 797{} 798 799// Implement isa/cast/dyncast. 800bool DerivedTypeDesc::classof(const DebugInfoDesc *D) { 801 unsigned T = D->getTag(); 802 switch (T) { 803 case DW_TAG_typedef: 804 case DW_TAG_pointer_type: 805 case DW_TAG_reference_type: 806 case DW_TAG_const_type: 807 case DW_TAG_volatile_type: 808 case DW_TAG_restrict_type: 809 case DW_TAG_member: 810 case DW_TAG_inheritance: 811 return true; 812 default: break; 813 } 814 return false; 815} 816 817/// ApplyToFields - Target the visitor to the fields of the DerivedTypeDesc. 818/// 819void DerivedTypeDesc::ApplyToFields(DIVisitor *Visitor) { 820 TypeDesc::ApplyToFields(Visitor); 821 822 Visitor->Apply(FromType); 823} 824 825/// getDescString - Return a string used to compose global names and labels. 826/// 827const char *DerivedTypeDesc::getDescString() const { 828 return "llvm.dbg.derivedtype"; 829} 830 831/// getTypeString - Return a string used to label this descriptor's type. 832/// 833const char *DerivedTypeDesc::getTypeString() const { 834 return "llvm.dbg.derivedtype.type"; 835} 836 837#ifndef NDEBUG 838void DerivedTypeDesc::dump() { 839 cerr << getDescString() << " " 840 << "Version(" << getVersion() << "), " 841 << "Tag(" << getTag() << "), " 842 << "Context(" << getContext() << "), " 843 << "Name(\"" << getName() << "\"), " 844 << "Size(" << getSize() << "), " 845 << "File(" << getFile() << "), " 846 << "Line(" << getLine() << "), " 847 << "FromType(" << FromType << ")\n"; 848} 849#endif 850 851//===----------------------------------------------------------------------===// 852 853CompositeTypeDesc::CompositeTypeDesc(unsigned T) 854: DerivedTypeDesc(T) 855, Elements() 856{} 857 858// Implement isa/cast/dyncast. 859bool CompositeTypeDesc::classof(const DebugInfoDesc *D) { 860 unsigned T = D->getTag(); 861 switch (T) { 862 case DW_TAG_array_type: 863 case DW_TAG_structure_type: 864 case DW_TAG_union_type: 865 case DW_TAG_enumeration_type: 866 case DW_TAG_vector_type: 867 case DW_TAG_subroutine_type: 868 return true; 869 default: break; 870 } 871 return false; 872} 873 874/// ApplyToFields - Target the visitor to the fields of the CompositeTypeDesc. 875/// 876void CompositeTypeDesc::ApplyToFields(DIVisitor *Visitor) { 877 DerivedTypeDesc::ApplyToFields(Visitor); 878 879 Visitor->Apply(Elements); 880} 881 882/// getDescString - Return a string used to compose global names and labels. 883/// 884const char *CompositeTypeDesc::getDescString() const { 885 return "llvm.dbg.compositetype"; 886} 887 888/// getTypeString - Return a string used to label this descriptor's type. 889/// 890const char *CompositeTypeDesc::getTypeString() const { 891 return "llvm.dbg.compositetype.type"; 892} 893 894#ifndef NDEBUG 895void CompositeTypeDesc::dump() { 896 cerr << getDescString() << " " 897 << "Version(" << getVersion() << "), " 898 << "Tag(" << getTag() << "), " 899 << "Context(" << getContext() << "), " 900 << "Name(\"" << getName() << "\"), " 901 << "Size(" << getSize() << "), " 902 << "File(" << getFile() << "), " 903 << "Line(" << getLine() << "), " 904 << "FromType(" << getFromType() << "), " 905 << "Elements.size(" << Elements.size() << ")\n"; 906} 907#endif 908 909//===----------------------------------------------------------------------===// 910 911SubrangeDesc::SubrangeDesc() 912: DebugInfoDesc(DW_TAG_subrange_type) 913, Lo(0) 914, Hi(0) 915{} 916 917// Implement isa/cast/dyncast. 918bool SubrangeDesc::classof(const DebugInfoDesc *D) { 919 return D->getTag() == DW_TAG_subrange_type; 920} 921 922/// ApplyToFields - Target the visitor to the fields of the SubrangeDesc. 923/// 924void SubrangeDesc::ApplyToFields(DIVisitor *Visitor) { 925 DebugInfoDesc::ApplyToFields(Visitor); 926 927 Visitor->Apply(Lo); 928 Visitor->Apply(Hi); 929} 930 931/// getDescString - Return a string used to compose global names and labels. 932/// 933const char *SubrangeDesc::getDescString() const { 934 return "llvm.dbg.subrange"; 935} 936 937/// getTypeString - Return a string used to label this descriptor's type. 938/// 939const char *SubrangeDesc::getTypeString() const { 940 return "llvm.dbg.subrange.type"; 941} 942 943#ifndef NDEBUG 944void SubrangeDesc::dump() { 945 cerr << getDescString() << " " 946 << "Version(" << getVersion() << "), " 947 << "Tag(" << getTag() << "), " 948 << "Lo(" << Lo << "), " 949 << "Hi(" << Hi << ")\n"; 950} 951#endif 952 953//===----------------------------------------------------------------------===// 954 955EnumeratorDesc::EnumeratorDesc() 956: DebugInfoDesc(DW_TAG_enumerator) 957, Name("") 958, Value(0) 959{} 960 961// Implement isa/cast/dyncast. 962bool EnumeratorDesc::classof(const DebugInfoDesc *D) { 963 return D->getTag() == DW_TAG_enumerator; 964} 965 966/// ApplyToFields - Target the visitor to the fields of the EnumeratorDesc. 967/// 968void EnumeratorDesc::ApplyToFields(DIVisitor *Visitor) { 969 DebugInfoDesc::ApplyToFields(Visitor); 970 971 Visitor->Apply(Name); 972 Visitor->Apply(Value); 973} 974 975/// getDescString - Return a string used to compose global names and labels. 976/// 977const char *EnumeratorDesc::getDescString() const { 978 return "llvm.dbg.enumerator"; 979} 980 981/// getTypeString - Return a string used to label this descriptor's type. 982/// 983const char *EnumeratorDesc::getTypeString() const { 984 return "llvm.dbg.enumerator.type"; 985} 986 987#ifndef NDEBUG 988void EnumeratorDesc::dump() { 989 cerr << getDescString() << " " 990 << "Version(" << getVersion() << "), " 991 << "Tag(" << getTag() << "), " 992 << "Name(" << Name << "), " 993 << "Value(" << Value << ")\n"; 994} 995#endif 996 997//===----------------------------------------------------------------------===// 998 999VariableDesc::VariableDesc(unsigned T) 1000: DebugInfoDesc(T) 1001, Context(NULL) 1002, Name("") 1003, File(NULL) 1004, Line(0) 1005, TyDesc(0) 1006{} 1007 1008// Implement isa/cast/dyncast. 1009bool VariableDesc::classof(const DebugInfoDesc *D) { 1010 unsigned T = D->getTag(); 1011 switch (T) { 1012 case DW_TAG_auto_variable: 1013 case DW_TAG_arg_variable: 1014 case DW_TAG_return_variable: 1015 return true; 1016 default: break; 1017 } 1018 return false; 1019} 1020 1021/// ApplyToFields - Target the visitor to the fields of the VariableDesc. 1022/// 1023void VariableDesc::ApplyToFields(DIVisitor *Visitor) { 1024 DebugInfoDesc::ApplyToFields(Visitor); 1025 1026 Visitor->Apply(Context); 1027 Visitor->Apply(Name); 1028 Visitor->Apply(File); 1029 Visitor->Apply(Line); 1030 Visitor->Apply(TyDesc); 1031} 1032 1033/// getDescString - Return a string used to compose global names and labels. 1034/// 1035const char *VariableDesc::getDescString() const { 1036 return "llvm.dbg.variable"; 1037} 1038 1039/// getTypeString - Return a string used to label this descriptor's type. 1040/// 1041const char *VariableDesc::getTypeString() const { 1042 return "llvm.dbg.variable.type"; 1043} 1044 1045#ifndef NDEBUG 1046void VariableDesc::dump() { 1047 cerr << getDescString() << " " 1048 << "Version(" << getVersion() << "), " 1049 << "Tag(" << getTag() << "), " 1050 << "Context(" << Context << "), " 1051 << "Name(\"" << Name << "\"), " 1052 << "File(" << File << "), " 1053 << "Line(" << Line << "), " 1054 << "TyDesc(" << TyDesc << ")\n"; 1055} 1056#endif 1057 1058//===----------------------------------------------------------------------===// 1059 1060GlobalDesc::GlobalDesc(unsigned T) 1061: AnchoredDesc(T) 1062, Context(0) 1063, Name("") 1064, FullName("") 1065, LinkageName("") 1066, File(NULL) 1067, Line(0) 1068, TyDesc(NULL) 1069, IsStatic(false) 1070, IsDefinition(false) 1071{} 1072 1073/// ApplyToFields - Target the visitor to the fields of the global. 1074/// 1075void GlobalDesc::ApplyToFields(DIVisitor *Visitor) { 1076 AnchoredDesc::ApplyToFields(Visitor); 1077 1078 Visitor->Apply(Context); 1079 Visitor->Apply(Name); 1080 Visitor->Apply(FullName); 1081 Visitor->Apply(LinkageName); 1082 Visitor->Apply(File); 1083 Visitor->Apply(Line); 1084 Visitor->Apply(TyDesc); 1085 Visitor->Apply(IsStatic); 1086 Visitor->Apply(IsDefinition); 1087} 1088 1089//===----------------------------------------------------------------------===// 1090 1091GlobalVariableDesc::GlobalVariableDesc() 1092: GlobalDesc(DW_TAG_variable) 1093, Global(NULL) 1094{} 1095 1096// Implement isa/cast/dyncast. 1097bool GlobalVariableDesc::classof(const DebugInfoDesc *D) { 1098 return D->getTag() == DW_TAG_variable; 1099} 1100 1101/// ApplyToFields - Target the visitor to the fields of the GlobalVariableDesc. 1102/// 1103void GlobalVariableDesc::ApplyToFields(DIVisitor *Visitor) { 1104 GlobalDesc::ApplyToFields(Visitor); 1105 1106 Visitor->Apply(Global); 1107} 1108 1109/// getDescString - Return a string used to compose global names and labels. 1110/// 1111const char *GlobalVariableDesc::getDescString() const { 1112 return "llvm.dbg.global_variable"; 1113} 1114 1115/// getTypeString - Return a string used to label this descriptors type. 1116/// 1117const char *GlobalVariableDesc::getTypeString() const { 1118 return "llvm.dbg.global_variable.type"; 1119} 1120 1121/// getAnchorString - Return a string used to label this descriptor's anchor. 1122/// 1123const char *GlobalVariableDesc::AnchorString = "llvm.dbg.global_variables"; 1124const char *GlobalVariableDesc::getAnchorString() const { 1125 return AnchorString; 1126} 1127 1128#ifndef NDEBUG 1129void GlobalVariableDesc::dump() { 1130 cerr << getDescString() << " " 1131 << "Version(" << getVersion() << "), " 1132 << "Tag(" << getTag() << "), " 1133 << "Anchor(" << getAnchor() << "), " 1134 << "Name(\"" << getName() << "\"), " 1135 << "FullName(\"" << getFullName() << "\"), " 1136 << "LinkageName(\"" << getLinkageName() << "\"), " 1137 << "File(" << getFile() << ")," 1138 << "Line(" << getLine() << ")," 1139 << "Type(" << getType() << "), " 1140 << "IsStatic(" << (isStatic() ? "true" : "false") << "), " 1141 << "IsDefinition(" << (isDefinition() ? "true" : "false") << "), " 1142 << "Global(" << Global << ")\n"; 1143} 1144#endif 1145 1146//===----------------------------------------------------------------------===// 1147 1148SubprogramDesc::SubprogramDesc() 1149: GlobalDesc(DW_TAG_subprogram) 1150{} 1151 1152// Implement isa/cast/dyncast. 1153bool SubprogramDesc::classof(const DebugInfoDesc *D) { 1154 return D->getTag() == DW_TAG_subprogram; 1155} 1156 1157/// ApplyToFields - Target the visitor to the fields of the 1158/// SubprogramDesc. 1159void SubprogramDesc::ApplyToFields(DIVisitor *Visitor) { 1160 GlobalDesc::ApplyToFields(Visitor); 1161} 1162 1163/// getDescString - Return a string used to compose global names and labels. 1164/// 1165const char *SubprogramDesc::getDescString() const { 1166 return "llvm.dbg.subprogram"; 1167} 1168 1169/// getTypeString - Return a string used to label this descriptors type. 1170/// 1171const char *SubprogramDesc::getTypeString() const { 1172 return "llvm.dbg.subprogram.type"; 1173} 1174 1175/// getAnchorString - Return a string used to label this descriptor's anchor. 1176/// 1177const char *SubprogramDesc::AnchorString = "llvm.dbg.subprograms"; 1178const char *SubprogramDesc::getAnchorString() const { 1179 return AnchorString; 1180} 1181 1182#ifndef NDEBUG 1183void SubprogramDesc::dump() { 1184 cerr << getDescString() << " " 1185 << "Version(" << getVersion() << "), " 1186 << "Tag(" << getTag() << "), " 1187 << "Anchor(" << getAnchor() << "), " 1188 << "Name(\"" << getName() << "\"), " 1189 << "FullName(\"" << getFullName() << "\"), " 1190 << "LinkageName(\"" << getLinkageName() << "\"), " 1191 << "File(" << getFile() << ")," 1192 << "Line(" << getLine() << ")," 1193 << "Type(" << getType() << "), " 1194 << "IsStatic(" << (isStatic() ? "true" : "false") << "), " 1195 << "IsDefinition(" << (isDefinition() ? "true" : "false") << ")\n"; 1196} 1197#endif 1198 1199//===----------------------------------------------------------------------===// 1200 1201BlockDesc::BlockDesc() 1202: DebugInfoDesc(DW_TAG_lexical_block) 1203, Context(NULL) 1204{} 1205 1206// Implement isa/cast/dyncast. 1207bool BlockDesc::classof(const DebugInfoDesc *D) { 1208 return D->getTag() == DW_TAG_lexical_block; 1209} 1210 1211/// ApplyToFields - Target the visitor to the fields of the BlockDesc. 1212/// 1213void BlockDesc::ApplyToFields(DIVisitor *Visitor) { 1214 DebugInfoDesc::ApplyToFields(Visitor); 1215 1216 Visitor->Apply(Context); 1217} 1218 1219/// getDescString - Return a string used to compose global names and labels. 1220/// 1221const char *BlockDesc::getDescString() const { 1222 return "llvm.dbg.block"; 1223} 1224 1225/// getTypeString - Return a string used to label this descriptors type. 1226/// 1227const char *BlockDesc::getTypeString() const { 1228 return "llvm.dbg.block.type"; 1229} 1230 1231#ifndef NDEBUG 1232void BlockDesc::dump() { 1233 cerr << getDescString() << " " 1234 << "Version(" << getVersion() << "), " 1235 << "Tag(" << getTag() << ")," 1236 << "Context(" << Context << ")\n"; 1237} 1238#endif 1239 1240//===----------------------------------------------------------------------===// 1241 1242DebugInfoDesc *DIDeserializer::Deserialize(Value *V) { 1243 return Deserialize(getGlobalVariable(V)); 1244} 1245DebugInfoDesc *DIDeserializer::Deserialize(GlobalVariable *GV) { 1246 // Handle NULL. 1247 if (!GV) return NULL; 1248 1249 // Check to see if it has been already deserialized. 1250 DebugInfoDesc *&Slot = GlobalDescs[GV]; 1251 if (Slot) return Slot; 1252 1253 // Get the Tag from the global. 1254 unsigned Tag = DebugInfoDesc::TagFromGlobal(GV); 1255 1256 // Create an empty instance of the correct sort. 1257 Slot = DebugInfoDesc::DescFactory(Tag); 1258 1259 // If not a user defined descriptor. 1260 if (Slot) { 1261 // Deserialize the fields. 1262 DIDeserializeVisitor DRAM(*this, GV); 1263 DRAM.ApplyToFields(Slot); 1264 } 1265 1266 return Slot; 1267} 1268 1269//===----------------------------------------------------------------------===// 1270 1271/// getStrPtrType - Return a "sbyte *" type. 1272/// 1273const PointerType *DISerializer::getStrPtrType() { 1274 // If not already defined. 1275 if (!StrPtrTy) { 1276 // Construct the pointer to signed bytes. 1277 StrPtrTy = PointerType::getUnqual(Type::Int8Ty); 1278 } 1279 1280 return StrPtrTy; 1281} 1282 1283/// getEmptyStructPtrType - Return a "{ }*" type. 1284/// 1285const PointerType *DISerializer::getEmptyStructPtrType() { 1286 // If not already defined. 1287 if (!EmptyStructPtrTy) { 1288 // Construct the empty structure type. 1289 const StructType *EmptyStructTy = 1290 StructType::get(std::vector<const Type*>()); 1291 // Construct the pointer to empty structure type. 1292 EmptyStructPtrTy = PointerType::getUnqual(EmptyStructTy); 1293 } 1294 1295 return EmptyStructPtrTy; 1296} 1297 1298/// getTagType - Return the type describing the specified descriptor (via tag.) 1299/// 1300const StructType *DISerializer::getTagType(DebugInfoDesc *DD) { 1301 // Attempt to get the previously defined type. 1302 StructType *&Ty = TagTypes[DD->getTag()]; 1303 1304 // If not already defined. 1305 if (!Ty) { 1306 // Set up fields vector. 1307 std::vector<const Type*> Fields; 1308 // Get types of fields. 1309 DIGetTypesVisitor GTAM(*this, Fields); 1310 GTAM.ApplyToFields(DD); 1311 1312 // Construct structured type. 1313 Ty = StructType::get(Fields); 1314 1315 // Register type name with module. 1316 M->addTypeName(DD->getTypeString(), Ty); 1317 } 1318 1319 return Ty; 1320} 1321 1322/// getString - Construct the string as constant string global. 1323/// 1324Constant *DISerializer::getString(const std::string &String) { 1325 // Check string cache for previous edition. 1326 Constant *&Slot = StringCache[String]; 1327 // Return Constant if previously defined. 1328 if (Slot) return Slot; 1329 // If empty string then use a sbyte* null instead. 1330 if (String.empty()) { 1331 Slot = ConstantPointerNull::get(getStrPtrType()); 1332 } else { 1333 // Construct string as an llvm constant. 1334 Constant *ConstStr = ConstantArray::get(String); 1335 // Otherwise create and return a new string global. 1336 GlobalVariable *StrGV = new GlobalVariable(ConstStr->getType(), true, 1337 GlobalVariable::InternalLinkage, 1338 ConstStr, ".str", M); 1339 StrGV->setSection("llvm.metadata"); 1340 // Convert to generic string pointer. 1341 Slot = ConstantExpr::getBitCast(StrGV, getStrPtrType()); 1342 } 1343 return Slot; 1344 1345} 1346 1347/// Serialize - Recursively cast the specified descriptor into a GlobalVariable 1348/// so that it can be serialized to a .bc or .ll file. 1349GlobalVariable *DISerializer::Serialize(DebugInfoDesc *DD) { 1350 // Check if the DebugInfoDesc is already in the map. 1351 GlobalVariable *&Slot = DescGlobals[DD]; 1352 1353 // See if DebugInfoDesc exists, if so return prior GlobalVariable. 1354 if (Slot) return Slot; 1355 1356 // Get the type associated with the Tag. 1357 const StructType *Ty = getTagType(DD); 1358 1359 // Create the GlobalVariable early to prevent infinite recursion. 1360 GlobalVariable *GV = new GlobalVariable(Ty, true, DD->getLinkage(), 1361 NULL, DD->getDescString(), M); 1362 GV->setSection("llvm.metadata"); 1363 1364 // Insert new GlobalVariable in DescGlobals map. 1365 Slot = GV; 1366 1367 // Set up elements vector 1368 std::vector<Constant*> Elements; 1369 // Add fields. 1370 DISerializeVisitor SRAM(*this, Elements); 1371 SRAM.ApplyToFields(DD); 1372 1373 // Set the globals initializer. 1374 GV->setInitializer(ConstantStruct::get(Ty, Elements)); 1375 1376 return GV; 1377} 1378 1379/// addDescriptor - Directly connect DD with existing GV. 1380void DISerializer::addDescriptor(DebugInfoDesc *DD, 1381 GlobalVariable *GV) { 1382 DescGlobals[DD] = GV; 1383} 1384 1385//===----------------------------------------------------------------------===// 1386 1387/// Verify - Return true if the GlobalVariable appears to be a valid 1388/// serialization of a DebugInfoDesc. 1389bool DIVerifier::Verify(Value *V) { 1390 return !V || Verify(getGlobalVariable(V)); 1391} 1392bool DIVerifier::Verify(GlobalVariable *GV) { 1393 // NULLs are valid. 1394 if (!GV) return true; 1395 1396 // Check prior validity. 1397 unsigned &ValiditySlot = Validity[GV]; 1398 1399 // If visited before then use old state. 1400 if (ValiditySlot) return ValiditySlot == Valid; 1401 1402 // Assume validity for the time being (recursion.) 1403 ValiditySlot = Valid; 1404 1405 // Make sure the global is internal or link once (anchor.) 1406 if (GV->getLinkage() != GlobalValue::InternalLinkage && 1407 GV->getLinkage() != GlobalValue::LinkOnceLinkage) { 1408 ValiditySlot = Invalid; 1409 return false; 1410 } 1411 1412 // Get the Tag. 1413 unsigned Tag = DebugInfoDesc::TagFromGlobal(GV); 1414 1415 // Check for user defined descriptors. 1416 if (Tag == DW_TAG_invalid) { 1417 ValiditySlot = Valid; 1418 return true; 1419 } 1420 1421 // Get the Version. 1422 unsigned Version = DebugInfoDesc::VersionFromGlobal(GV); 1423 1424 // Check for version mismatch. 1425 if (Version != LLVMDebugVersion) { 1426 ValiditySlot = Invalid; 1427 return false; 1428 } 1429 1430 // Construct an empty DebugInfoDesc. 1431 DebugInfoDesc *DD = DebugInfoDesc::DescFactory(Tag); 1432 1433 // Allow for user defined descriptors. 1434 if (!DD) return true; 1435 1436 // Get the initializer constant. 1437 ConstantStruct *CI = cast<ConstantStruct>(GV->getInitializer()); 1438 1439 // Get the operand count. 1440 unsigned N = CI->getNumOperands(); 1441 1442 // Get the field count. 1443 unsigned &CountSlot = Counts[Tag]; 1444 if (!CountSlot) { 1445 // Check the operand count to the field count 1446 DICountVisitor CTAM; 1447 CTAM.ApplyToFields(DD); 1448 CountSlot = CTAM.getCount(); 1449 } 1450 1451 // Field count must be at most equal operand count. 1452 if (CountSlot > N) { 1453 delete DD; 1454 ValiditySlot = Invalid; 1455 return false; 1456 } 1457 1458 // Check each field for valid type. 1459 DIVerifyVisitor VRAM(*this, GV); 1460 VRAM.ApplyToFields(DD); 1461 1462 // Release empty DebugInfoDesc. 1463 delete DD; 1464 1465 // If fields are not valid. 1466 if (!VRAM.isValid()) { 1467 ValiditySlot = Invalid; 1468 return false; 1469 } 1470 1471 return true; 1472} 1473 1474/// isVerified - Return true if the specified GV has already been 1475/// verified as a debug information descriptor. 1476bool DIVerifier::isVerified(GlobalVariable *GV) { 1477 unsigned &ValiditySlot = Validity[GV]; 1478 if (ValiditySlot) return ValiditySlot == Valid; 1479 return false; 1480} 1481 1482//===----------------------------------------------------------------------===// 1483 1484DebugScope::~DebugScope() { 1485 for (unsigned i = 0, N = Scopes.size(); i < N; ++i) delete Scopes[i]; 1486 for (unsigned j = 0, M = Variables.size(); j < M; ++j) delete Variables[j]; 1487} 1488 1489//===----------------------------------------------------------------------===// 1490 1491MachineModuleInfo::MachineModuleInfo() 1492: ImmutablePass((intptr_t)&ID) 1493, DR() 1494, VR() 1495, CompileUnits() 1496, Directories() 1497, SourceFiles() 1498, Lines() 1499, LabelIDList() 1500, ScopeMap() 1501, RootScope(NULL) 1502, FrameMoves() 1503, LandingPads() 1504, Personalities() 1505, CallsEHReturn(0) 1506, CallsUnwindInit(0) 1507{ 1508 // Always emit "no personality" info 1509 Personalities.push_back(NULL); 1510} 1511MachineModuleInfo::~MachineModuleInfo() { 1512 1513} 1514 1515/// doInitialization - Initialize the state for a new module. 1516/// 1517bool MachineModuleInfo::doInitialization() { 1518 return false; 1519} 1520 1521/// doFinalization - Tear down the state after completion of a module. 1522/// 1523bool MachineModuleInfo::doFinalization() { 1524 return false; 1525} 1526 1527/// BeginFunction - Begin gathering function meta information. 1528/// 1529void MachineModuleInfo::BeginFunction(MachineFunction *MF) { 1530 // Coming soon. 1531} 1532 1533/// EndFunction - Discard function meta information. 1534/// 1535void MachineModuleInfo::EndFunction() { 1536 // Clean up scope information. 1537 if (RootScope) { 1538 delete RootScope; 1539 ScopeMap.clear(); 1540 RootScope = NULL; 1541 } 1542 1543 // Clean up line info. 1544 Lines.clear(); 1545 1546 // Clean up frame info. 1547 FrameMoves.clear(); 1548 1549 // Clean up exception info. 1550 LandingPads.clear(); 1551 TypeInfos.clear(); 1552 FilterIds.clear(); 1553 FilterEnds.clear(); 1554 CallsEHReturn = 0; 1555 CallsUnwindInit = 0; 1556} 1557 1558/// getDescFor - Convert a Value to a debug information descriptor. 1559/// 1560// FIXME - use new Value type when available. 1561DebugInfoDesc *MachineModuleInfo::getDescFor(Value *V) { 1562 return DR.Deserialize(V); 1563} 1564 1565/// AnalyzeModule - Scan the module for global debug information. 1566/// 1567void MachineModuleInfo::AnalyzeModule(Module &M) { 1568 SetupCompileUnits(M); 1569 1570 // Insert functions in the llvm.used array into UsedFunctions. 1571 GlobalVariable *GV = M.getGlobalVariable("llvm.used"); 1572 if (!GV || !GV->hasInitializer()) return; 1573 1574 // Should be an array of 'i8*'. 1575 ConstantArray *InitList = dyn_cast<ConstantArray>(GV->getInitializer()); 1576 if (InitList == 0) return; 1577 1578 for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) { 1579 if (ConstantExpr *CE = dyn_cast<ConstantExpr>(InitList->getOperand(i))) 1580 if (CE->getOpcode() == Instruction::BitCast) 1581 if (Function *F = dyn_cast<Function>(CE->getOperand(0))) 1582 UsedFunctions.insert(F); 1583 } 1584} 1585 1586/// needsFrameInfo - Returns true if we need to gather callee-saved register 1587/// move info for the frame. 1588bool MachineModuleInfo::needsFrameInfo() const { 1589 return hasDebugInfo() || ExceptionHandling; 1590} 1591 1592/// SetupCompileUnits - Set up the unique vector of compile units. 1593/// 1594void MachineModuleInfo::SetupCompileUnits(Module &M) { 1595 std::vector<CompileUnitDesc *>CU = getAnchoredDescriptors<CompileUnitDesc>(M); 1596 1597 for (unsigned i = 0, N = CU.size(); i < N; i++) { 1598 CompileUnits.insert(CU[i]); 1599 } 1600} 1601 1602/// getCompileUnits - Return a vector of debug compile units. 1603/// 1604const UniqueVector<CompileUnitDesc *> MachineModuleInfo::getCompileUnits()const{ 1605 return CompileUnits; 1606} 1607 1608/// getGlobalVariablesUsing - Return all of the GlobalVariables that use the 1609/// named GlobalVariable. 1610std::vector<GlobalVariable*> 1611MachineModuleInfo::getGlobalVariablesUsing(Module &M, 1612 const std::string &RootName) { 1613 return ::getGlobalVariablesUsing(M, RootName); 1614} 1615 1616/// RecordSourceLine - Records location information and associates it with a 1617/// debug label. Returns a unique label ID used to generate a label and 1618/// provide correspondence to the source line list. 1619unsigned MachineModuleInfo::RecordSourceLine(unsigned Line, unsigned Column, 1620 unsigned Source) { 1621 unsigned ID = NextLabelID(); 1622 Lines.push_back(SourceLineInfo(Line, Column, Source, ID)); 1623 return ID; 1624} 1625 1626/// RecordSource - Register a source file with debug info. Returns an source 1627/// ID. 1628unsigned MachineModuleInfo::RecordSource(const std::string &Directory, 1629 const std::string &Source) { 1630 unsigned DirectoryID = Directories.insert(Directory); 1631 return SourceFiles.insert(SourceFileInfo(DirectoryID, Source)); 1632} 1633unsigned MachineModuleInfo::RecordSource(const CompileUnitDesc *CompileUnit) { 1634 return RecordSource(CompileUnit->getDirectory(), 1635 CompileUnit->getFileName()); 1636} 1637 1638/// RecordRegionStart - Indicate the start of a region. 1639/// 1640unsigned MachineModuleInfo::RecordRegionStart(Value *V) { 1641 // FIXME - need to be able to handle split scopes because of bb cloning. 1642 DebugInfoDesc *ScopeDesc = DR.Deserialize(V); 1643 DebugScope *Scope = getOrCreateScope(ScopeDesc); 1644 unsigned ID = NextLabelID(); 1645 if (!Scope->getStartLabelID()) Scope->setStartLabelID(ID); 1646 return ID; 1647} 1648 1649/// RecordRegionEnd - Indicate the end of a region. 1650/// 1651unsigned MachineModuleInfo::RecordRegionEnd(Value *V) { 1652 // FIXME - need to be able to handle split scopes because of bb cloning. 1653 DebugInfoDesc *ScopeDesc = DR.Deserialize(V); 1654 DebugScope *Scope = getOrCreateScope(ScopeDesc); 1655 unsigned ID = NextLabelID(); 1656 Scope->setEndLabelID(ID); 1657 return ID; 1658} 1659 1660/// RecordVariable - Indicate the declaration of a local variable. 1661/// 1662void MachineModuleInfo::RecordVariable(GlobalValue *GV, unsigned FrameIndex) { 1663 VariableDesc *VD = cast<VariableDesc>(DR.Deserialize(GV)); 1664 DebugScope *Scope = getOrCreateScope(VD->getContext()); 1665 DebugVariable *DV = new DebugVariable(VD, FrameIndex); 1666 Scope->AddVariable(DV); 1667} 1668 1669/// getOrCreateScope - Returns the scope associated with the given descriptor. 1670/// 1671DebugScope *MachineModuleInfo::getOrCreateScope(DebugInfoDesc *ScopeDesc) { 1672 DebugScope *&Slot = ScopeMap[ScopeDesc]; 1673 if (!Slot) { 1674 // FIXME - breaks down when the context is an inlined function. 1675 DebugInfoDesc *ParentDesc = NULL; 1676 if (BlockDesc *Block = dyn_cast<BlockDesc>(ScopeDesc)) { 1677 ParentDesc = Block->getContext(); 1678 } 1679 DebugScope *Parent = ParentDesc ? getOrCreateScope(ParentDesc) : NULL; 1680 Slot = new DebugScope(Parent, ScopeDesc); 1681 if (Parent) { 1682 Parent->AddScope(Slot); 1683 } else if (RootScope) { 1684 // FIXME - Add inlined function scopes to the root so we can delete 1685 // them later. Long term, handle inlined functions properly. 1686 RootScope->AddScope(Slot); 1687 } else { 1688 // First function is top level function. 1689 RootScope = Slot; 1690 } 1691 } 1692 return Slot; 1693} 1694 1695//===-EH-------------------------------------------------------------------===// 1696 1697/// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the 1698/// specified MachineBasicBlock. 1699LandingPadInfo &MachineModuleInfo::getOrCreateLandingPadInfo 1700 (MachineBasicBlock *LandingPad) { 1701 unsigned N = LandingPads.size(); 1702 for (unsigned i = 0; i < N; ++i) { 1703 LandingPadInfo &LP = LandingPads[i]; 1704 if (LP.LandingPadBlock == LandingPad) 1705 return LP; 1706 } 1707 1708 LandingPads.push_back(LandingPadInfo(LandingPad)); 1709 return LandingPads[N]; 1710} 1711 1712/// addInvoke - Provide the begin and end labels of an invoke style call and 1713/// associate it with a try landing pad block. 1714void MachineModuleInfo::addInvoke(MachineBasicBlock *LandingPad, 1715 unsigned BeginLabel, unsigned EndLabel) { 1716 LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 1717 LP.BeginLabels.push_back(BeginLabel); 1718 LP.EndLabels.push_back(EndLabel); 1719} 1720 1721/// addLandingPad - Provide the label of a try LandingPad block. 1722/// 1723unsigned MachineModuleInfo::addLandingPad(MachineBasicBlock *LandingPad) { 1724 unsigned LandingPadLabel = NextLabelID(); 1725 LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 1726 LP.LandingPadLabel = LandingPadLabel; 1727 return LandingPadLabel; 1728} 1729 1730/// addPersonality - Provide the personality function for the exception 1731/// information. 1732void MachineModuleInfo::addPersonality(MachineBasicBlock *LandingPad, 1733 Function *Personality) { 1734 LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 1735 LP.Personality = Personality; 1736 1737 for (unsigned i = 0; i < Personalities.size(); ++i) 1738 if (Personalities[i] == Personality) 1739 return; 1740 1741 Personalities.push_back(Personality); 1742} 1743 1744/// addCatchTypeInfo - Provide the catch typeinfo for a landing pad. 1745/// 1746void MachineModuleInfo::addCatchTypeInfo(MachineBasicBlock *LandingPad, 1747 std::vector<GlobalVariable *> &TyInfo) { 1748 LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 1749 for (unsigned N = TyInfo.size(); N; --N) 1750 LP.TypeIds.push_back(getTypeIDFor(TyInfo[N - 1])); 1751} 1752 1753/// addFilterTypeInfo - Provide the filter typeinfo for a landing pad. 1754/// 1755void MachineModuleInfo::addFilterTypeInfo(MachineBasicBlock *LandingPad, 1756 std::vector<GlobalVariable *> &TyInfo) { 1757 LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 1758 std::vector<unsigned> IdsInFilter (TyInfo.size()); 1759 for (unsigned I = 0, E = TyInfo.size(); I != E; ++I) 1760 IdsInFilter[I] = getTypeIDFor(TyInfo[I]); 1761 LP.TypeIds.push_back(getFilterIDFor(IdsInFilter)); 1762} 1763 1764/// addCleanup - Add a cleanup action for a landing pad. 1765/// 1766void MachineModuleInfo::addCleanup(MachineBasicBlock *LandingPad) { 1767 LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 1768 LP.TypeIds.push_back(0); 1769} 1770 1771/// TidyLandingPads - Remap landing pad labels and remove any deleted landing 1772/// pads. 1773void MachineModuleInfo::TidyLandingPads() { 1774 for (unsigned i = 0; i != LandingPads.size(); ) { 1775 LandingPadInfo &LandingPad = LandingPads[i]; 1776 LandingPad.LandingPadLabel = MappedLabel(LandingPad.LandingPadLabel); 1777 1778 // Special case: we *should* emit LPs with null LP MBB. This indicates 1779 // "nounwind" case. 1780 if (!LandingPad.LandingPadLabel && LandingPad.LandingPadBlock) { 1781 LandingPads.erase(LandingPads.begin() + i); 1782 continue; 1783 } 1784 1785 for (unsigned j=0; j != LandingPads[i].BeginLabels.size(); ) { 1786 unsigned BeginLabel = MappedLabel(LandingPad.BeginLabels[j]); 1787 unsigned EndLabel = MappedLabel(LandingPad.EndLabels[j]); 1788 1789 if (!BeginLabel || !EndLabel) { 1790 LandingPad.BeginLabels.erase(LandingPad.BeginLabels.begin() + j); 1791 LandingPad.EndLabels.erase(LandingPad.EndLabels.begin() + j); 1792 continue; 1793 } 1794 1795 LandingPad.BeginLabels[j] = BeginLabel; 1796 LandingPad.EndLabels[j] = EndLabel; 1797 ++j; 1798 } 1799 1800 // Remove landing pads with no try-ranges. 1801 if (LandingPads[i].BeginLabels.empty()) { 1802 LandingPads.erase(LandingPads.begin() + i); 1803 continue; 1804 } 1805 1806 // If there is no landing pad, ensure that the list of typeids is empty. 1807 // If the only typeid is a cleanup, this is the same as having no typeids. 1808 if (!LandingPad.LandingPadBlock || 1809 (LandingPad.TypeIds.size() == 1 && !LandingPad.TypeIds[0])) 1810 LandingPad.TypeIds.clear(); 1811 1812 ++i; 1813 } 1814} 1815 1816/// getTypeIDFor - Return the type id for the specified typeinfo. This is 1817/// function wide. 1818unsigned MachineModuleInfo::getTypeIDFor(GlobalVariable *TI) { 1819 for (unsigned i = 0, N = TypeInfos.size(); i != N; ++i) 1820 if (TypeInfos[i] == TI) return i + 1; 1821 1822 TypeInfos.push_back(TI); 1823 return TypeInfos.size(); 1824} 1825 1826/// getFilterIDFor - Return the filter id for the specified typeinfos. This is 1827/// function wide. 1828int MachineModuleInfo::getFilterIDFor(std::vector<unsigned> &TyIds) { 1829 // If the new filter coincides with the tail of an existing filter, then 1830 // re-use the existing filter. Folding filters more than this requires 1831 // re-ordering filters and/or their elements - probably not worth it. 1832 for (std::vector<unsigned>::iterator I = FilterEnds.begin(), 1833 E = FilterEnds.end(); I != E; ++I) { 1834 unsigned i = *I, j = TyIds.size(); 1835 1836 while (i && j) 1837 if (FilterIds[--i] != TyIds[--j]) 1838 goto try_next; 1839 1840 if (!j) 1841 // The new filter coincides with range [i, end) of the existing filter. 1842 return -(1 + i); 1843 1844try_next:; 1845 } 1846 1847 // Add the new filter. 1848 int FilterID = -(1 + FilterIds.size()); 1849 FilterIds.reserve(FilterIds.size() + TyIds.size() + 1); 1850 for (unsigned I = 0, N = TyIds.size(); I != N; ++I) 1851 FilterIds.push_back(TyIds[I]); 1852 FilterEnds.push_back(FilterIds.size()); 1853 FilterIds.push_back(0); // terminator 1854 return FilterID; 1855} 1856 1857/// getPersonality - Return the personality function for the current function. 1858Function *MachineModuleInfo::getPersonality() const { 1859 // FIXME: Until PR1414 will be fixed, we're using 1 personality function per 1860 // function 1861 return !LandingPads.empty() ? LandingPads[0].Personality : NULL; 1862} 1863 1864/// getPersonalityIndex - Return unique index for current personality 1865/// function. NULL personality function should always get zero index. 1866unsigned MachineModuleInfo::getPersonalityIndex() const { 1867 const Function* Personality = NULL; 1868 1869 // Scan landing pads. If there is at least one non-NULL personality - use it. 1870 for (unsigned i = 0; i != LandingPads.size(); ++i) 1871 if (LandingPads[i].Personality) { 1872 Personality = LandingPads[i].Personality; 1873 break; 1874 } 1875 1876 for (unsigned i = 0; i < Personalities.size(); ++i) { 1877 if (Personalities[i] == Personality) 1878 return i; 1879 } 1880 1881 // This should never happen 1882 assert(0 && "Personality function should be set!"); 1883 return 0; 1884} 1885 1886//===----------------------------------------------------------------------===// 1887/// DebugLabelFolding pass - This pass prunes out redundant labels. This allows 1888/// a info consumer to determine if the range of two labels is empty, by seeing 1889/// if the labels map to the same reduced label. 1890 1891namespace llvm { 1892 1893struct DebugLabelFolder : public MachineFunctionPass { 1894 static char ID; 1895 DebugLabelFolder() : MachineFunctionPass((intptr_t)&ID) {} 1896 1897 virtual bool runOnMachineFunction(MachineFunction &MF); 1898 virtual const char *getPassName() const { return "Label Folder"; } 1899}; 1900 1901char DebugLabelFolder::ID = 0; 1902 1903bool DebugLabelFolder::runOnMachineFunction(MachineFunction &MF) { 1904 // Get machine module info. 1905 MachineModuleInfo *MMI = getAnalysisToUpdate<MachineModuleInfo>(); 1906 if (!MMI) return false; 1907 1908 // Track if change is made. 1909 bool MadeChange = false; 1910 // No prior label to begin. 1911 unsigned PriorLabel = 0; 1912 1913 // Iterate through basic blocks. 1914 for (MachineFunction::iterator BB = MF.begin(), E = MF.end(); 1915 BB != E; ++BB) { 1916 // Iterate through instructions. 1917 for (MachineBasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ) { 1918 // Is it a label. 1919 if (I->isDebugLabel()) { 1920 // The label ID # is always operand #0, an immediate. 1921 unsigned NextLabel = I->getOperand(0).getImm(); 1922 1923 // If there was an immediate prior label. 1924 if (PriorLabel) { 1925 // Remap the current label to prior label. 1926 MMI->RemapLabel(NextLabel, PriorLabel); 1927 // Delete the current label. 1928 I = BB->erase(I); 1929 // Indicate a change has been made. 1930 MadeChange = true; 1931 continue; 1932 } else { 1933 // Start a new round. 1934 PriorLabel = NextLabel; 1935 } 1936 } else { 1937 // No consecutive labels. 1938 PriorLabel = 0; 1939 } 1940 1941 ++I; 1942 } 1943 } 1944 1945 return MadeChange; 1946} 1947 1948FunctionPass *createDebugLabelFoldingPass() { return new DebugLabelFolder(); } 1949 1950} 1951 1952