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() 205 , DR(D) 206 , I(0) 207 , CI(cast<ConstantStruct>(GV->getInitializer())) 208 {} 209 210 /// Apply - Set the value of each of the fields. 211 /// 212 virtual void Apply(int &Field) { 213 Constant *C = CI->getOperand(I++); 214 Field = cast<ConstantInt>(C)->getSExtValue(); 215 } 216 virtual void Apply(unsigned &Field) { 217 Constant *C = CI->getOperand(I++); 218 Field = cast<ConstantInt>(C)->getZExtValue(); 219 } 220 virtual void Apply(int64_t &Field) { 221 Constant *C = CI->getOperand(I++); 222 Field = cast<ConstantInt>(C)->getSExtValue(); 223 } 224 virtual void Apply(uint64_t &Field) { 225 Constant *C = CI->getOperand(I++); 226 Field = cast<ConstantInt>(C)->getZExtValue(); 227 } 228 virtual void Apply(bool &Field) { 229 Constant *C = CI->getOperand(I++); 230 Field = cast<ConstantInt>(C)->getZExtValue(); 231 } 232 virtual void Apply(std::string &Field) { 233 Constant *C = CI->getOperand(I++); 234 std::string S; 235 if (GetConstantStringInfo(C, S)) 236 Field = S; 237 else 238 Field = ""; 239 } 240 virtual void Apply(DebugInfoDesc *&Field) { 241 Constant *C = CI->getOperand(I++); 242 Field = DR.Deserialize(C); 243 } 244 virtual void Apply(GlobalVariable *&Field) { 245 Constant *C = CI->getOperand(I++); 246 Field = getGlobalVariable(C); 247 } 248 virtual void Apply(std::vector<DebugInfoDesc *> &Field) { 249 Field.resize(0); 250 Constant *C = CI->getOperand(I++); 251 GlobalVariable *GV = getGlobalVariable(C); 252 if (GV->hasInitializer()) { 253 if (ConstantArray *CA = dyn_cast<ConstantArray>(GV->getInitializer())) { 254 for (unsigned i = 0, N = CA->getNumOperands(); i < N; ++i) { 255 GlobalVariable *GVE = getGlobalVariable(CA->getOperand(i)); 256 DebugInfoDesc *DE = DR.Deserialize(GVE); 257 Field.push_back(DE); 258 } 259 } else if (GV->getInitializer()->isNullValue()) { 260 if (const ArrayType *T = 261 dyn_cast<ArrayType>(GV->getType()->getElementType())) { 262 Field.resize(T->getNumElements()); 263 } 264 } 265 } 266 } 267 }; 268 269 //===----------------------------------------------------------------------===// 270 /// DISerializeVisitor - This DIVisitor serializes all the fields in 271 /// the supplied DebugInfoDesc. 272 class DISerializeVisitor : public DIVisitor { 273 private: 274 DISerializer &SR; // Active serializer. 275 std::vector<Constant*> &Elements; // Element accumulator. 276 277 public: 278 DISerializeVisitor(DISerializer &S, std::vector<Constant*> &E) 279 : DIVisitor() 280 , SR(S) 281 , Elements(E) 282 {} 283 284 /// Apply - Set the value of each of the fields. 285 /// 286 virtual void Apply(int &Field) { 287 Elements.push_back(ConstantInt::get(Type::Int32Ty, int32_t(Field))); 288 } 289 virtual void Apply(unsigned &Field) { 290 Elements.push_back(ConstantInt::get(Type::Int32Ty, uint32_t(Field))); 291 } 292 virtual void Apply(int64_t &Field) { 293 Elements.push_back(ConstantInt::get(Type::Int64Ty, int64_t(Field))); 294 } 295 virtual void Apply(uint64_t &Field) { 296 Elements.push_back(ConstantInt::get(Type::Int64Ty, uint64_t(Field))); 297 } 298 virtual void Apply(bool &Field) { 299 Elements.push_back(ConstantInt::get(Type::Int1Ty, Field)); 300 } 301 virtual void Apply(std::string &Field) { 302 Elements.push_back(SR.getString(Field)); 303 } 304 virtual void Apply(DebugInfoDesc *&Field) { 305 GlobalVariable *GV = NULL; 306 307 // If non-NULL then convert to global. 308 if (Field) GV = SR.Serialize(Field); 309 310 // FIXME - At some point should use specific type. 311 const PointerType *EmptyTy = SR.getEmptyStructPtrType(); 312 313 if (GV) { 314 // Set to pointer to global. 315 Elements.push_back(ConstantExpr::getBitCast(GV, EmptyTy)); 316 } else { 317 // Use NULL. 318 Elements.push_back(ConstantPointerNull::get(EmptyTy)); 319 } 320 } 321 virtual void Apply(GlobalVariable *&Field) { 322 const PointerType *EmptyTy = SR.getEmptyStructPtrType(); 323 if (Field) { 324 Elements.push_back(ConstantExpr::getBitCast(Field, EmptyTy)); 325 } else { 326 Elements.push_back(ConstantPointerNull::get(EmptyTy)); 327 } 328 } 329 virtual void Apply(std::vector<DebugInfoDesc *> &Field) { 330 const PointerType *EmptyTy = SR.getEmptyStructPtrType(); 331 unsigned N = Field.size(); 332 ArrayType *AT = ArrayType::get(EmptyTy, N); 333 std::vector<Constant *> ArrayElements; 334 335 for (unsigned i = 0, N = Field.size(); i < N; ++i) { 336 if (DebugInfoDesc *Element = Field[i]) { 337 GlobalVariable *GVE = SR.Serialize(Element); 338 Constant *CE = ConstantExpr::getBitCast(GVE, EmptyTy); 339 ArrayElements.push_back(cast<Constant>(CE)); 340 } else { 341 ArrayElements.push_back(ConstantPointerNull::get(EmptyTy)); 342 } 343 } 344 345 Constant *CA = ConstantArray::get(AT, ArrayElements); 346 GlobalVariable *CAGV = new GlobalVariable(AT, true, 347 GlobalValue::InternalLinkage, 348 CA, "llvm.dbg.array", 349 SR.getModule()); 350 CAGV->setSection("llvm.metadata"); 351 Constant *CAE = ConstantExpr::getBitCast(CAGV, EmptyTy); 352 Elements.push_back(CAE); 353 } 354 }; 355 356 //===----------------------------------------------------------------------===// 357 /// DIGetTypesVisitor - This DIVisitor gathers all the field types in 358 /// the supplied DebugInfoDesc. 359 class DIGetTypesVisitor : public DIVisitor { 360 private: 361 DISerializer &SR; // Active serializer. 362 std::vector<const Type*> &Fields; // Type accumulator. 363 364 public: 365 DIGetTypesVisitor(DISerializer &S, std::vector<const Type*> &F) 366 : DIVisitor() 367 , SR(S) 368 , Fields(F) 369 {} 370 371 /// Apply - Set the value of each of the fields. 372 /// 373 virtual void Apply(int &Field) { 374 Fields.push_back(Type::Int32Ty); 375 } 376 virtual void Apply(unsigned &Field) { 377 Fields.push_back(Type::Int32Ty); 378 } 379 virtual void Apply(int64_t &Field) { 380 Fields.push_back(Type::Int64Ty); 381 } 382 virtual void Apply(uint64_t &Field) { 383 Fields.push_back(Type::Int64Ty); 384 } 385 virtual void Apply(bool &Field) { 386 Fields.push_back(Type::Int1Ty); 387 } 388 virtual void Apply(std::string &Field) { 389 Fields.push_back(SR.getStrPtrType()); 390 } 391 virtual void Apply(DebugInfoDesc *&Field) { 392 // FIXME - At some point should use specific type. 393 const PointerType *EmptyTy = SR.getEmptyStructPtrType(); 394 Fields.push_back(EmptyTy); 395 } 396 virtual void Apply(GlobalVariable *&Field) { 397 const PointerType *EmptyTy = SR.getEmptyStructPtrType(); 398 Fields.push_back(EmptyTy); 399 } 400 virtual void Apply(std::vector<DebugInfoDesc *> &Field) { 401 const PointerType *EmptyTy = SR.getEmptyStructPtrType(); 402 Fields.push_back(EmptyTy); 403 } 404 }; 405 406 //===----------------------------------------------------------------------===// 407 /// DIVerifyVisitor - This DIVisitor verifies all the field types against 408 /// a constant initializer. 409 class DIVerifyVisitor : public DIVisitor { 410 private: 411 DIVerifier &VR; // Active verifier. 412 bool IsValid; // Validity status. 413 unsigned I; // Current operand index. 414 ConstantStruct *CI; // GlobalVariable constant initializer. 415 416 public: 417 DIVerifyVisitor(DIVerifier &V, GlobalVariable *GV) 418 : DIVisitor() 419 , VR(V) 420 , IsValid(true) 421 , I(0) 422 , CI(cast<ConstantStruct>(GV->getInitializer())) 423 { 424 } 425 426 // Accessors. 427 bool isValid() const { return IsValid; } 428 429 /// Apply - Set the value of each of the fields. 430 /// 431 virtual void Apply(int &Field) { 432 Constant *C = CI->getOperand(I++); 433 IsValid = IsValid && isa<ConstantInt>(C); 434 } 435 virtual void Apply(unsigned &Field) { 436 Constant *C = CI->getOperand(I++); 437 IsValid = IsValid && isa<ConstantInt>(C); 438 } 439 virtual void Apply(int64_t &Field) { 440 Constant *C = CI->getOperand(I++); 441 IsValid = IsValid && isa<ConstantInt>(C); 442 } 443 virtual void Apply(uint64_t &Field) { 444 Constant *C = CI->getOperand(I++); 445 IsValid = IsValid && isa<ConstantInt>(C); 446 } 447 virtual void Apply(bool &Field) { 448 Constant *C = CI->getOperand(I++); 449 IsValid = IsValid && isa<ConstantInt>(C) && C->getType() == Type::Int1Ty; 450 } 451 virtual void Apply(std::string &Field) { 452 Constant *C = CI->getOperand(I++); 453 IsValid = IsValid && 454 (!C || isStringValue(C) || C->isNullValue()); 455 } 456 virtual void Apply(DebugInfoDesc *&Field) { 457 // FIXME - Prepare the correct descriptor. 458 Constant *C = CI->getOperand(I++); 459 IsValid = IsValid && isGlobalVariable(C); 460 } 461 virtual void Apply(GlobalVariable *&Field) { 462 Constant *C = CI->getOperand(I++); 463 IsValid = IsValid && isGlobalVariable(C); 464 } 465 virtual void Apply(std::vector<DebugInfoDesc *> &Field) { 466 Constant *C = CI->getOperand(I++); 467 IsValid = IsValid && isGlobalVariable(C); 468 if (!IsValid) return; 469 470 GlobalVariable *GV = getGlobalVariable(C); 471 IsValid = IsValid && GV && GV->hasInitializer(); 472 if (!IsValid) return; 473 474 ConstantArray *CA = dyn_cast<ConstantArray>(GV->getInitializer()); 475 IsValid = IsValid && CA; 476 if (!IsValid) return; 477 478 for (unsigned i = 0, N = CA->getNumOperands(); IsValid && i < N; ++i) { 479 IsValid = IsValid && isGlobalVariable(CA->getOperand(i)); 480 if (!IsValid) return; 481 482 GlobalVariable *GVE = getGlobalVariable(CA->getOperand(i)); 483 VR.Verify(GVE); 484 } 485 } 486 }; 487 488 } 489 490 //===----------------------------------------------------------------------===// 491 492 /// TagFromGlobal - Returns the tag number from a debug info descriptor 493 /// GlobalVariable. Return DIIValid if operand is not an unsigned int. 494 unsigned DebugInfoDesc::TagFromGlobal(GlobalVariable *GV) { 495 ConstantInt *C = getUIntOperand(GV, 0); 496 return C ? ((unsigned)C->getZExtValue() & ~LLVMDebugVersionMask) : 497 (unsigned)DW_TAG_invalid; 498 } 499 500 /// VersionFromGlobal - Returns the version number from a debug info 501 /// descriptor GlobalVariable. Return DIIValid if operand is not an unsigned 502 /// int. 503 unsigned DebugInfoDesc::VersionFromGlobal(GlobalVariable *GV) { 504 ConstantInt *C = getUIntOperand(GV, 0); 505 return C ? ((unsigned)C->getZExtValue() & LLVMDebugVersionMask) : 506 (unsigned)DW_TAG_invalid; 507 } 508 509 /// DescFactory - Create an instance of debug info descriptor based on Tag. 510 /// Return NULL if not a recognized Tag. 511 DebugInfoDesc *DebugInfoDesc::DescFactory(unsigned Tag) { 512 switch (Tag) { 513 case DW_TAG_anchor: return new AnchorDesc(); 514 case DW_TAG_compile_unit: return new CompileUnitDesc(); 515 case DW_TAG_variable: return new GlobalVariableDesc(); 516 case DW_TAG_subprogram: return new SubprogramDesc(); 517 case DW_TAG_lexical_block: return new BlockDesc(); 518 case DW_TAG_base_type: return new BasicTypeDesc(); 519 case DW_TAG_typedef: 520 case DW_TAG_pointer_type: 521 case DW_TAG_reference_type: 522 case DW_TAG_const_type: 523 case DW_TAG_volatile_type: 524 case DW_TAG_restrict_type: 525 case DW_TAG_member: 526 case DW_TAG_inheritance: return new DerivedTypeDesc(Tag); 527 case DW_TAG_array_type: 528 case DW_TAG_structure_type: 529 case DW_TAG_union_type: 530 case DW_TAG_enumeration_type: 531 case DW_TAG_vector_type: 532 case DW_TAG_subroutine_type: return new CompositeTypeDesc(Tag); 533 case DW_TAG_subrange_type: return new SubrangeDesc(); 534 case DW_TAG_enumerator: return new EnumeratorDesc(); 535 case DW_TAG_return_variable: 536 case DW_TAG_arg_variable: 537 case DW_TAG_auto_variable: return new VariableDesc(Tag); 538 default: break; 539 } 540 return NULL; 541 } 542 543 /// getLinkage - get linkage appropriate for this type of descriptor. 544 /// 545 GlobalValue::LinkageTypes DebugInfoDesc::getLinkage() const { 546 return GlobalValue::InternalLinkage; 547 } 548 549 /// ApplyToFields - Target the vistor to the fields of the descriptor. 550 /// 551 void DebugInfoDesc::ApplyToFields(DIVisitor *Visitor) { 552 Visitor->Apply(Tag); 553 } 554 555 //===----------------------------------------------------------------------===// 556 557 AnchorDesc::AnchorDesc() 558 : DebugInfoDesc(DW_TAG_anchor) 559 , AnchorTag(0) 560 {} 561 AnchorDesc::AnchorDesc(AnchoredDesc *D) 562 : DebugInfoDesc(DW_TAG_anchor) 563 , AnchorTag(D->getTag()) 564 {} 565 566 // Implement isa/cast/dyncast. 567 bool AnchorDesc::classof(const DebugInfoDesc *D) { 568 return D->getTag() == DW_TAG_anchor; 569 } 570 571 /// getLinkage - get linkage appropriate for this type of descriptor. 572 /// 573 GlobalValue::LinkageTypes AnchorDesc::getLinkage() const { 574 return GlobalValue::LinkOnceLinkage; 575 } 576 577 /// ApplyToFields - Target the visitor to the fields of the TransUnitDesc. 578 /// 579 void AnchorDesc::ApplyToFields(DIVisitor *Visitor) { 580 DebugInfoDesc::ApplyToFields(Visitor); 581 582 Visitor->Apply(AnchorTag); 583 } 584 585 /// getDescString - Return a string used to compose global names and labels. A 586 /// A global variable name needs to be defined for each debug descriptor that is 587 /// anchored. NOTE: that each global variable named here also needs to be added 588 /// to the list of names left external in the internalizer. 589 /// ExternalNames.insert("llvm.dbg.compile_units"); 590 /// ExternalNames.insert("llvm.dbg.global_variables"); 591 /// ExternalNames.insert("llvm.dbg.subprograms"); 592 const char *AnchorDesc::getDescString() const { 593 switch (AnchorTag) { 594 case DW_TAG_compile_unit: return CompileUnitDesc::AnchorString; 595 case DW_TAG_variable: return GlobalVariableDesc::AnchorString; 596 case DW_TAG_subprogram: return SubprogramDesc::AnchorString; 597 default: break; 598 } 599 600 assert(0 && "Tag does not have a case for anchor string"); 601 return ""; 602 } 603 604 /// getTypeString - Return a string used to label this descriptors type. 605 /// 606 const char *AnchorDesc::getTypeString() const { 607 return "llvm.dbg.anchor.type"; 608 } 609 610 #ifndef NDEBUG 611 void AnchorDesc::dump() { 612 cerr << getDescString() << " " 613 << "Version(" << getVersion() << "), " 614 << "Tag(" << getTag() << "), " 615 << "AnchorTag(" << AnchorTag << ")\n"; 616 } 617 #endif 618 619 //===----------------------------------------------------------------------===// 620 621 AnchoredDesc::AnchoredDesc(unsigned T) 622 : DebugInfoDesc(T) 623 , Anchor(NULL) 624 {} 625 626 /// ApplyToFields - Target the visitor to the fields of the AnchoredDesc. 627 /// 628 void AnchoredDesc::ApplyToFields(DIVisitor *Visitor) { 629 DebugInfoDesc::ApplyToFields(Visitor); 630 631 Visitor->Apply(Anchor); 632 } 633 634 //===----------------------------------------------------------------------===// 635 636 CompileUnitDesc::CompileUnitDesc() 637 : AnchoredDesc(DW_TAG_compile_unit) 638 , Language(0) 639 , FileName("") 640 , Directory("") 641 , Producer("") 642 {} 643 644 // Implement isa/cast/dyncast. 645 bool CompileUnitDesc::classof(const DebugInfoDesc *D) { 646 return D->getTag() == DW_TAG_compile_unit; 647 } 648 649 /// ApplyToFields - Target the visitor to the fields of the CompileUnitDesc. 650 /// 651 void CompileUnitDesc::ApplyToFields(DIVisitor *Visitor) { 652 AnchoredDesc::ApplyToFields(Visitor); 653 654 // Handle cases out of sync with compiler. 655 if (getVersion() == 0) { 656 unsigned DebugVersion; 657 Visitor->Apply(DebugVersion); 658 } 659 660 Visitor->Apply(Language); 661 Visitor->Apply(FileName); 662 Visitor->Apply(Directory); 663 Visitor->Apply(Producer); 664 } 665 666 /// getDescString - Return a string used to compose global names and labels. 667 /// 668 const char *CompileUnitDesc::getDescString() const { 669 return "llvm.dbg.compile_unit"; 670 } 671 672 /// getTypeString - Return a string used to label this descriptors type. 673 /// 674 const char *CompileUnitDesc::getTypeString() const { 675 return "llvm.dbg.compile_unit.type"; 676 } 677 678 /// getAnchorString - Return a string used to label this descriptor's anchor. 679 /// 680 const char *const CompileUnitDesc::AnchorString = "llvm.dbg.compile_units"; 681 const char *CompileUnitDesc::getAnchorString() const { 682 return AnchorString; 683 } 684 685 #ifndef NDEBUG 686 void CompileUnitDesc::dump() { 687 cerr << getDescString() << " " 688 << "Version(" << getVersion() << "), " 689 << "Tag(" << getTag() << "), " 690 << "Anchor(" << getAnchor() << "), " 691 << "Language(" << Language << "), " 692 << "FileName(\"" << FileName << "\"), " 693 << "Directory(\"" << Directory << "\"), " 694 << "Producer(\"" << Producer << "\")\n"; 695 } 696 #endif 697 698 //===----------------------------------------------------------------------===// 699 700 TypeDesc::TypeDesc(unsigned T) 701 : DebugInfoDesc(T) 702 , Context(NULL) 703 , Name("") 704 , File(NULL) 705 , Line(0) 706 , Size(0) 707 , Align(0) 708 , Offset(0) 709 , Flags(0) 710 {} 711 712 /// ApplyToFields - Target the visitor to the fields of the TypeDesc. 713 /// 714 void TypeDesc::ApplyToFields(DIVisitor *Visitor) { 715 DebugInfoDesc::ApplyToFields(Visitor); 716 717 Visitor->Apply(Context); 718 Visitor->Apply(Name); 719 Visitor->Apply(File); 720 Visitor->Apply(Line); 721 Visitor->Apply(Size); 722 Visitor->Apply(Align); 723 Visitor->Apply(Offset); 724 if (getVersion() > LLVMDebugVersion4) Visitor->Apply(Flags); 725 } 726 727 /// getDescString - Return a string used to compose global names and labels. 728 /// 729 const char *TypeDesc::getDescString() const { 730 return "llvm.dbg.type"; 731 } 732 733 /// getTypeString - Return a string used to label this descriptor's type. 734 /// 735 const char *TypeDesc::getTypeString() const { 736 return "llvm.dbg.type.type"; 737 } 738 739 #ifndef NDEBUG 740 void TypeDesc::dump() { 741 cerr << getDescString() << " " 742 << "Version(" << getVersion() << "), " 743 << "Tag(" << getTag() << "), " 744 << "Context(" << Context << "), " 745 << "Name(\"" << Name << "\"), " 746 << "File(" << File << "), " 747 << "Line(" << Line << "), " 748 << "Size(" << Size << "), " 749 << "Align(" << Align << "), " 750 << "Offset(" << Offset << "), " 751 << "Flags(" << Flags << ")\n"; 752 } 753 #endif 754 755 //===----------------------------------------------------------------------===// 756 757 BasicTypeDesc::BasicTypeDesc() 758 : TypeDesc(DW_TAG_base_type) 759 , Encoding(0) 760 {} 761 762 // Implement isa/cast/dyncast. 763 bool BasicTypeDesc::classof(const DebugInfoDesc *D) { 764 return D->getTag() == DW_TAG_base_type; 765 } 766 767 /// ApplyToFields - Target the visitor to the fields of the BasicTypeDesc. 768 /// 769 void BasicTypeDesc::ApplyToFields(DIVisitor *Visitor) { 770 TypeDesc::ApplyToFields(Visitor); 771 772 Visitor->Apply(Encoding); 773 } 774 775 /// getDescString - Return a string used to compose global names and labels. 776 /// 777 const char *BasicTypeDesc::getDescString() const { 778 return "llvm.dbg.basictype"; 779 } 780 781 /// getTypeString - Return a string used to label this descriptor's type. 782 /// 783 const char *BasicTypeDesc::getTypeString() const { 784 return "llvm.dbg.basictype.type"; 785 } 786 787 #ifndef NDEBUG 788 void BasicTypeDesc::dump() { 789 cerr << getDescString() << " " 790 << "Version(" << getVersion() << "), " 791 << "Tag(" << getTag() << "), " 792 << "Context(" << getContext() << "), " 793 << "Name(\"" << getName() << "\"), " 794 << "Size(" << getSize() << "), " 795 << "Encoding(" << Encoding << ")\n"; 796 } 797 #endif 798 799 //===----------------------------------------------------------------------===// 800 801 DerivedTypeDesc::DerivedTypeDesc(unsigned T) 802 : TypeDesc(T) 803 , FromType(NULL) 804 {} 805 806 // Implement isa/cast/dyncast. 807 bool DerivedTypeDesc::classof(const DebugInfoDesc *D) { 808 unsigned T = D->getTag(); 809 switch (T) { 810 case DW_TAG_typedef: 811 case DW_TAG_pointer_type: 812 case DW_TAG_reference_type: 813 case DW_TAG_const_type: 814 case DW_TAG_volatile_type: 815 case DW_TAG_restrict_type: 816 case DW_TAG_member: 817 case DW_TAG_inheritance: 818 return true; 819 default: break; 820 } 821 return false; 822 } 823 824 /// ApplyToFields - Target the visitor to the fields of the DerivedTypeDesc. 825 /// 826 void DerivedTypeDesc::ApplyToFields(DIVisitor *Visitor) { 827 TypeDesc::ApplyToFields(Visitor); 828 829 Visitor->Apply(FromType); 830 } 831 832 /// getDescString - Return a string used to compose global names and labels. 833 /// 834 const char *DerivedTypeDesc::getDescString() const { 835 return "llvm.dbg.derivedtype"; 836 } 837 838 /// getTypeString - Return a string used to label this descriptor's type. 839 /// 840 const char *DerivedTypeDesc::getTypeString() const { 841 return "llvm.dbg.derivedtype.type"; 842 } 843 844 #ifndef NDEBUG 845 void DerivedTypeDesc::dump() { 846 cerr << getDescString() << " " 847 << "Version(" << getVersion() << "), " 848 << "Tag(" << getTag() << "), " 849 << "Context(" << getContext() << "), " 850 << "Name(\"" << getName() << "\"), " 851 << "Size(" << getSize() << "), " 852 << "File(" << getFile() << "), " 853 << "Line(" << getLine() << "), " 854 << "FromType(" << FromType << ")\n"; 855 } 856 #endif 857 858 //===----------------------------------------------------------------------===// 859 860 CompositeTypeDesc::CompositeTypeDesc(unsigned T) 861 : DerivedTypeDesc(T) 862 , Elements() 863 {} 864 865 // Implement isa/cast/dyncast. 866 bool CompositeTypeDesc::classof(const DebugInfoDesc *D) { 867 unsigned T = D->getTag(); 868 switch (T) { 869 case DW_TAG_array_type: 870 case DW_TAG_structure_type: 871 case DW_TAG_union_type: 872 case DW_TAG_enumeration_type: 873 case DW_TAG_vector_type: 874 case DW_TAG_subroutine_type: 875 return true; 876 default: break; 877 } 878 return false; 879 } 880 881 /// ApplyToFields - Target the visitor to the fields of the CompositeTypeDesc. 882 /// 883 void CompositeTypeDesc::ApplyToFields(DIVisitor *Visitor) { 884 DerivedTypeDesc::ApplyToFields(Visitor); 885 886 Visitor->Apply(Elements); 887 } 888 889 /// getDescString - Return a string used to compose global names and labels. 890 /// 891 const char *CompositeTypeDesc::getDescString() const { 892 return "llvm.dbg.compositetype"; 893 } 894 895 /// getTypeString - Return a string used to label this descriptor's type. 896 /// 897 const char *CompositeTypeDesc::getTypeString() const { 898 return "llvm.dbg.compositetype.type"; 899 } 900 901 #ifndef NDEBUG 902 void CompositeTypeDesc::dump() { 903 cerr << getDescString() << " " 904 << "Version(" << getVersion() << "), " 905 << "Tag(" << getTag() << "), " 906 << "Context(" << getContext() << "), " 907 << "Name(\"" << getName() << "\"), " 908 << "Size(" << getSize() << "), " 909 << "File(" << getFile() << "), " 910 << "Line(" << getLine() << "), " 911 << "FromType(" << getFromType() << "), " 912 << "Elements.size(" << Elements.size() << ")\n"; 913 } 914 #endif 915 916 //===----------------------------------------------------------------------===// 917 918 SubrangeDesc::SubrangeDesc() 919 : DebugInfoDesc(DW_TAG_subrange_type) 920 , Lo(0) 921 , Hi(0) 922 {} 923 924 // Implement isa/cast/dyncast. 925 bool SubrangeDesc::classof(const DebugInfoDesc *D) { 926 return D->getTag() == DW_TAG_subrange_type; 927 } 928 929 /// ApplyToFields - Target the visitor to the fields of the SubrangeDesc. 930 /// 931 void SubrangeDesc::ApplyToFields(DIVisitor *Visitor) { 932 DebugInfoDesc::ApplyToFields(Visitor); 933 934 Visitor->Apply(Lo); 935 Visitor->Apply(Hi); 936 } 937 938 /// getDescString - Return a string used to compose global names and labels. 939 /// 940 const char *SubrangeDesc::getDescString() const { 941 return "llvm.dbg.subrange"; 942 } 943 944 /// getTypeString - Return a string used to label this descriptor's type. 945 /// 946 const char *SubrangeDesc::getTypeString() const { 947 return "llvm.dbg.subrange.type"; 948 } 949 950 #ifndef NDEBUG 951 void SubrangeDesc::dump() { 952 cerr << getDescString() << " " 953 << "Version(" << getVersion() << "), " 954 << "Tag(" << getTag() << "), " 955 << "Lo(" << Lo << "), " 956 << "Hi(" << Hi << ")\n"; 957 } 958 #endif 959 960 //===----------------------------------------------------------------------===// 961 962 EnumeratorDesc::EnumeratorDesc() 963 : DebugInfoDesc(DW_TAG_enumerator) 964 , Name("") 965 , Value(0) 966 {} 967 968 // Implement isa/cast/dyncast. 969 bool EnumeratorDesc::classof(const DebugInfoDesc *D) { 970 return D->getTag() == DW_TAG_enumerator; 971 } 972 973 /// ApplyToFields - Target the visitor to the fields of the EnumeratorDesc. 974 /// 975 void EnumeratorDesc::ApplyToFields(DIVisitor *Visitor) { 976 DebugInfoDesc::ApplyToFields(Visitor); 977 978 Visitor->Apply(Name); 979 Visitor->Apply(Value); 980 } 981 982 /// getDescString - Return a string used to compose global names and labels. 983 /// 984 const char *EnumeratorDesc::getDescString() const { 985 return "llvm.dbg.enumerator"; 986 } 987 988 /// getTypeString - Return a string used to label this descriptor's type. 989 /// 990 const char *EnumeratorDesc::getTypeString() const { 991 return "llvm.dbg.enumerator.type"; 992 } 993 994 #ifndef NDEBUG 995 void EnumeratorDesc::dump() { 996 cerr << getDescString() << " " 997 << "Version(" << getVersion() << "), " 998 << "Tag(" << getTag() << "), " 999 << "Name(" << Name << "), " 1000 << "Value(" << Value << ")\n"; 1001 } 1002 #endif 1003 1004 //===----------------------------------------------------------------------===// 1005 1006 VariableDesc::VariableDesc(unsigned T) 1007 : DebugInfoDesc(T) 1008 , Context(NULL) 1009 , Name("") 1010 , File(NULL) 1011 , Line(0) 1012 , TyDesc(0) 1013 {} 1014 1015 // Implement isa/cast/dyncast. 1016 bool VariableDesc::classof(const DebugInfoDesc *D) { 1017 unsigned T = D->getTag(); 1018 switch (T) { 1019 case DW_TAG_auto_variable: 1020 case DW_TAG_arg_variable: 1021 case DW_TAG_return_variable: 1022 return true; 1023 default: break; 1024 } 1025 return false; 1026 } 1027 1028 /// ApplyToFields - Target the visitor to the fields of the VariableDesc. 1029 /// 1030 void VariableDesc::ApplyToFields(DIVisitor *Visitor) { 1031 DebugInfoDesc::ApplyToFields(Visitor); 1032 1033 Visitor->Apply(Context); 1034 Visitor->Apply(Name); 1035 Visitor->Apply(File); 1036 Visitor->Apply(Line); 1037 Visitor->Apply(TyDesc); 1038 } 1039 1040 /// getDescString - Return a string used to compose global names and labels. 1041 /// 1042 const char *VariableDesc::getDescString() const { 1043 return "llvm.dbg.variable"; 1044 } 1045 1046 /// getTypeString - Return a string used to label this descriptor's type. 1047 /// 1048 const char *VariableDesc::getTypeString() const { 1049 return "llvm.dbg.variable.type"; 1050 } 1051 1052 #ifndef NDEBUG 1053 void VariableDesc::dump() { 1054 cerr << getDescString() << " " 1055 << "Version(" << getVersion() << "), " 1056 << "Tag(" << getTag() << "), " 1057 << "Context(" << Context << "), " 1058 << "Name(\"" << Name << "\"), " 1059 << "File(" << File << "), " 1060 << "Line(" << Line << "), " 1061 << "TyDesc(" << TyDesc << ")\n"; 1062 } 1063 #endif 1064 1065 //===----------------------------------------------------------------------===// 1066 1067 GlobalDesc::GlobalDesc(unsigned T) 1068 : AnchoredDesc(T) 1069 , Context(0) 1070 , Name("") 1071 , FullName("") 1072 , LinkageName("") 1073 , File(NULL) 1074 , Line(0) 1075 , TyDesc(NULL) 1076 , IsStatic(false) 1077 , IsDefinition(false) 1078 {} 1079 1080 /// ApplyToFields - Target the visitor to the fields of the global. 1081 /// 1082 void GlobalDesc::ApplyToFields(DIVisitor *Visitor) { 1083 AnchoredDesc::ApplyToFields(Visitor); 1084 1085 Visitor->Apply(Context); 1086 Visitor->Apply(Name); 1087 Visitor->Apply(FullName); 1088 Visitor->Apply(LinkageName); 1089 Visitor->Apply(File); 1090 Visitor->Apply(Line); 1091 Visitor->Apply(TyDesc); 1092 Visitor->Apply(IsStatic); 1093 Visitor->Apply(IsDefinition); 1094 } 1095 1096 //===----------------------------------------------------------------------===// 1097 1098 GlobalVariableDesc::GlobalVariableDesc() 1099 : GlobalDesc(DW_TAG_variable) 1100 , Global(NULL) 1101 {} 1102 1103 // Implement isa/cast/dyncast. 1104 bool GlobalVariableDesc::classof(const DebugInfoDesc *D) { 1105 return D->getTag() == DW_TAG_variable; 1106 } 1107 1108 /// ApplyToFields - Target the visitor to the fields of the GlobalVariableDesc. 1109 /// 1110 void GlobalVariableDesc::ApplyToFields(DIVisitor *Visitor) { 1111 GlobalDesc::ApplyToFields(Visitor); 1112 1113 Visitor->Apply(Global); 1114 } 1115 1116 /// getDescString - Return a string used to compose global names and labels. 1117 /// 1118 const char *GlobalVariableDesc::getDescString() const { 1119 return "llvm.dbg.global_variable"; 1120 } 1121 1122 /// getTypeString - Return a string used to label this descriptors type. 1123 /// 1124 const char *GlobalVariableDesc::getTypeString() const { 1125 return "llvm.dbg.global_variable.type"; 1126 } 1127 1128 /// getAnchorString - Return a string used to label this descriptor's anchor. 1129 /// 1130 const char *const GlobalVariableDesc::AnchorString = "llvm.dbg.global_variables"; 1131 const char *GlobalVariableDesc::getAnchorString() const { 1132 return AnchorString; 1133 } 1134 1135 #ifndef NDEBUG 1136 void GlobalVariableDesc::dump() { 1137 cerr << getDescString() << " " 1138 << "Version(" << getVersion() << "), " 1139 << "Tag(" << getTag() << "), " 1140 << "Anchor(" << getAnchor() << "), " 1141 << "Name(\"" << getName() << "\"), " 1142 << "FullName(\"" << getFullName() << "\"), " 1143 << "LinkageName(\"" << getLinkageName() << "\"), " 1144 << "File(" << getFile() << ")," 1145 << "Line(" << getLine() << ")," 1146 << "Type(" << getType() << "), " 1147 << "IsStatic(" << (isStatic() ? "true" : "false") << "), " 1148 << "IsDefinition(" << (isDefinition() ? "true" : "false") << "), " 1149 << "Global(" << Global << ")\n"; 1150 } 1151 #endif 1152 1153 //===----------------------------------------------------------------------===// 1154 1155 SubprogramDesc::SubprogramDesc() 1156 : GlobalDesc(DW_TAG_subprogram) 1157 {} 1158 1159 // Implement isa/cast/dyncast. 1160 bool SubprogramDesc::classof(const DebugInfoDesc *D) { 1161 return D->getTag() == DW_TAG_subprogram; 1162 } 1163 1164 /// ApplyToFields - Target the visitor to the fields of the 1165 /// SubprogramDesc. 1166 void SubprogramDesc::ApplyToFields(DIVisitor *Visitor) { 1167 GlobalDesc::ApplyToFields(Visitor); 1168 } 1169 1170 /// getDescString - Return a string used to compose global names and labels. 1171 /// 1172 const char *SubprogramDesc::getDescString() const { 1173 return "llvm.dbg.subprogram"; 1174 } 1175 1176 /// getTypeString - Return a string used to label this descriptors type. 1177 /// 1178 const char *SubprogramDesc::getTypeString() const { 1179 return "llvm.dbg.subprogram.type"; 1180 } 1181 1182 /// getAnchorString - Return a string used to label this descriptor's anchor. 1183 /// 1184 const char *const SubprogramDesc::AnchorString = "llvm.dbg.subprograms"; 1185 const char *SubprogramDesc::getAnchorString() const { 1186 return AnchorString; 1187 } 1188 1189 #ifndef NDEBUG 1190 void SubprogramDesc::dump() { 1191 cerr << getDescString() << " " 1192 << "Version(" << getVersion() << "), " 1193 << "Tag(" << getTag() << "), " 1194 << "Anchor(" << getAnchor() << "), " 1195 << "Name(\"" << getName() << "\"), " 1196 << "FullName(\"" << getFullName() << "\"), " 1197 << "LinkageName(\"" << getLinkageName() << "\"), " 1198 << "File(" << getFile() << ")," 1199 << "Line(" << getLine() << ")," 1200 << "Type(" << getType() << "), " 1201 << "IsStatic(" << (isStatic() ? "true" : "false") << "), " 1202 << "IsDefinition(" << (isDefinition() ? "true" : "false") << ")\n"; 1203 } 1204 #endif 1205 1206 //===----------------------------------------------------------------------===// 1207 1208 BlockDesc::BlockDesc() 1209 : DebugInfoDesc(DW_TAG_lexical_block) 1210 , Context(NULL) 1211 {} 1212 1213 // Implement isa/cast/dyncast. 1214 bool BlockDesc::classof(const DebugInfoDesc *D) { 1215 return D->getTag() == DW_TAG_lexical_block; 1216 } 1217 1218 /// ApplyToFields - Target the visitor to the fields of the BlockDesc. 1219 /// 1220 void BlockDesc::ApplyToFields(DIVisitor *Visitor) { 1221 DebugInfoDesc::ApplyToFields(Visitor); 1222 1223 Visitor->Apply(Context); 1224 } 1225 1226 /// getDescString - Return a string used to compose global names and labels. 1227 /// 1228 const char *BlockDesc::getDescString() const { 1229 return "llvm.dbg.block"; 1230 } 1231 1232 /// getTypeString - Return a string used to label this descriptors type. 1233 /// 1234 const char *BlockDesc::getTypeString() const { 1235 return "llvm.dbg.block.type"; 1236 } 1237 1238 #ifndef NDEBUG 1239 void BlockDesc::dump() { 1240 cerr << getDescString() << " " 1241 << "Version(" << getVersion() << "), " 1242 << "Tag(" << getTag() << ")," 1243 << "Context(" << Context << ")\n"; 1244 } 1245 #endif 1246 1247 //===----------------------------------------------------------------------===// 1248 1249 DebugInfoDesc *DIDeserializer::Deserialize(Value *V) { 1250 return Deserialize(getGlobalVariable(V)); 1251 } 1252 DebugInfoDesc *DIDeserializer::Deserialize(GlobalVariable *GV) { 1253 // Handle NULL. 1254 if (!GV) return NULL; 1255 1256 // Check to see if it has been already deserialized. 1257 DebugInfoDesc *&Slot = GlobalDescs[GV]; 1258 if (Slot) return Slot; 1259 1260 // Get the Tag from the global. 1261 unsigned Tag = DebugInfoDesc::TagFromGlobal(GV); 1262 1263 // Create an empty instance of the correct sort. 1264 Slot = DebugInfoDesc::DescFactory(Tag); 1265 1266 // If not a user defined descriptor. 1267 if (Slot) { 1268 // Deserialize the fields. 1269 DIDeserializeVisitor DRAM(*this, GV); 1270 DRAM.ApplyToFields(Slot); 1271 } 1272 1273 return Slot; 1274 } 1275 1276 //===----------------------------------------------------------------------===// 1277 1278 /// getStrPtrType - Return a "sbyte *" type. 1279 /// 1280 const PointerType *DISerializer::getStrPtrType() { 1281 // If not already defined. 1282 if (!StrPtrTy) { 1283 // Construct the pointer to signed bytes. 1284 StrPtrTy = PointerType::getUnqual(Type::Int8Ty); 1285 } 1286 1287 return StrPtrTy; 1288 } 1289 1290 /// getEmptyStructPtrType - Return a "{ }*" type. 1291 /// 1292 const PointerType *DISerializer::getEmptyStructPtrType() { 1293 // If not already defined. 1294 if (!EmptyStructPtrTy) { 1295 // Construct the empty structure type. 1296 const StructType *EmptyStructTy = 1297 StructType::get(std::vector<const Type*>()); 1298 // Construct the pointer to empty structure type. 1299 EmptyStructPtrTy = PointerType::getUnqual(EmptyStructTy); 1300 } 1301 1302 return EmptyStructPtrTy; 1303 } 1304 1305 /// getTagType - Return the type describing the specified descriptor (via tag.) 1306 /// 1307 const StructType *DISerializer::getTagType(DebugInfoDesc *DD) { 1308 // Attempt to get the previously defined type. 1309 StructType *&Ty = TagTypes[DD->getTag()]; 1310 1311 // If not already defined. 1312 if (!Ty) { 1313 // Set up fields vector. 1314 std::vector<const Type*> Fields; 1315 // Get types of fields. 1316 DIGetTypesVisitor GTAM(*this, Fields); 1317 GTAM.ApplyToFields(DD); 1318 1319 // Construct structured type. 1320 Ty = StructType::get(Fields); 1321 1322 // Register type name with module. 1323 M->addTypeName(DD->getTypeString(), Ty); 1324 } 1325 1326 return Ty; 1327 } 1328 1329 /// getString - Construct the string as constant string global. 1330 /// 1331 Constant *DISerializer::getString(const std::string &String) { 1332 // Check string cache for previous edition. 1333 Constant *&Slot = StringCache[String]; 1334 // Return Constant if previously defined. 1335 if (Slot) return Slot; 1336 // If empty string then use a sbyte* null instead. 1337 if (String.empty()) { 1338 Slot = ConstantPointerNull::get(getStrPtrType()); 1339 } else { 1340 // Construct string as an llvm constant. 1341 Constant *ConstStr = ConstantArray::get(String); 1342 // Otherwise create and return a new string global. 1343 GlobalVariable *StrGV = new GlobalVariable(ConstStr->getType(), true, 1344 GlobalVariable::InternalLinkage, 1345 ConstStr, ".str", M); 1346 StrGV->setSection("llvm.metadata"); 1347 // Convert to generic string pointer. 1348 Slot = ConstantExpr::getBitCast(StrGV, getStrPtrType()); 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