1 //===- lib/MC/MCELFStreamer.cpp - ELF Object Output -----------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file assembles .s files and emits ELF .o object files. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "llvm/MC/MCELFStreamer.h" 14 #include "llvm/ADT/SmallString.h" 15 #include "llvm/ADT/SmallVector.h" 16 #include "llvm/BinaryFormat/ELF.h" 17 #include "llvm/MC/MCAsmBackend.h" 18 #include "llvm/MC/MCAsmInfo.h" 19 #include "llvm/MC/MCAssembler.h" 20 #include "llvm/MC/MCCodeEmitter.h" 21 #include "llvm/MC/MCContext.h" 22 #include "llvm/MC/MCExpr.h" 23 #include "llvm/MC/MCFixup.h" 24 #include "llvm/MC/MCFragment.h" 25 #include "llvm/MC/MCObjectFileInfo.h" 26 #include "llvm/MC/MCObjectWriter.h" 27 #include "llvm/MC/MCSection.h" 28 #include "llvm/MC/MCSectionELF.h" 29 #include "llvm/MC/MCStreamer.h" 30 #include "llvm/MC/MCSymbol.h" 31 #include "llvm/MC/MCSymbolELF.h" 32 #include "llvm/Support/Casting.h" 33 #include "llvm/Support/ErrorHandling.h" 34 #include "llvm/Support/TargetRegistry.h" 35 #include "llvm/Support/raw_ostream.h" 36 #include <cassert> 37 #include <cstdint> 38 39 using namespace llvm; 40 41 MCELFStreamer::MCELFStreamer(MCContext &Context, 42 std::unique_ptr<MCAsmBackend> TAB, 43 std::unique_ptr<MCObjectWriter> OW, 44 std::unique_ptr<MCCodeEmitter> Emitter) 45 : MCObjectStreamer(Context, std::move(TAB), std::move(OW), 46 std::move(Emitter)) {} 47 48 bool MCELFStreamer::isBundleLocked() const { 49 return getCurrentSectionOnly()->isBundleLocked(); 50 } 51 52 void MCELFStreamer::mergeFragment(MCDataFragment *DF, 53 MCDataFragment *EF) { 54 MCAssembler &Assembler = getAssembler(); 55 56 if (Assembler.isBundlingEnabled() && Assembler.getRelaxAll()) { 57 uint64_t FSize = EF->getContents().size(); 58 59 if (FSize > Assembler.getBundleAlignSize()) 60 report_fatal_error("Fragment can't be larger than a bundle size"); 61 62 uint64_t RequiredBundlePadding = computeBundlePadding( 63 Assembler, EF, DF->getContents().size(), FSize); 64 65 if (RequiredBundlePadding > UINT8_MAX) 66 report_fatal_error("Padding cannot exceed 255 bytes"); 67 68 if (RequiredBundlePadding > 0) { 69 SmallString<256> Code; 70 raw_svector_ostream VecOS(Code); 71 EF->setBundlePadding(static_cast<uint8_t>(RequiredBundlePadding)); 72 Assembler.writeFragmentPadding(VecOS, *EF, FSize); 73 74 DF->getContents().append(Code.begin(), Code.end()); 75 } 76 } 77 78 flushPendingLabels(DF, DF->getContents().size()); 79 80 for (unsigned i = 0, e = EF->getFixups().size(); i != e; ++i) { 81 EF->getFixups()[i].setOffset(EF->getFixups()[i].getOffset() + 82 DF->getContents().size()); 83 DF->getFixups().push_back(EF->getFixups()[i]); 84 } 85 if (DF->getSubtargetInfo() == nullptr && EF->getSubtargetInfo()) 86 DF->setHasInstructions(*EF->getSubtargetInfo()); 87 DF->getContents().append(EF->getContents().begin(), EF->getContents().end()); 88 } 89 90 void MCELFStreamer::InitSections(bool NoExecStack) { 91 MCContext &Ctx = getContext(); 92 SwitchSection(Ctx.getObjectFileInfo()->getTextSection()); 93 emitCodeAlignment(4); 94 95 if (NoExecStack) 96 SwitchSection(Ctx.getAsmInfo()->getNonexecutableStackSection(Ctx)); 97 } 98 99 void MCELFStreamer::emitLabel(MCSymbol *S, SMLoc Loc) { 100 auto *Symbol = cast<MCSymbolELF>(S); 101 MCObjectStreamer::emitLabel(Symbol, Loc); 102 103 const MCSectionELF &Section = 104 static_cast<const MCSectionELF &>(*getCurrentSectionOnly()); 105 if (Section.getFlags() & ELF::SHF_TLS) 106 Symbol->setType(ELF::STT_TLS); 107 } 108 109 void MCELFStreamer::emitLabelAtPos(MCSymbol *S, SMLoc Loc, MCFragment *F, 110 uint64_t Offset) { 111 auto *Symbol = cast<MCSymbolELF>(S); 112 MCObjectStreamer::emitLabelAtPos(Symbol, Loc, F, Offset); 113 114 const MCSectionELF &Section = 115 static_cast<const MCSectionELF &>(*getCurrentSectionOnly()); 116 if (Section.getFlags() & ELF::SHF_TLS) 117 Symbol->setType(ELF::STT_TLS); 118 } 119 120 void MCELFStreamer::emitAssemblerFlag(MCAssemblerFlag Flag) { 121 // Let the target do whatever target specific stuff it needs to do. 122 getAssembler().getBackend().handleAssemblerFlag(Flag); 123 // Do any generic stuff we need to do. 124 switch (Flag) { 125 case MCAF_SyntaxUnified: return; // no-op here. 126 case MCAF_Code16: return; // Change parsing mode; no-op here. 127 case MCAF_Code32: return; // Change parsing mode; no-op here. 128 case MCAF_Code64: return; // Change parsing mode; no-op here. 129 case MCAF_SubsectionsViaSymbols: 130 getAssembler().setSubsectionsViaSymbols(true); 131 return; 132 } 133 134 llvm_unreachable("invalid assembler flag!"); 135 } 136 137 // If bundle alignment is used and there are any instructions in the section, it 138 // needs to be aligned to at least the bundle size. 139 static void setSectionAlignmentForBundling(const MCAssembler &Assembler, 140 MCSection *Section) { 141 if (Section && Assembler.isBundlingEnabled() && Section->hasInstructions() && 142 Section->getAlignment() < Assembler.getBundleAlignSize()) 143 Section->setAlignment(Align(Assembler.getBundleAlignSize())); 144 } 145 146 void MCELFStreamer::changeSection(MCSection *Section, 147 const MCExpr *Subsection) { 148 MCSection *CurSection = getCurrentSectionOnly(); 149 if (CurSection && isBundleLocked()) 150 report_fatal_error("Unterminated .bundle_lock when changing a section"); 151 152 MCAssembler &Asm = getAssembler(); 153 // Ensure the previous section gets aligned if necessary. 154 setSectionAlignmentForBundling(Asm, CurSection); 155 auto *SectionELF = static_cast<const MCSectionELF *>(Section); 156 const MCSymbol *Grp = SectionELF->getGroup(); 157 if (Grp) 158 Asm.registerSymbol(*Grp); 159 160 changeSectionImpl(Section, Subsection); 161 Asm.registerSymbol(*Section->getBeginSymbol()); 162 } 163 164 void MCELFStreamer::emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) { 165 getAssembler().registerSymbol(*Symbol); 166 const MCExpr *Value = MCSymbolRefExpr::create( 167 Symbol, MCSymbolRefExpr::VK_WEAKREF, getContext()); 168 Alias->setVariableValue(Value); 169 } 170 171 // When GNU as encounters more than one .type declaration for an object it seems 172 // to use a mechanism similar to the one below to decide which type is actually 173 // used in the object file. The greater of T1 and T2 is selected based on the 174 // following ordering: 175 // STT_NOTYPE < STT_OBJECT < STT_FUNC < STT_GNU_IFUNC < STT_TLS < anything else 176 // If neither T1 < T2 nor T2 < T1 according to this ordering, use T2 (the user 177 // provided type). 178 static unsigned CombineSymbolTypes(unsigned T1, unsigned T2) { 179 for (unsigned Type : {ELF::STT_NOTYPE, ELF::STT_OBJECT, ELF::STT_FUNC, 180 ELF::STT_GNU_IFUNC, ELF::STT_TLS}) { 181 if (T1 == Type) 182 return T2; 183 if (T2 == Type) 184 return T1; 185 } 186 187 return T2; 188 } 189 190 bool MCELFStreamer::emitSymbolAttribute(MCSymbol *S, MCSymbolAttr Attribute) { 191 auto *Symbol = cast<MCSymbolELF>(S); 192 193 // Adding a symbol attribute always introduces the symbol, note that an 194 // important side effect of calling registerSymbol here is to register 195 // the symbol with the assembler. 196 getAssembler().registerSymbol(*Symbol); 197 198 // The implementation of symbol attributes is designed to match 'as', but it 199 // leaves much to desired. It doesn't really make sense to arbitrarily add and 200 // remove flags, but 'as' allows this (in particular, see .desc). 201 // 202 // In the future it might be worth trying to make these operations more well 203 // defined. 204 switch (Attribute) { 205 case MCSA_Cold: 206 case MCSA_Extern: 207 case MCSA_LazyReference: 208 case MCSA_Reference: 209 case MCSA_SymbolResolver: 210 case MCSA_PrivateExtern: 211 case MCSA_WeakDefinition: 212 case MCSA_WeakDefAutoPrivate: 213 case MCSA_Invalid: 214 case MCSA_IndirectSymbol: 215 return false; 216 217 case MCSA_NoDeadStrip: 218 // Ignore for now. 219 break; 220 221 case MCSA_ELF_TypeGnuUniqueObject: 222 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT)); 223 Symbol->setBinding(ELF::STB_GNU_UNIQUE); 224 Symbol->setExternal(true); 225 break; 226 227 case MCSA_Global: 228 Symbol->setBinding(ELF::STB_GLOBAL); 229 Symbol->setExternal(true); 230 break; 231 232 case MCSA_WeakReference: 233 case MCSA_Weak: 234 Symbol->setBinding(ELF::STB_WEAK); 235 Symbol->setExternal(true); 236 break; 237 238 case MCSA_Local: 239 Symbol->setBinding(ELF::STB_LOCAL); 240 Symbol->setExternal(false); 241 break; 242 243 case MCSA_ELF_TypeFunction: 244 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_FUNC)); 245 break; 246 247 case MCSA_ELF_TypeIndFunction: 248 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_GNU_IFUNC)); 249 break; 250 251 case MCSA_ELF_TypeObject: 252 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT)); 253 break; 254 255 case MCSA_ELF_TypeTLS: 256 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_TLS)); 257 break; 258 259 case MCSA_ELF_TypeCommon: 260 // TODO: Emit these as a common symbol. 261 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT)); 262 break; 263 264 case MCSA_ELF_TypeNoType: 265 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_NOTYPE)); 266 break; 267 268 case MCSA_Protected: 269 Symbol->setVisibility(ELF::STV_PROTECTED); 270 break; 271 272 case MCSA_Hidden: 273 Symbol->setVisibility(ELF::STV_HIDDEN); 274 break; 275 276 case MCSA_Internal: 277 Symbol->setVisibility(ELF::STV_INTERNAL); 278 break; 279 280 case MCSA_AltEntry: 281 llvm_unreachable("ELF doesn't support the .alt_entry attribute"); 282 283 case MCSA_LGlobal: 284 llvm_unreachable("ELF doesn't support the .lglobl attribute"); 285 } 286 287 return true; 288 } 289 290 void MCELFStreamer::emitCommonSymbol(MCSymbol *S, uint64_t Size, 291 unsigned ByteAlignment) { 292 auto *Symbol = cast<MCSymbolELF>(S); 293 getAssembler().registerSymbol(*Symbol); 294 295 if (!Symbol->isBindingSet()) { 296 Symbol->setBinding(ELF::STB_GLOBAL); 297 Symbol->setExternal(true); 298 } 299 300 Symbol->setType(ELF::STT_OBJECT); 301 302 if (Symbol->getBinding() == ELF::STB_LOCAL) { 303 MCSection &Section = *getAssembler().getContext().getELFSection( 304 ".bss", ELF::SHT_NOBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC); 305 MCSectionSubPair P = getCurrentSection(); 306 SwitchSection(&Section); 307 308 emitValueToAlignment(ByteAlignment, 0, 1, 0); 309 emitLabel(Symbol); 310 emitZeros(Size); 311 312 SwitchSection(P.first, P.second); 313 } else { 314 if(Symbol->declareCommon(Size, ByteAlignment)) 315 report_fatal_error("Symbol: " + Symbol->getName() + 316 " redeclared as different type"); 317 } 318 319 cast<MCSymbolELF>(Symbol) 320 ->setSize(MCConstantExpr::create(Size, getContext())); 321 } 322 323 void MCELFStreamer::emitELFSize(MCSymbol *Symbol, const MCExpr *Value) { 324 cast<MCSymbolELF>(Symbol)->setSize(Value); 325 } 326 327 void MCELFStreamer::emitELFSymverDirective(StringRef AliasName, 328 const MCSymbol *Aliasee) { 329 getAssembler().Symvers.push_back({AliasName, Aliasee}); 330 } 331 332 void MCELFStreamer::emitLocalCommonSymbol(MCSymbol *S, uint64_t Size, 333 unsigned ByteAlignment) { 334 auto *Symbol = cast<MCSymbolELF>(S); 335 // FIXME: Should this be caught and done earlier? 336 getAssembler().registerSymbol(*Symbol); 337 Symbol->setBinding(ELF::STB_LOCAL); 338 Symbol->setExternal(false); 339 emitCommonSymbol(Symbol, Size, ByteAlignment); 340 } 341 342 void MCELFStreamer::emitValueImpl(const MCExpr *Value, unsigned Size, 343 SMLoc Loc) { 344 if (isBundleLocked()) 345 report_fatal_error("Emitting values inside a locked bundle is forbidden"); 346 fixSymbolsInTLSFixups(Value); 347 MCObjectStreamer::emitValueImpl(Value, Size, Loc); 348 } 349 350 void MCELFStreamer::emitValueToAlignment(unsigned ByteAlignment, 351 int64_t Value, 352 unsigned ValueSize, 353 unsigned MaxBytesToEmit) { 354 if (isBundleLocked()) 355 report_fatal_error("Emitting values inside a locked bundle is forbidden"); 356 MCObjectStreamer::emitValueToAlignment(ByteAlignment, Value, 357 ValueSize, MaxBytesToEmit); 358 } 359 360 void MCELFStreamer::emitCGProfileEntry(const MCSymbolRefExpr *From, 361 const MCSymbolRefExpr *To, 362 uint64_t Count) { 363 getAssembler().CGProfile.push_back({From, To, Count}); 364 } 365 366 void MCELFStreamer::emitIdent(StringRef IdentString) { 367 MCSection *Comment = getAssembler().getContext().getELFSection( 368 ".comment", ELF::SHT_PROGBITS, ELF::SHF_MERGE | ELF::SHF_STRINGS, 1, ""); 369 PushSection(); 370 SwitchSection(Comment); 371 if (!SeenIdent) { 372 emitInt8(0); 373 SeenIdent = true; 374 } 375 emitBytes(IdentString); 376 emitInt8(0); 377 PopSection(); 378 } 379 380 void MCELFStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) { 381 switch (expr->getKind()) { 382 case MCExpr::Target: 383 cast<MCTargetExpr>(expr)->fixELFSymbolsInTLSFixups(getAssembler()); 384 break; 385 case MCExpr::Constant: 386 break; 387 388 case MCExpr::Binary: { 389 const MCBinaryExpr *be = cast<MCBinaryExpr>(expr); 390 fixSymbolsInTLSFixups(be->getLHS()); 391 fixSymbolsInTLSFixups(be->getRHS()); 392 break; 393 } 394 395 case MCExpr::SymbolRef: { 396 const MCSymbolRefExpr &symRef = *cast<MCSymbolRefExpr>(expr); 397 switch (symRef.getKind()) { 398 default: 399 return; 400 case MCSymbolRefExpr::VK_GOTTPOFF: 401 case MCSymbolRefExpr::VK_INDNTPOFF: 402 case MCSymbolRefExpr::VK_NTPOFF: 403 case MCSymbolRefExpr::VK_GOTNTPOFF: 404 case MCSymbolRefExpr::VK_TLSCALL: 405 case MCSymbolRefExpr::VK_TLSDESC: 406 case MCSymbolRefExpr::VK_TLSGD: 407 case MCSymbolRefExpr::VK_TLSLD: 408 case MCSymbolRefExpr::VK_TLSLDM: 409 case MCSymbolRefExpr::VK_TPOFF: 410 case MCSymbolRefExpr::VK_TPREL: 411 case MCSymbolRefExpr::VK_DTPOFF: 412 case MCSymbolRefExpr::VK_DTPREL: 413 case MCSymbolRefExpr::VK_PPC_DTPMOD: 414 case MCSymbolRefExpr::VK_PPC_TPREL_LO: 415 case MCSymbolRefExpr::VK_PPC_TPREL_HI: 416 case MCSymbolRefExpr::VK_PPC_TPREL_HA: 417 case MCSymbolRefExpr::VK_PPC_TPREL_HIGH: 418 case MCSymbolRefExpr::VK_PPC_TPREL_HIGHA: 419 case MCSymbolRefExpr::VK_PPC_TPREL_HIGHER: 420 case MCSymbolRefExpr::VK_PPC_TPREL_HIGHERA: 421 case MCSymbolRefExpr::VK_PPC_TPREL_HIGHEST: 422 case MCSymbolRefExpr::VK_PPC_TPREL_HIGHESTA: 423 case MCSymbolRefExpr::VK_PPC_DTPREL_LO: 424 case MCSymbolRefExpr::VK_PPC_DTPREL_HI: 425 case MCSymbolRefExpr::VK_PPC_DTPREL_HA: 426 case MCSymbolRefExpr::VK_PPC_DTPREL_HIGH: 427 case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHA: 428 case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHER: 429 case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHERA: 430 case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHEST: 431 case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHESTA: 432 case MCSymbolRefExpr::VK_PPC_GOT_TPREL: 433 case MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO: 434 case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HI: 435 case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HA: 436 case MCSymbolRefExpr::VK_PPC_GOT_DTPREL: 437 case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_LO: 438 case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HI: 439 case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HA: 440 case MCSymbolRefExpr::VK_PPC_TLS: 441 case MCSymbolRefExpr::VK_PPC_GOT_TLSGD: 442 case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO: 443 case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HI: 444 case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HA: 445 case MCSymbolRefExpr::VK_PPC_TLSGD: 446 case MCSymbolRefExpr::VK_PPC_GOT_TLSLD: 447 case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO: 448 case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HI: 449 case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HA: 450 case MCSymbolRefExpr::VK_PPC_TLSLD: 451 break; 452 } 453 getAssembler().registerSymbol(symRef.getSymbol()); 454 cast<MCSymbolELF>(symRef.getSymbol()).setType(ELF::STT_TLS); 455 break; 456 } 457 458 case MCExpr::Unary: 459 fixSymbolsInTLSFixups(cast<MCUnaryExpr>(expr)->getSubExpr()); 460 break; 461 } 462 } 463 464 void MCELFStreamer::finalizeCGProfileEntry(const MCSymbolRefExpr *&SRE) { 465 const MCSymbol *S = &SRE->getSymbol(); 466 if (S->isTemporary()) { 467 if (!S->isInSection()) { 468 getContext().reportError( 469 SRE->getLoc(), Twine("Reference to undefined temporary symbol ") + 470 "`" + S->getName() + "`"); 471 return; 472 } 473 S = S->getSection().getBeginSymbol(); 474 S->setUsedInReloc(); 475 SRE = 476 MCSymbolRefExpr::create(S, SRE->getKind(), getContext(), SRE->getLoc()); 477 return; 478 } 479 // Not a temporary, referece it as a weak undefined. 480 bool Created; 481 getAssembler().registerSymbol(*S, &Created); 482 if (Created) { 483 cast<MCSymbolELF>(S)->setBinding(ELF::STB_WEAK); 484 cast<MCSymbolELF>(S)->setExternal(true); 485 } 486 } 487 488 void MCELFStreamer::finalizeCGProfile() { 489 for (MCAssembler::CGProfileEntry &E : getAssembler().CGProfile) { 490 finalizeCGProfileEntry(E.From); 491 finalizeCGProfileEntry(E.To); 492 } 493 } 494 495 void MCELFStreamer::emitInstToFragment(const MCInst &Inst, 496 const MCSubtargetInfo &STI) { 497 this->MCObjectStreamer::emitInstToFragment(Inst, STI); 498 MCRelaxableFragment &F = *cast<MCRelaxableFragment>(getCurrentFragment()); 499 500 for (unsigned i = 0, e = F.getFixups().size(); i != e; ++i) 501 fixSymbolsInTLSFixups(F.getFixups()[i].getValue()); 502 } 503 504 // A fragment can only have one Subtarget, and when bundling is enabled we 505 // sometimes need to use the same fragment. We give an error if there 506 // are conflicting Subtargets. 507 static void CheckBundleSubtargets(const MCSubtargetInfo *OldSTI, 508 const MCSubtargetInfo *NewSTI) { 509 if (OldSTI && NewSTI && OldSTI != NewSTI) 510 report_fatal_error("A Bundle can only have one Subtarget."); 511 } 512 513 void MCELFStreamer::emitInstToData(const MCInst &Inst, 514 const MCSubtargetInfo &STI) { 515 MCAssembler &Assembler = getAssembler(); 516 SmallVector<MCFixup, 4> Fixups; 517 SmallString<256> Code; 518 raw_svector_ostream VecOS(Code); 519 Assembler.getEmitter().encodeInstruction(Inst, VecOS, Fixups, STI); 520 521 for (unsigned i = 0, e = Fixups.size(); i != e; ++i) 522 fixSymbolsInTLSFixups(Fixups[i].getValue()); 523 524 // There are several possibilities here: 525 // 526 // If bundling is disabled, append the encoded instruction to the current data 527 // fragment (or create a new such fragment if the current fragment is not a 528 // data fragment, or the Subtarget has changed). 529 // 530 // If bundling is enabled: 531 // - If we're not in a bundle-locked group, emit the instruction into a 532 // fragment of its own. If there are no fixups registered for the 533 // instruction, emit a MCCompactEncodedInstFragment. Otherwise, emit a 534 // MCDataFragment. 535 // - If we're in a bundle-locked group, append the instruction to the current 536 // data fragment because we want all the instructions in a group to get into 537 // the same fragment. Be careful not to do that for the first instruction in 538 // the group, though. 539 MCDataFragment *DF; 540 541 if (Assembler.isBundlingEnabled()) { 542 MCSection &Sec = *getCurrentSectionOnly(); 543 if (Assembler.getRelaxAll() && isBundleLocked()) { 544 // If the -mc-relax-all flag is used and we are bundle-locked, we re-use 545 // the current bundle group. 546 DF = BundleGroups.back(); 547 CheckBundleSubtargets(DF->getSubtargetInfo(), &STI); 548 } 549 else if (Assembler.getRelaxAll() && !isBundleLocked()) 550 // When not in a bundle-locked group and the -mc-relax-all flag is used, 551 // we create a new temporary fragment which will be later merged into 552 // the current fragment. 553 DF = new MCDataFragment(); 554 else if (isBundleLocked() && !Sec.isBundleGroupBeforeFirstInst()) { 555 // If we are bundle-locked, we re-use the current fragment. 556 // The bundle-locking directive ensures this is a new data fragment. 557 DF = cast<MCDataFragment>(getCurrentFragment()); 558 CheckBundleSubtargets(DF->getSubtargetInfo(), &STI); 559 } 560 else if (!isBundleLocked() && Fixups.size() == 0) { 561 // Optimize memory usage by emitting the instruction to a 562 // MCCompactEncodedInstFragment when not in a bundle-locked group and 563 // there are no fixups registered. 564 MCCompactEncodedInstFragment *CEIF = new MCCompactEncodedInstFragment(); 565 insert(CEIF); 566 CEIF->getContents().append(Code.begin(), Code.end()); 567 CEIF->setHasInstructions(STI); 568 return; 569 } else { 570 DF = new MCDataFragment(); 571 insert(DF); 572 } 573 if (Sec.getBundleLockState() == MCSection::BundleLockedAlignToEnd) { 574 // If this fragment is for a group marked "align_to_end", set a flag 575 // in the fragment. This can happen after the fragment has already been 576 // created if there are nested bundle_align groups and an inner one 577 // is the one marked align_to_end. 578 DF->setAlignToBundleEnd(true); 579 } 580 581 // We're now emitting an instruction in a bundle group, so this flag has 582 // to be turned off. 583 Sec.setBundleGroupBeforeFirstInst(false); 584 } else { 585 DF = getOrCreateDataFragment(&STI); 586 } 587 588 // Add the fixups and data. 589 for (unsigned i = 0, e = Fixups.size(); i != e; ++i) { 590 Fixups[i].setOffset(Fixups[i].getOffset() + DF->getContents().size()); 591 DF->getFixups().push_back(Fixups[i]); 592 } 593 DF->setHasInstructions(STI); 594 DF->getContents().append(Code.begin(), Code.end()); 595 596 if (Assembler.isBundlingEnabled() && Assembler.getRelaxAll()) { 597 if (!isBundleLocked()) { 598 mergeFragment(getOrCreateDataFragment(&STI), DF); 599 delete DF; 600 } 601 } 602 } 603 604 void MCELFStreamer::emitBundleAlignMode(unsigned AlignPow2) { 605 assert(AlignPow2 <= 30 && "Invalid bundle alignment"); 606 MCAssembler &Assembler = getAssembler(); 607 if (AlignPow2 > 0 && (Assembler.getBundleAlignSize() == 0 || 608 Assembler.getBundleAlignSize() == 1U << AlignPow2)) 609 Assembler.setBundleAlignSize(1U << AlignPow2); 610 else 611 report_fatal_error(".bundle_align_mode cannot be changed once set"); 612 } 613 614 void MCELFStreamer::emitBundleLock(bool AlignToEnd) { 615 MCSection &Sec = *getCurrentSectionOnly(); 616 617 // Sanity checks 618 // 619 if (!getAssembler().isBundlingEnabled()) 620 report_fatal_error(".bundle_lock forbidden when bundling is disabled"); 621 622 if (!isBundleLocked()) 623 Sec.setBundleGroupBeforeFirstInst(true); 624 625 if (getAssembler().getRelaxAll() && !isBundleLocked()) { 626 // TODO: drop the lock state and set directly in the fragment 627 MCDataFragment *DF = new MCDataFragment(); 628 BundleGroups.push_back(DF); 629 } 630 631 Sec.setBundleLockState(AlignToEnd ? MCSection::BundleLockedAlignToEnd 632 : MCSection::BundleLocked); 633 } 634 635 void MCELFStreamer::emitBundleUnlock() { 636 MCSection &Sec = *getCurrentSectionOnly(); 637 638 // Sanity checks 639 if (!getAssembler().isBundlingEnabled()) 640 report_fatal_error(".bundle_unlock forbidden when bundling is disabled"); 641 else if (!isBundleLocked()) 642 report_fatal_error(".bundle_unlock without matching lock"); 643 else if (Sec.isBundleGroupBeforeFirstInst()) 644 report_fatal_error("Empty bundle-locked group is forbidden"); 645 646 // When the -mc-relax-all flag is used, we emit instructions to fragments 647 // stored on a stack. When the bundle unlock is emitted, we pop a fragment 648 // from the stack a merge it to the one below. 649 if (getAssembler().getRelaxAll()) { 650 assert(!BundleGroups.empty() && "There are no bundle groups"); 651 MCDataFragment *DF = BundleGroups.back(); 652 653 // FIXME: Use BundleGroups to track the lock state instead. 654 Sec.setBundleLockState(MCSection::NotBundleLocked); 655 656 // FIXME: Use more separate fragments for nested groups. 657 if (!isBundleLocked()) { 658 mergeFragment(getOrCreateDataFragment(DF->getSubtargetInfo()), DF); 659 BundleGroups.pop_back(); 660 delete DF; 661 } 662 663 if (Sec.getBundleLockState() != MCSection::BundleLockedAlignToEnd) 664 getOrCreateDataFragment()->setAlignToBundleEnd(false); 665 } else 666 Sec.setBundleLockState(MCSection::NotBundleLocked); 667 } 668 669 void MCELFStreamer::finishImpl() { 670 // Ensure the last section gets aligned if necessary. 671 MCSection *CurSection = getCurrentSectionOnly(); 672 setSectionAlignmentForBundling(getAssembler(), CurSection); 673 674 finalizeCGProfile(); 675 emitFrames(nullptr); 676 677 this->MCObjectStreamer::finishImpl(); 678 } 679 680 void MCELFStreamer::emitThumbFunc(MCSymbol *Func) { 681 llvm_unreachable("Generic ELF doesn't support this directive"); 682 } 683 684 void MCELFStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) { 685 llvm_unreachable("ELF doesn't support this directive"); 686 } 687 688 void MCELFStreamer::emitZerofill(MCSection *Section, MCSymbol *Symbol, 689 uint64_t Size, unsigned ByteAlignment, 690 SMLoc Loc) { 691 llvm_unreachable("ELF doesn't support this directive"); 692 } 693 694 void MCELFStreamer::emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, 695 uint64_t Size, unsigned ByteAlignment) { 696 llvm_unreachable("ELF doesn't support this directive"); 697 } 698 699 MCStreamer *llvm::createELFStreamer(MCContext &Context, 700 std::unique_ptr<MCAsmBackend> &&MAB, 701 std::unique_ptr<MCObjectWriter> &&OW, 702 std::unique_ptr<MCCodeEmitter> &&CE, 703 bool RelaxAll) { 704 MCELFStreamer *S = 705 new MCELFStreamer(Context, std::move(MAB), std::move(OW), std::move(CE)); 706 if (RelaxAll) 707 S->getAssembler().setRelaxAll(true); 708 return S; 709 } 710