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