MCAssembler.cpp revision 5d428511ca9607d52a09d3483d0738f483e09934
1//===- lib/MC/MCAssembler.cpp - Assembler Backend Implementation ----------===// 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#define DEBUG_TYPE "assembler" 11#include "llvm/MC/MCAssembler.h" 12#include "llvm/MC/MCAsmLayout.h" 13#include "llvm/MC/MCCodeEmitter.h" 14#include "llvm/MC/MCExpr.h" 15#include "llvm/MC/MCObjectWriter.h" 16#include "llvm/MC/MCSymbol.h" 17#include "llvm/MC/MCValue.h" 18#include "llvm/ADT/OwningPtr.h" 19#include "llvm/ADT/Statistic.h" 20#include "llvm/ADT/StringExtras.h" 21#include "llvm/ADT/Twine.h" 22#include "llvm/Support/ErrorHandling.h" 23#include "llvm/Support/raw_ostream.h" 24#include "llvm/Support/Debug.h" 25#include "llvm/Target/TargetRegistry.h" 26#include "llvm/Target/TargetAsmBackend.h" 27 28#include <vector> 29using namespace llvm; 30 31namespace { 32namespace stats { 33STATISTIC(RelaxedInstructions, "Number of relaxed instructions"); 34STATISTIC(RelaxationSteps, "Number of assembler layout and relaxation steps"); 35STATISTIC(EmittedFragments, "Number of emitted assembler fragments"); 36STATISTIC(EvaluateFixup, "Number of evaluated fixups"); 37STATISTIC(ObjectBytes, "Number of emitted object file bytes"); 38} 39} 40 41// FIXME FIXME FIXME: There are number of places in this file where we convert 42// what is a 64-bit assembler value used for computation into a value in the 43// object file, which may truncate it. We should detect that truncation where 44// invalid and report errors back. 45 46/* *** */ 47 48uint64_t MCAsmLayout::getFragmentAddress(const MCFragment *F) const { 49 assert(F->getParent() && "Missing section()!"); 50 return getSectionAddress(F->getParent()) + getFragmentOffset(F); 51} 52 53uint64_t MCAsmLayout::getFragmentEffectiveSize(const MCFragment *F) const { 54 assert(F->EffectiveSize != ~UINT64_C(0) && "Address not set!"); 55 return F->EffectiveSize; 56} 57 58void MCAsmLayout::setFragmentEffectiveSize(MCFragment *F, uint64_t Value) { 59 F->EffectiveSize = Value; 60} 61 62uint64_t MCAsmLayout::getFragmentOffset(const MCFragment *F) const { 63 assert(F->Offset != ~UINT64_C(0) && "Address not set!"); 64 return F->Offset; 65} 66 67void MCAsmLayout::setFragmentOffset(MCFragment *F, uint64_t Value) { 68 F->Offset = Value; 69} 70 71uint64_t MCAsmLayout::getSymbolAddress(const MCSymbolData *SD) const { 72 assert(SD->getFragment() && "Invalid getAddress() on undefined symbol!"); 73 return getFragmentAddress(SD->getFragment()) + SD->getOffset(); 74} 75 76uint64_t MCAsmLayout::getSectionAddress(const MCSectionData *SD) const { 77 assert(SD->Address != ~UINT64_C(0) && "Address not set!"); 78 return SD->Address; 79} 80 81void MCAsmLayout::setSectionAddress(MCSectionData *SD, uint64_t Value) { 82 SD->Address = Value; 83} 84 85uint64_t MCAsmLayout::getSectionSize(const MCSectionData *SD) const { 86 assert(SD->Size != ~UINT64_C(0) && "File size not set!"); 87 return SD->Size; 88} 89void MCAsmLayout::setSectionSize(MCSectionData *SD, uint64_t Value) { 90 SD->Size = Value; 91} 92 93uint64_t MCAsmLayout::getSectionFileSize(const MCSectionData *SD) const { 94 assert(SD->FileSize != ~UINT64_C(0) && "File size not set!"); 95 return SD->FileSize; 96} 97void MCAsmLayout::setSectionFileSize(MCSectionData *SD, uint64_t Value) { 98 SD->FileSize = Value; 99} 100 101 /// @} 102 103/* *** */ 104 105MCFragment::MCFragment() : Kind(FragmentType(~0)) { 106} 107 108MCFragment::MCFragment(FragmentType _Kind, MCSectionData *_Parent) 109 : Kind(_Kind), 110 Parent(_Parent), 111 EffectiveSize(~UINT64_C(0)) 112{ 113 if (Parent) 114 Parent->getFragmentList().push_back(this); 115} 116 117MCFragment::~MCFragment() { 118} 119 120/* *** */ 121 122MCSectionData::MCSectionData() : Section(0) {} 123 124MCSectionData::MCSectionData(const MCSection &_Section, MCAssembler *A) 125 : Section(&_Section), 126 Alignment(1), 127 Address(~UINT64_C(0)), 128 Size(~UINT64_C(0)), 129 FileSize(~UINT64_C(0)), 130 HasInstructions(false) 131{ 132 if (A) 133 A->getSectionList().push_back(this); 134} 135 136/* *** */ 137 138MCSymbolData::MCSymbolData() : Symbol(0) {} 139 140MCSymbolData::MCSymbolData(const MCSymbol &_Symbol, MCFragment *_Fragment, 141 uint64_t _Offset, MCAssembler *A) 142 : Symbol(&_Symbol), Fragment(_Fragment), Offset(_Offset), 143 IsExternal(false), IsPrivateExtern(false), 144 CommonSize(0), CommonAlign(0), Flags(0), Index(0) 145{ 146 if (A) 147 A->getSymbolList().push_back(this); 148} 149 150/* *** */ 151 152MCAssembler::MCAssembler(MCContext &_Context, TargetAsmBackend &_Backend, 153 MCCodeEmitter &_Emitter, raw_ostream &_OS) 154 : Context(_Context), Backend(_Backend), Emitter(_Emitter), 155 OS(_OS), SubsectionsViaSymbols(false) 156{ 157} 158 159MCAssembler::~MCAssembler() { 160} 161 162static bool isScatteredFixupFullyResolvedSimple(const MCAssembler &Asm, 163 const MCAsmFixup &Fixup, 164 const MCValue Target, 165 const MCSection *BaseSection) { 166 // The effective fixup address is 167 // addr(atom(A)) + offset(A) 168 // - addr(atom(B)) - offset(B) 169 // - addr(<base symbol>) + <fixup offset from base symbol> 170 // and the offsets are not relocatable, so the fixup is fully resolved when 171 // addr(atom(A)) - addr(atom(B)) - addr(<base symbol>)) == 0. 172 // 173 // The simple (Darwin, except on x86_64) way of dealing with this was to 174 // assume that any reference to a temporary symbol *must* be a temporary 175 // symbol in the same atom, unless the sections differ. Therefore, any PCrel 176 // relocation to a temporary symbol (in the same section) is fully 177 // resolved. This also works in conjunction with absolutized .set, which 178 // requires the compiler to use .set to absolutize the differences between 179 // symbols which the compiler knows to be assembly time constants, so we don't 180 // need to worry about consider symbol differences fully resolved. 181 182 // Non-relative fixups are only resolved if constant. 183 if (!BaseSection) 184 return Target.isAbsolute(); 185 186 // Otherwise, relative fixups are only resolved if not a difference and the 187 // target is a temporary in the same section. 188 if (Target.isAbsolute() || Target.getSymB()) 189 return false; 190 191 const MCSymbol *A = &Target.getSymA()->getSymbol(); 192 if (!A->isTemporary() || !A->isInSection() || 193 &A->getSection() != BaseSection) 194 return false; 195 196 return true; 197} 198 199static bool isScatteredFixupFullyResolved(const MCAssembler &Asm, 200 const MCAsmLayout &Layout, 201 const MCAsmFixup &Fixup, 202 const MCValue Target, 203 const MCSymbolData *BaseSymbol) { 204 // The effective fixup address is 205 // addr(atom(A)) + offset(A) 206 // - addr(atom(B)) - offset(B) 207 // - addr(BaseSymbol) + <fixup offset from base symbol> 208 // and the offsets are not relocatable, so the fixup is fully resolved when 209 // addr(atom(A)) - addr(atom(B)) - addr(BaseSymbol) == 0. 210 // 211 // Note that "false" is almost always conservatively correct (it means we emit 212 // a relocation which is unnecessary), except when it would force us to emit a 213 // relocation which the target cannot encode. 214 215 const MCSymbolData *A_Base = 0, *B_Base = 0; 216 if (const MCSymbolRefExpr *A = Target.getSymA()) { 217 // Modified symbol references cannot be resolved. 218 if (A->getKind() != MCSymbolRefExpr::VK_None) 219 return false; 220 221 A_Base = Asm.getAtom(Layout, &Asm.getSymbolData(A->getSymbol())); 222 if (!A_Base) 223 return false; 224 } 225 226 if (const MCSymbolRefExpr *B = Target.getSymB()) { 227 // Modified symbol references cannot be resolved. 228 if (B->getKind() != MCSymbolRefExpr::VK_None) 229 return false; 230 231 B_Base = Asm.getAtom(Layout, &Asm.getSymbolData(B->getSymbol())); 232 if (!B_Base) 233 return false; 234 } 235 236 // If there is no base, A and B have to be the same atom for this fixup to be 237 // fully resolved. 238 if (!BaseSymbol) 239 return A_Base == B_Base; 240 241 // Otherwise, B must be missing and A must be the base. 242 return !B_Base && BaseSymbol == A_Base; 243} 244 245bool MCAssembler::isSymbolLinkerVisible(const MCSymbolData *SD) const { 246 // Non-temporary labels should always be visible to the linker. 247 if (!SD->getSymbol().isTemporary()) 248 return true; 249 250 // Absolute temporary labels are never visible. 251 if (!SD->getFragment()) 252 return false; 253 254 // Otherwise, check if the section requires symbols even for temporary labels. 255 return getBackend().doesSectionRequireSymbols( 256 SD->getFragment()->getParent()->getSection()); 257} 258 259// FIXME-PERF: This routine is really slow. 260const MCSymbolData *MCAssembler::getAtomForAddress(const MCAsmLayout &Layout, 261 const MCSectionData *Section, 262 uint64_t Address) const { 263 const MCSymbolData *Best = 0; 264 uint64_t BestAddress = 0; 265 266 for (MCAssembler::const_symbol_iterator it = symbol_begin(), 267 ie = symbol_end(); it != ie; ++it) { 268 // Ignore non-linker visible symbols. 269 if (!isSymbolLinkerVisible(it)) 270 continue; 271 272 // Ignore symbols not in the same section. 273 if (!it->getFragment() || it->getFragment()->getParent() != Section) 274 continue; 275 276 // Otherwise, find the closest symbol preceding this address (ties are 277 // resolved in favor of the last defined symbol). 278 uint64_t SymbolAddress = Layout.getSymbolAddress(it); 279 if (SymbolAddress <= Address && (!Best || SymbolAddress >= BestAddress)) { 280 Best = it; 281 BestAddress = SymbolAddress; 282 } 283 } 284 285 return Best; 286} 287 288// FIXME-PERF: This routine is really slow. 289const MCSymbolData *MCAssembler::getAtom(const MCAsmLayout &Layout, 290 const MCSymbolData *SD) const { 291 // Linker visible symbols define atoms. 292 if (isSymbolLinkerVisible(SD)) 293 return SD; 294 295 // Absolute and undefined symbols have no defining atom. 296 if (!SD->getFragment()) 297 return 0; 298 299 // Otherwise, search by address. 300 return getAtomForAddress(Layout, SD->getFragment()->getParent(), 301 Layout.getSymbolAddress(SD)); 302} 303 304bool MCAssembler::EvaluateFixup(const MCAsmLayout &Layout, 305 const MCAsmFixup &Fixup, const MCFragment *DF, 306 MCValue &Target, uint64_t &Value) const { 307 ++stats::EvaluateFixup; 308 309 if (!Fixup.Value->EvaluateAsRelocatable(Target, &Layout)) 310 llvm_report_error("expected relocatable expression"); 311 312 // FIXME: How do non-scattered symbols work in ELF? I presume the linker 313 // doesn't support small relocations, but then under what criteria does the 314 // assembler allow symbol differences? 315 316 Value = Target.getConstant(); 317 318 bool IsPCRel = 319 Emitter.getFixupKindInfo(Fixup.Kind).Flags & MCFixupKindInfo::FKF_IsPCRel; 320 bool IsResolved = true; 321 if (const MCSymbolRefExpr *A = Target.getSymA()) { 322 if (A->getSymbol().isDefined()) 323 Value += Layout.getSymbolAddress(&getSymbolData(A->getSymbol())); 324 else 325 IsResolved = false; 326 } 327 if (const MCSymbolRefExpr *B = Target.getSymB()) { 328 if (B->getSymbol().isDefined()) 329 Value -= Layout.getSymbolAddress(&getSymbolData(B->getSymbol())); 330 else 331 IsResolved = false; 332 } 333 334 // If we are using scattered symbols, determine whether this value is actually 335 // resolved; scattering may cause atoms to move. 336 if (IsResolved && getBackend().hasScatteredSymbols()) { 337 if (getBackend().hasReliableSymbolDifference()) { 338 // If this is a PCrel relocation, find the base atom (identified by its 339 // symbol) that the fixup value is relative to. 340 const MCSymbolData *BaseSymbol = 0; 341 if (IsPCRel) { 342 BaseSymbol = getAtomForAddress( 343 Layout, DF->getParent(), Layout.getFragmentAddress(DF)+Fixup.Offset); 344 if (!BaseSymbol) 345 IsResolved = false; 346 } 347 348 if (IsResolved) 349 IsResolved = isScatteredFixupFullyResolved(*this, Layout, Fixup, Target, 350 BaseSymbol); 351 } else { 352 const MCSection *BaseSection = 0; 353 if (IsPCRel) 354 BaseSection = &DF->getParent()->getSection(); 355 356 IsResolved = isScatteredFixupFullyResolvedSimple(*this, Fixup, Target, 357 BaseSection); 358 } 359 } 360 361 if (IsPCRel) 362 Value -= Layout.getFragmentAddress(DF) + Fixup.Offset; 363 364 return IsResolved; 365} 366 367void MCAssembler::LayoutSection(MCSectionData &SD, 368 MCAsmLayout &Layout) { 369 uint64_t Address, StartAddress = Address = Layout.getSectionAddress(&SD); 370 371 for (MCSectionData::iterator it = SD.begin(), ie = SD.end(); it != ie; ++it) { 372 MCFragment &F = *it; 373 374 uint64_t FragmentOffset = Address - StartAddress; 375 Layout.setFragmentOffset(&F, FragmentOffset); 376 377 // Evaluate fragment size. 378 uint64_t EffectiveSize = 0; 379 switch (F.getKind()) { 380 case MCFragment::FT_Align: { 381 MCAlignFragment &AF = cast<MCAlignFragment>(F); 382 383 EffectiveSize = OffsetToAlignment(Address, AF.getAlignment()); 384 if (EffectiveSize > AF.getMaxBytesToEmit()) 385 EffectiveSize = 0; 386 break; 387 } 388 389 case MCFragment::FT_Data: 390 EffectiveSize = cast<MCDataFragment>(F).getContents().size(); 391 break; 392 393 case MCFragment::FT_Fill: { 394 MCFillFragment &FF = cast<MCFillFragment>(F); 395 EffectiveSize = FF.getValueSize() * FF.getCount(); 396 break; 397 } 398 399 case MCFragment::FT_Inst: 400 EffectiveSize = cast<MCInstFragment>(F).getInstSize(); 401 break; 402 403 case MCFragment::FT_Org: { 404 MCOrgFragment &OF = cast<MCOrgFragment>(F); 405 406 int64_t TargetLocation; 407 if (!OF.getOffset().EvaluateAsAbsolute(TargetLocation, &Layout)) 408 llvm_report_error("expected assembly-time absolute expression"); 409 410 // FIXME: We need a way to communicate this error. 411 int64_t Offset = TargetLocation - FragmentOffset; 412 if (Offset < 0) 413 llvm_report_error("invalid .org offset '" + Twine(TargetLocation) + 414 "' (at offset '" + Twine(FragmentOffset) + "'"); 415 416 EffectiveSize = Offset; 417 break; 418 } 419 420 case MCFragment::FT_ZeroFill: { 421 MCZeroFillFragment &ZFF = cast<MCZeroFillFragment>(F); 422 423 // Align the fragment offset; it is safe to adjust the offset freely since 424 // this is only in virtual sections. 425 // 426 // FIXME: We shouldn't be doing this here. 427 Address = RoundUpToAlignment(Address, ZFF.getAlignment()); 428 Layout.setFragmentOffset(&F, Address - StartAddress); 429 430 EffectiveSize = ZFF.getSize(); 431 break; 432 } 433 } 434 435 Layout.setFragmentEffectiveSize(&F, EffectiveSize); 436 Address += EffectiveSize; 437 } 438 439 // Set the section sizes. 440 Layout.setSectionSize(&SD, Address - StartAddress); 441 if (getBackend().isVirtualSection(SD.getSection())) 442 Layout.setSectionFileSize(&SD, 0); 443 else 444 Layout.setSectionFileSize(&SD, Address - StartAddress); 445} 446 447/// WriteFragmentData - Write the \arg F data to the output file. 448static void WriteFragmentData(const MCAssembler &Asm, const MCAsmLayout &Layout, 449 const MCFragment &F, MCObjectWriter *OW) { 450 uint64_t Start = OW->getStream().tell(); 451 (void) Start; 452 453 ++stats::EmittedFragments; 454 455 // FIXME: Embed in fragments instead? 456 uint64_t FragmentSize = Layout.getFragmentEffectiveSize(&F); 457 switch (F.getKind()) { 458 case MCFragment::FT_Align: { 459 MCAlignFragment &AF = cast<MCAlignFragment>(F); 460 uint64_t Count = FragmentSize / AF.getValueSize(); 461 462 // FIXME: This error shouldn't actually occur (the front end should emit 463 // multiple .align directives to enforce the semantics it wants), but is 464 // severe enough that we want to report it. How to handle this? 465 if (Count * AF.getValueSize() != FragmentSize) 466 llvm_report_error("undefined .align directive, value size '" + 467 Twine(AF.getValueSize()) + 468 "' is not a divisor of padding size '" + 469 Twine(FragmentSize) + "'"); 470 471 // See if we are aligning with nops, and if so do that first to try to fill 472 // the Count bytes. Then if that did not fill any bytes or there are any 473 // bytes left to fill use the the Value and ValueSize to fill the rest. 474 // If we are aligning with nops, ask that target to emit the right data. 475 if (AF.getEmitNops()) { 476 if (!Asm.getBackend().WriteNopData(Count, OW)) 477 llvm_report_error("unable to write nop sequence of " + 478 Twine(Count) + " bytes"); 479 break; 480 } 481 482 // Otherwise, write out in multiples of the value size. 483 for (uint64_t i = 0; i != Count; ++i) { 484 switch (AF.getValueSize()) { 485 default: 486 assert(0 && "Invalid size!"); 487 case 1: OW->Write8 (uint8_t (AF.getValue())); break; 488 case 2: OW->Write16(uint16_t(AF.getValue())); break; 489 case 4: OW->Write32(uint32_t(AF.getValue())); break; 490 case 8: OW->Write64(uint64_t(AF.getValue())); break; 491 } 492 } 493 break; 494 } 495 496 case MCFragment::FT_Data: { 497 MCDataFragment &DF = cast<MCDataFragment>(F); 498 assert(FragmentSize == DF.getContents().size() && "Invalid size!"); 499 OW->WriteBytes(DF.getContents().str()); 500 break; 501 } 502 503 case MCFragment::FT_Fill: { 504 MCFillFragment &FF = cast<MCFillFragment>(F); 505 for (uint64_t i = 0, e = FF.getCount(); i != e; ++i) { 506 switch (FF.getValueSize()) { 507 default: 508 assert(0 && "Invalid size!"); 509 case 1: OW->Write8 (uint8_t (FF.getValue())); break; 510 case 2: OW->Write16(uint16_t(FF.getValue())); break; 511 case 4: OW->Write32(uint32_t(FF.getValue())); break; 512 case 8: OW->Write64(uint64_t(FF.getValue())); break; 513 } 514 } 515 break; 516 } 517 518 case MCFragment::FT_Inst: 519 llvm_unreachable("unexpected inst fragment after lowering"); 520 break; 521 522 case MCFragment::FT_Org: { 523 MCOrgFragment &OF = cast<MCOrgFragment>(F); 524 525 for (uint64_t i = 0, e = FragmentSize; i != e; ++i) 526 OW->Write8(uint8_t(OF.getValue())); 527 528 break; 529 } 530 531 case MCFragment::FT_ZeroFill: { 532 assert(0 && "Invalid zero fill fragment in concrete section!"); 533 break; 534 } 535 } 536 537 assert(OW->getStream().tell() - Start == FragmentSize); 538} 539 540void MCAssembler::WriteSectionData(const MCSectionData *SD, 541 const MCAsmLayout &Layout, 542 MCObjectWriter *OW) const { 543 uint64_t SectionSize = Layout.getSectionSize(SD); 544 uint64_t SectionFileSize = Layout.getSectionFileSize(SD); 545 546 // Ignore virtual sections. 547 if (getBackend().isVirtualSection(SD->getSection())) { 548 assert(SectionFileSize == 0 && "Invalid size for section!"); 549 return; 550 } 551 552 uint64_t Start = OW->getStream().tell(); 553 (void) Start; 554 555 for (MCSectionData::const_iterator it = SD->begin(), 556 ie = SD->end(); it != ie; ++it) 557 WriteFragmentData(*this, Layout, *it, OW); 558 559 // Add section padding. 560 assert(SectionFileSize >= SectionSize && "Invalid section sizes!"); 561 OW->WriteZeros(SectionFileSize - SectionSize); 562 563 assert(OW->getStream().tell() - Start == SectionFileSize); 564} 565 566void MCAssembler::Finish() { 567 DEBUG_WITH_TYPE("mc-dump", { 568 llvm::errs() << "assembler backend - pre-layout\n--\n"; 569 dump(); }); 570 571 // Layout until everything fits. 572 MCAsmLayout Layout(*this); 573 while (LayoutOnce(Layout)) 574 continue; 575 576 DEBUG_WITH_TYPE("mc-dump", { 577 llvm::errs() << "assembler backend - post-relaxation\n--\n"; 578 dump(); }); 579 580 // Finalize the layout, including fragment lowering. 581 FinishLayout(Layout); 582 583 DEBUG_WITH_TYPE("mc-dump", { 584 llvm::errs() << "assembler backend - final-layout\n--\n"; 585 dump(); }); 586 587 uint64_t StartOffset = OS.tell(); 588 llvm::OwningPtr<MCObjectWriter> Writer(getBackend().createObjectWriter(OS)); 589 if (!Writer) 590 llvm_report_error("unable to create object writer!"); 591 592 // Allow the object writer a chance to perform post-layout binding (for 593 // example, to set the index fields in the symbol data). 594 Writer->ExecutePostLayoutBinding(*this); 595 596 // Evaluate and apply the fixups, generating relocation entries as necessary. 597 for (MCAssembler::iterator it = begin(), ie = end(); it != ie; ++it) { 598 for (MCSectionData::iterator it2 = it->begin(), 599 ie2 = it->end(); it2 != ie2; ++it2) { 600 MCDataFragment *DF = dyn_cast<MCDataFragment>(it2); 601 if (!DF) 602 continue; 603 604 for (MCDataFragment::fixup_iterator it3 = DF->fixup_begin(), 605 ie3 = DF->fixup_end(); it3 != ie3; ++it3) { 606 MCAsmFixup &Fixup = *it3; 607 608 // Evaluate the fixup. 609 MCValue Target; 610 uint64_t FixedValue; 611 if (!EvaluateFixup(Layout, Fixup, DF, Target, FixedValue)) { 612 // The fixup was unresolved, we need a relocation. Inform the object 613 // writer of the relocation, and give it an opportunity to adjust the 614 // fixup value if need be. 615 Writer->RecordRelocation(*this, Layout, DF, Fixup, Target,FixedValue); 616 } 617 618 getBackend().ApplyFixup(Fixup, *DF, FixedValue); 619 } 620 } 621 } 622 623 // Write the object file. 624 Writer->WriteObject(*this, Layout); 625 OS.flush(); 626 627 stats::ObjectBytes += OS.tell() - StartOffset; 628} 629 630bool MCAssembler::FixupNeedsRelaxation(const MCAsmFixup &Fixup, 631 const MCFragment *DF, 632 const MCAsmLayout &Layout) const { 633 // If we cannot resolve the fixup value, it requires relaxation. 634 MCValue Target; 635 uint64_t Value; 636 if (!EvaluateFixup(Layout, Fixup, DF, Target, Value)) 637 return true; 638 639 // Otherwise, relax if the value is too big for a (signed) i8. 640 return int64_t(Value) != int64_t(int8_t(Value)); 641} 642 643bool MCAssembler::FragmentNeedsRelaxation(const MCInstFragment *IF, 644 const MCAsmLayout &Layout) const { 645 // If this inst doesn't ever need relaxation, ignore it. This occurs when we 646 // are intentionally pushing out inst fragments, or because we relaxed a 647 // previous instruction to one that doesn't need relaxation. 648 if (!getBackend().MayNeedRelaxation(IF->getInst(), IF->getFixups())) 649 return false; 650 651 for (MCInstFragment::const_fixup_iterator it = IF->fixup_begin(), 652 ie = IF->fixup_end(); it != ie; ++it) 653 if (FixupNeedsRelaxation(*it, IF, Layout)) 654 return true; 655 656 return false; 657} 658 659bool MCAssembler::LayoutOnce(MCAsmLayout &Layout) { 660 ++stats::RelaxationSteps; 661 662 // Layout the concrete sections and fragments. 663 uint64_t Address = 0; 664 MCSectionData *Prev = 0; 665 for (iterator it = begin(), ie = end(); it != ie; ++it) { 666 MCSectionData &SD = *it; 667 668 // Skip virtual sections. 669 if (getBackend().isVirtualSection(SD.getSection())) 670 continue; 671 672 // Align this section if necessary by adding padding bytes to the previous 673 // section. 674 if (uint64_t Pad = OffsetToAlignment(Address, it->getAlignment())) { 675 assert(Prev && "Missing prev section!"); 676 Layout.setSectionFileSize(Prev, Layout.getSectionFileSize(Prev) + Pad); 677 Address += Pad; 678 } 679 680 // Layout the section fragments and its size. 681 Layout.setSectionAddress(&SD, Address); 682 LayoutSection(SD, Layout); 683 Address += Layout.getSectionFileSize(&SD); 684 685 Prev = &SD; 686 } 687 688 // Layout the virtual sections. 689 for (iterator it = begin(), ie = end(); it != ie; ++it) { 690 MCSectionData &SD = *it; 691 692 if (!getBackend().isVirtualSection(SD.getSection())) 693 continue; 694 695 // Align this section if necessary by adding padding bytes to the previous 696 // section. 697 if (uint64_t Pad = OffsetToAlignment(Address, it->getAlignment())) 698 Address += Pad; 699 700 Layout.setSectionAddress(&SD, Address); 701 LayoutSection(SD, Layout); 702 Address += Layout.getSectionSize(&SD); 703 } 704 705 // Scan for fragments that need relaxation. 706 for (iterator it = begin(), ie = end(); it != ie; ++it) { 707 MCSectionData &SD = *it; 708 709 for (MCSectionData::iterator it2 = SD.begin(), 710 ie2 = SD.end(); it2 != ie2; ++it2) { 711 // Check if this is an instruction fragment that needs relaxation. 712 MCInstFragment *IF = dyn_cast<MCInstFragment>(it2); 713 if (!IF || !FragmentNeedsRelaxation(IF, Layout)) 714 continue; 715 716 ++stats::RelaxedInstructions; 717 718 // FIXME-PERF: We could immediately lower out instructions if we can tell 719 // they are fully resolved, to avoid retesting on later passes. 720 721 // Relax the fragment. 722 723 MCInst Relaxed; 724 getBackend().RelaxInstruction(IF, Relaxed); 725 726 // Encode the new instruction. 727 // 728 // FIXME-PERF: If it matters, we could let the target do this. It can 729 // probably do so more efficiently in many cases. 730 SmallVector<MCFixup, 4> Fixups; 731 SmallString<256> Code; 732 raw_svector_ostream VecOS(Code); 733 getEmitter().EncodeInstruction(Relaxed, VecOS, Fixups); 734 VecOS.flush(); 735 736 // Update the instruction fragment. 737 IF->setInst(Relaxed); 738 IF->getCode() = Code; 739 IF->getFixups().clear(); 740 for (unsigned i = 0, e = Fixups.size(); i != e; ++i) { 741 MCFixup &F = Fixups[i]; 742 IF->getFixups().push_back(MCAsmFixup(F.getOffset(), *F.getValue(), 743 F.getKind())); 744 } 745 746 // Restart layout. 747 // 748 // FIXME-PERF: This is O(N^2), but will be eliminated once we have a 749 // smart MCAsmLayout object. 750 return true; 751 } 752 } 753 754 return false; 755} 756 757void MCAssembler::FinishLayout(MCAsmLayout &Layout) { 758 // Lower out any instruction fragments, to simplify the fixup application and 759 // output. 760 // 761 // FIXME-PERF: We don't have to do this, but the assumption is that it is 762 // cheap (we will mostly end up eliminating fragments and appending on to data 763 // fragments), so the extra complexity downstream isn't worth it. Evaluate 764 // this assumption. 765 for (iterator it = begin(), ie = end(); it != ie; ++it) { 766 MCSectionData &SD = *it; 767 768 for (MCSectionData::iterator it2 = SD.begin(), 769 ie2 = SD.end(); it2 != ie2; ++it2) { 770 MCInstFragment *IF = dyn_cast<MCInstFragment>(it2); 771 if (!IF) 772 continue; 773 774 // Create a new data fragment for the instruction. 775 // 776 // FIXME-PERF: Reuse previous data fragment if possible. 777 MCDataFragment *DF = new MCDataFragment(); 778 SD.getFragmentList().insert(it2, DF); 779 780 // Update the data fragments layout data. 781 // 782 // FIXME: Add MCAsmLayout utility for this. 783 DF->setParent(IF->getParent()); 784 Layout.setFragmentOffset(DF, Layout.getFragmentOffset(IF)); 785 Layout.setFragmentEffectiveSize(DF, Layout.getFragmentEffectiveSize(IF)); 786 787 // Copy in the data and the fixups. 788 DF->getContents().append(IF->getCode().begin(), IF->getCode().end()); 789 for (unsigned i = 0, e = IF->getFixups().size(); i != e; ++i) 790 DF->getFixups().push_back(IF->getFixups()[i]); 791 792 // Delete the instruction fragment and update the iterator. 793 SD.getFragmentList().erase(IF); 794 it2 = DF; 795 } 796 } 797} 798 799// Debugging methods 800 801namespace llvm { 802 803raw_ostream &operator<<(raw_ostream &OS, const MCAsmFixup &AF) { 804 OS << "<MCAsmFixup" << " Offset:" << AF.Offset << " Value:" << *AF.Value 805 << " Kind:" << AF.Kind << ">"; 806 return OS; 807} 808 809} 810 811void MCFragment::dump() { 812 raw_ostream &OS = llvm::errs(); 813 814 OS << "<MCFragment " << (void*) this << " Offset:" << Offset 815 << " EffectiveSize:" << EffectiveSize; 816 817 OS << ">"; 818} 819 820void MCAlignFragment::dump() { 821 raw_ostream &OS = llvm::errs(); 822 823 OS << "<MCAlignFragment "; 824 this->MCFragment::dump(); 825 OS << "\n "; 826 OS << " Alignment:" << getAlignment() 827 << " Value:" << getValue() << " ValueSize:" << getValueSize() 828 << " MaxBytesToEmit:" << getMaxBytesToEmit() << ">"; 829} 830 831void MCDataFragment::dump() { 832 raw_ostream &OS = llvm::errs(); 833 834 OS << "<MCDataFragment "; 835 this->MCFragment::dump(); 836 OS << "\n "; 837 OS << " Contents:["; 838 for (unsigned i = 0, e = getContents().size(); i != e; ++i) { 839 if (i) OS << ","; 840 OS << hexdigit((Contents[i] >> 4) & 0xF) << hexdigit(Contents[i] & 0xF); 841 } 842 OS << "] (" << getContents().size() << " bytes)"; 843 844 if (!getFixups().empty()) { 845 OS << ",\n "; 846 OS << " Fixups:["; 847 for (fixup_iterator it = fixup_begin(), ie = fixup_end(); it != ie; ++it) { 848 if (it != fixup_begin()) OS << ",\n "; 849 OS << *it; 850 } 851 OS << "]"; 852 } 853 854 OS << ">"; 855} 856 857void MCFillFragment::dump() { 858 raw_ostream &OS = llvm::errs(); 859 860 OS << "<MCFillFragment "; 861 this->MCFragment::dump(); 862 OS << "\n "; 863 OS << " Value:" << getValue() << " ValueSize:" << getValueSize() 864 << " Count:" << getCount() << ">"; 865} 866 867void MCInstFragment::dump() { 868 raw_ostream &OS = llvm::errs(); 869 870 OS << "<MCInstFragment "; 871 this->MCFragment::dump(); 872 OS << "\n "; 873 OS << " Inst:"; 874 getInst().dump_pretty(OS); 875 OS << ">"; 876} 877 878void MCOrgFragment::dump() { 879 raw_ostream &OS = llvm::errs(); 880 881 OS << "<MCOrgFragment "; 882 this->MCFragment::dump(); 883 OS << "\n "; 884 OS << " Offset:" << getOffset() << " Value:" << getValue() << ">"; 885} 886 887void MCZeroFillFragment::dump() { 888 raw_ostream &OS = llvm::errs(); 889 890 OS << "<MCZeroFillFragment "; 891 this->MCFragment::dump(); 892 OS << "\n "; 893 OS << " Size:" << getSize() << " Alignment:" << getAlignment() << ">"; 894} 895 896void MCSectionData::dump() { 897 raw_ostream &OS = llvm::errs(); 898 899 OS << "<MCSectionData"; 900 OS << " Alignment:" << getAlignment() << " Address:" << Address 901 << " Size:" << Size << " FileSize:" << FileSize 902 << " Fragments:[\n "; 903 for (iterator it = begin(), ie = end(); it != ie; ++it) { 904 if (it != begin()) OS << ",\n "; 905 it->dump(); 906 } 907 OS << "]>"; 908} 909 910void MCSymbolData::dump() { 911 raw_ostream &OS = llvm::errs(); 912 913 OS << "<MCSymbolData Symbol:" << getSymbol() 914 << " Fragment:" << getFragment() << " Offset:" << getOffset() 915 << " Flags:" << getFlags() << " Index:" << getIndex(); 916 if (isCommon()) 917 OS << " (common, size:" << getCommonSize() 918 << " align: " << getCommonAlignment() << ")"; 919 if (isExternal()) 920 OS << " (external)"; 921 if (isPrivateExtern()) 922 OS << " (private extern)"; 923 OS << ">"; 924} 925 926void MCAssembler::dump() { 927 raw_ostream &OS = llvm::errs(); 928 929 OS << "<MCAssembler\n"; 930 OS << " Sections:[\n "; 931 for (iterator it = begin(), ie = end(); it != ie; ++it) { 932 if (it != begin()) OS << ",\n "; 933 it->dump(); 934 } 935 OS << "],\n"; 936 OS << " Symbols:["; 937 938 for (symbol_iterator it = symbol_begin(), ie = symbol_end(); it != ie; ++it) { 939 if (it != symbol_begin()) OS << ",\n "; 940 it->dump(); 941 } 942 OS << "]>\n"; 943} 944