1462bba39c232350894c254d42fbe55f9ff78df56Nick Lewycky//===- lib/MC/MCELFStreamer.cpp - ELF Object Output -----------------------===// 23565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// 33565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// The LLVM Compiler Infrastructure 43565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// 53565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// This file is distributed under the University of Illinois Open Source 63565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// License. See LICENSE.TXT for details. 73565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// 83565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming//===----------------------------------------------------------------------===// 93565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// 103565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// This file assembles .s files and emits ELF .o object files. 113565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// 123565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming//===----------------------------------------------------------------------===// 133565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 14645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien#include "llvm/MC/MCELFStreamer.h" 1501a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne#include "llvm/ADT/STLExtras.h" 1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/SmallPtrSet.h" 1706866a72b0117e15463b0706d994270b3e20948dBill Wendling#include "llvm/MC/MCAsmBackend.h" 180c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar#include "llvm/MC/MCAsmLayout.h" 1937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCAsmInfo.h" 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCAssembler.h" 213565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/MC/MCCodeEmitter.h" 22f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola#include "llvm/MC/MCContext.h" 233565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/MC/MCExpr.h" 243565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/MC/MCInst.h" 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCObjectFileInfo.h" 26f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola#include "llvm/MC/MCObjectStreamer.h" 27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/MC/MCObjectWriter.h" 283565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/MC/MCSection.h" 29d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/MC/MCSectionELF.h" 306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/MC/MCSymbolELF.h" 313565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/MC/MCSymbol.h" 32484291c27319668ad99cb87def000254357736fbRafael Espindola#include "llvm/MC/MCValue.h" 333565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/Support/Debug.h" 343565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/Support/ELF.h" 353565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/Support/ErrorHandling.h" 364c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/Support/TargetRegistry.h" 373565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/Support/raw_ostream.h" 383565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 393565a06ebf44a193a8b333cbeff2ee154298d450Matt Flemingusing namespace llvm; 403565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarbool MCELFStreamer::isBundleLocked() const { 426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return getCurrentSectionOnly()->isBundleLocked(); 436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar} 446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 45645016533d1208d2e7a17d917d64b8b63c4f9939Logan ChienMCELFStreamer::~MCELFStreamer() { 46f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola} 47f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola 480c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarvoid MCELFStreamer::mergeFragment(MCDataFragment *DF, 49f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MCDataFragment *EF) { 500c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar MCAssembler &Assembler = getAssembler(); 510c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 520c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar if (Assembler.isBundlingEnabled() && Assembler.getRelaxAll()) { 530c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar uint64_t FSize = EF->getContents().size(); 540c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 550c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar if (FSize > Assembler.getBundleAlignSize()) 560c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar report_fatal_error("Fragment can't be larger than a bundle size"); 570c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar uint64_t RequiredBundlePadding = computeBundlePadding( 590c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar Assembler, EF, DF->getContents().size(), FSize); 600c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 610c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar if (RequiredBundlePadding > UINT8_MAX) 620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar report_fatal_error("Padding cannot exceed 255 bytes"); 630c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar if (RequiredBundlePadding > 0) { 650c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar SmallString<256> Code; 660c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar raw_svector_ostream VecOS(Code); 670c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar MCObjectWriter *OW = Assembler.getBackend().createObjectWriter(VecOS); 680c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 690c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar EF->setBundlePadding(static_cast<uint8_t>(RequiredBundlePadding)); 700c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 710c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar Assembler.writeFragmentPadding(*EF, FSize, OW); 720c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar delete OW; 730c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 740c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar DF->getContents().append(Code.begin(), Code.end()); 750c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar } 760c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar } 770c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 780c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar flushPendingLabels(DF, DF->getContents().size()); 790c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar for (unsigned i = 0, e = EF->getFixups().size(); i != e; ++i) { 810c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar EF->getFixups()[i].setOffset(EF->getFixups()[i].getOffset() + 820c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar DF->getContents().size()); 830c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar DF->getFixups().push_back(EF->getFixups()[i]); 840c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar } 850c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar DF->setHasInstructions(true); 860c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar DF->getContents().append(EF->getContents().begin(), EF->getContents().end()); 870c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar} 880c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 8937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid MCELFStreamer::InitSections(bool NoExecStack) { 9037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines MCContext &Ctx = getContext(); 9137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SwitchSection(Ctx.getObjectFileInfo()->getTextSection()); 9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EmitCodeAlignment(4); 9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (NoExecStack) 9537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SwitchSection(Ctx.getAsmInfo()->getNonexecutableStackSection(Ctx)); 96d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola} 97d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola 986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid MCELFStreamer::EmitLabel(MCSymbol *S) { 996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar auto *Symbol = cast<MCSymbolELF>(S); 100ba210243ef7d325ef6954d459091edf580a241f9Rafael Espindola assert(Symbol->isUndefined() && "Cannot define a symbol twice!"); 101ba210243ef7d325ef6954d459091edf580a241f9Rafael Espindola 102ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola MCObjectStreamer::EmitLabel(Symbol); 10373ffea47d20bc9f559b4ce0c60166ee504073832Rafael Espindola 104e1a2587ee273943390608df096378116ce52ffbaRafael Espindola const MCSectionELF &Section = 105f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar static_cast<const MCSectionELF &>(*getCurrentSectionOnly()); 1061c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola if (Section.getFlags() & ELF::SHF_TLS) 1076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setType(ELF::STT_TLS); 1083565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming} 1093565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 1103565a06ebf44a193a8b333cbeff2ee154298d450Matt Flemingvoid MCELFStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) { 11106866a72b0117e15463b0706d994270b3e20948dBill Wendling // Let the target do whatever target specific stuff it needs to do. 11206866a72b0117e15463b0706d994270b3e20948dBill Wendling getAssembler().getBackend().handleAssemblerFlag(Flag); 11306866a72b0117e15463b0706d994270b3e20948dBill Wendling // Do any generic stuff we need to do. 1143565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming switch (Flag) { 115ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach case MCAF_SyntaxUnified: return; // no-op here. 116bd27f5adbd8f3b8ab8def5aa43fbc406ac9b8cbeEvan Cheng case MCAF_Code16: return; // Change parsing mode; no-op here. 117bd27f5adbd8f3b8ab8def5aa43fbc406ac9b8cbeEvan Cheng case MCAF_Code32: return; // Change parsing mode; no-op here. 118bd27f5adbd8f3b8ab8def5aa43fbc406ac9b8cbeEvan Cheng case MCAF_Code64: return; // Change parsing mode; no-op here. 1193565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCAF_SubsectionsViaSymbols: 1203565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming getAssembler().setSubsectionsViaSymbols(true); 1213565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming return; 1223565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming } 1233565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 124858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper llvm_unreachable("invalid assembler flag!"); 1253565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming} 1263565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 127f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// If bundle alignment is used and there are any instructions in the section, it 1286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// needs to be aligned to at least the bundle size. 1296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstatic void setSectionAlignmentForBundling(const MCAssembler &Assembler, 1306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCSection *Section) { 1316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Section && Assembler.isBundlingEnabled() && Section->hasInstructions() && 1326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Section->getAlignment() < Assembler.getBundleAlignSize()) 1336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Section->setAlignment(Assembler.getBundleAlignSize()); 1346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar} 1356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid MCELFStreamer::ChangeSection(MCSection *Section, 137df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne const MCExpr *Subsection) { 1386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCSection *CurSection = getCurrentSectionOnly(); 1396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (CurSection && isBundleLocked()) 1404766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky report_fatal_error("Unterminated .bundle_lock when changing a section"); 14137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 14237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines MCAssembler &Asm = getAssembler(); 1436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Ensure the previous section gets aligned if necessary. 1446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar setSectionAlignmentForBundling(Asm, CurSection); 14537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines auto *SectionELF = static_cast<const MCSectionELF *>(Section); 14637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const MCSymbol *Grp = SectionELF->getGroup(); 1471f4f9e3d35a2264d86f97dfb6d1e4ccb434f449bRafael Espindola if (Grp) 1486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Asm.registerSymbol(*Grp); 14937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 150df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne this->MCObjectStreamer::ChangeSection(Section, Subsection); 1516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCContext &Ctx = getContext(); 1526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar auto *Begin = cast_or_null<MCSymbolELF>(Section->getBeginSymbol()); 1536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!Begin) { 1546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Begin = Ctx.getOrCreateSectionSymbol(*SectionELF); 1556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Section->setBeginSymbol(Begin); 1566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 1576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Begin->isUndefined()) { 1586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Asm.registerSymbol(*Begin); 1596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Begin->setType(ELF::STT_SECTION); 16037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 1611f4f9e3d35a2264d86f97dfb6d1e4ccb434f449bRafael Espindola} 1621f4f9e3d35a2264d86f97dfb6d1e4ccb434f449bRafael Espindola 163484291c27319668ad99cb87def000254357736fbRafael Espindolavoid MCELFStreamer::EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) { 1646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar getAssembler().registerSymbol(*Symbol); 1656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCExpr *Value = MCSymbolRefExpr::create( 16636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Symbol, MCSymbolRefExpr::VK_WEAKREF, getContext()); 167484291c27319668ad99cb87def000254357736fbRafael Espindola Alias->setVariableValue(Value); 168484291c27319668ad99cb87def000254357736fbRafael Espindola} 169484291c27319668ad99cb87def000254357736fbRafael Espindola 17001a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// When GNU as encounters more than one .type declaration for an object it seems 17101a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// to use a mechanism similar to the one below to decide which type is actually 17201a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// used in the object file. The greater of T1 and T2 is selected based on the 17301a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// following ordering: 17401a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// STT_NOTYPE < STT_OBJECT < STT_FUNC < STT_GNU_IFUNC < STT_TLS < anything else 17501a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// If neither T1 < T2 nor T2 < T1 according to this ordering, use T2 (the user 17601a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// provided type). 17701a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbournestatic unsigned CombineSymbolTypes(unsigned T1, unsigned T2) { 1784c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar for (unsigned Type : {ELF::STT_NOTYPE, ELF::STT_OBJECT, ELF::STT_FUNC, 1794c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar ELF::STT_GNU_IFUNC, ELF::STT_TLS}) { 1804c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar if (T1 == Type) 18101a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne return T2; 1824c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar if (T2 == Type) 18301a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne return T1; 18401a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne } 18501a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne 18601a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne return T2; 18701a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne} 18801a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne 1896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarbool MCELFStreamer::EmitSymbolAttribute(MCSymbol *S, MCSymbolAttr Attribute) { 1906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar auto *Symbol = cast<MCSymbolELF>(S); 1913565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // Indirect symbols are handled differently, to match how 'as' handles 1923565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // them. This makes writing matching .o files easier. 1933565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming if (Attribute == MCSA_IndirectSymbol) { 1943565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // Note that we intentionally cannot use the symbol data here; this is 1953565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // important for matching the string table that 'as' generates. 1963565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming IndirectSymbolData ISD; 1973565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming ISD.Symbol = Symbol; 1986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ISD.Section = getCurrentSectionOnly(); 1993565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming getAssembler().getIndirectSymbols().push_back(ISD); 2001c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool return true; 2013565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming } 2023565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 2033565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // Adding a symbol attribute always introduces the symbol, note that an 2046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // important side effect of calling registerSymbol here is to register 2053565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // the symbol with the assembler. 2066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar getAssembler().registerSymbol(*Symbol); 2073565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 2083565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // The implementation of symbol attributes is designed to match 'as', but it 2093565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // leaves much to desired. It doesn't really make sense to arbitrarily add and 2103565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // remove flags, but 'as' allows this (in particular, see .desc). 2113565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // 2123565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // In the future it might be worth trying to make these operations more well 2133565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // defined. 2143565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming switch (Attribute) { 2153565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_LazyReference: 2163565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_Reference: 217e8e98d7f2eaa0613442ce21ab6a040c0f04f5b4dKevin Enderby case MCSA_SymbolResolver: 2183565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_PrivateExtern: 2193565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_WeakDefinition: 220f8020a3978b9a56074a3a5f9821c63165e37bff7Eli Friedman case MCSA_WeakDefAutoPrivate: 2213565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_Invalid: 2223565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_IndirectSymbol: 2231c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool return false; 2243565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 2253f90a4c42d1683600e91c2aea325bacf59c37f5eJim Grosbach case MCSA_NoDeadStrip: 2267e528a1724d8f38dd817396938aaf768887c8b30Rafael Espindola // Ignore for now. 2277e528a1724d8f38dd817396938aaf768887c8b30Rafael Espindola break; 2287e528a1724d8f38dd817396938aaf768887c8b30Rafael Espindola 229ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines case MCSA_ELF_TypeGnuUniqueObject: 2306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT)); 2316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setBinding(ELF::STB_GNU_UNIQUE); 2326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setExternal(true); 233ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines break; 234ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 2353565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_Global: 2366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setBinding(ELF::STB_GLOBAL); 2376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setExternal(true); 2383565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 2393565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 240230c27472458d5f1f52f96347b655d1b5c531f33Benjamin Kramer case MCSA_WeakReference: 2413565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_Weak: 2426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setBinding(ELF::STB_WEAK); 2436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setExternal(true); 2443565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 2453565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 2463565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_Local: 2476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setBinding(ELF::STB_LOCAL); 2486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setExternal(false); 2493565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 2503565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 2513565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_ELF_TypeFunction: 2526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_FUNC)); 2533565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 2543565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 255a0c17a495b12debcb7f206993bbc6020e2e6e8dfRoman Divacky case MCSA_ELF_TypeIndFunction: 2566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_GNU_IFUNC)); 257a0c17a495b12debcb7f206993bbc6020e2e6e8dfRoman Divacky break; 258a0c17a495b12debcb7f206993bbc6020e2e6e8dfRoman Divacky 2593565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_ELF_TypeObject: 2606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT)); 2613565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 2623565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 2633565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_ELF_TypeTLS: 2646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_TLS)); 2653565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 2663565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 2673565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_ELF_TypeCommon: 26801a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne // TODO: Emit these as a common symbol. 2696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT)); 2703565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 2713565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 2723565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_ELF_TypeNoType: 2736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_NOTYPE)); 2743565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 2753565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 2763565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_Protected: 2776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setVisibility(ELF::STV_PROTECTED); 2783565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 2793565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 2803565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_Hidden: 2816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setVisibility(ELF::STV_HIDDEN); 2823565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 2833565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 2843565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_Internal: 2856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setVisibility(ELF::STV_INTERNAL); 2863565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 287de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 288de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar case MCSA_AltEntry: 289de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar llvm_unreachable("ELF doesn't support the .alt_entry attribute"); 2903565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming } 2911c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool 2921c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool return true; 2933565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming} 2943565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 2956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid MCELFStreamer::EmitCommonSymbol(MCSymbol *S, uint64_t Size, 2966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar unsigned ByteAlignment) { 2976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar auto *Symbol = cast<MCSymbolELF>(S); 2986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar getAssembler().registerSymbol(*Symbol); 2993565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 3006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!Symbol->isBindingSet()) { 3016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setBinding(ELF::STB_GLOBAL); 3026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setExternal(true); 303f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola } 304f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola 3056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setType(ELF::STT_OBJECT); 30655d02f3a138badd5b1f96240b4d4b416d9026e2cRafael Espindola 3076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Symbol->getBinding() == ELF::STB_LOCAL) { 308f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MCSection &Section = *getAssembler().getContext().getELFSection( 309ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines ".bss", ELF::SHT_NOBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC); 310f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MCSectionSubPair P = getCurrentSection(); 311f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar SwitchSection(&Section); 3125cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 313f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar EmitValueToAlignment(ByteAlignment, 0, 1, 0); 314f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar EmitLabel(Symbol); 315f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar EmitZeros(Size); 3161963572f9de87cd1ac5f16e504e27c3c26267e6fRafael Espindola 317f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // Update the maximum alignment of the section if necessary. 318f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (ByteAlignment > Section.getAlignment()) 319f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Section.setAlignment(ByteAlignment); 320f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 321f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar SwitchSection(P.first, P.second); 322f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola } else { 3236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if(Symbol->declareCommon(Size, ByteAlignment)) 3246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar report_fatal_error("Symbol: " + Symbol->getName() + 3256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar " redeclared as different type"); 3263565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming } 3273565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 3286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar cast<MCSymbolELF>(Symbol) 3296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ->setSize(MCConstantExpr::create(Size, getContext())); 3303565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming} 3313565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 3326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid MCELFStreamer::emitELFSize(MCSymbolELF *Symbol, const MCExpr *Value) { 3336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setSize(Value); 334645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien} 335645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien 3366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid MCELFStreamer::EmitLocalCommonSymbol(MCSymbol *S, uint64_t Size, 33736a16015ac108e2f0dd2d6d96a6d364bc74c50d7Benjamin Kramer unsigned ByteAlignment) { 3386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar auto *Symbol = cast<MCSymbolELF>(S); 339f13743bb3c3fb37a59b59f26056bc391bf0adcdcJason W Kim // FIXME: Should this be caught and done earlier? 3406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar getAssembler().registerSymbol(*Symbol); 3416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setBinding(ELF::STB_LOCAL); 3426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Symbol->setExternal(false); 34336a16015ac108e2f0dd2d6d96a6d364bc74c50d7Benjamin Kramer EmitCommonSymbol(Symbol, Size, ByteAlignment); 344f13743bb3c3fb37a59b59f26056bc391bf0adcdcJason W Kim} 345f13743bb3c3fb37a59b59f26056bc391bf0adcdcJason W Kim 346dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid MCELFStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size, 347f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar SMLoc Loc) { 3486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isBundleLocked()) 3494766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky report_fatal_error("Emitting values inside a locked bundle is forbidden"); 3505f7692604d44192206fbaf390085a95c9fb1a40bDavid Meyer fixSymbolsInTLSFixups(Value); 351dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCObjectStreamer::EmitValueImpl(Value, Size, Loc); 3525f7692604d44192206fbaf390085a95c9fb1a40bDavid Meyer} 3535f7692604d44192206fbaf390085a95c9fb1a40bDavid Meyer 3544766ef41b31e4f97bce1179c3b0398303bf65356Eli Benderskyvoid MCELFStreamer::EmitValueToAlignment(unsigned ByteAlignment, 3554766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky int64_t Value, 3564766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky unsigned ValueSize, 3574766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky unsigned MaxBytesToEmit) { 3586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isBundleLocked()) 3594766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky report_fatal_error("Emitting values inside a locked bundle is forbidden"); 3604766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky MCObjectStreamer::EmitValueToAlignment(ByteAlignment, Value, 3614766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky ValueSize, MaxBytesToEmit); 3624766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky} 3634766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 36472580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger// Add a symbol for the file name of this module. They start after the 36572580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger// null symbol and don't count as normal symbol, i.e. a non-STT_FILE symbol 36672580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger// with the same name may appear. 3673565a06ebf44a193a8b333cbeff2ee154298d450Matt Flemingvoid MCELFStreamer::EmitFileDirective(StringRef Filename) { 36872580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger getAssembler().addFileName(Filename); 3693565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming} 3703565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 371c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindolavoid MCELFStreamer::EmitIdent(StringRef IdentString) { 3726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCSection *Comment = getAssembler().getContext().getELFSection( 373ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines ".comment", ELF::SHT_PROGBITS, ELF::SHF_MERGE | ELF::SHF_STRINGS, 1, ""); 374c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola PushSection(); 375c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola SwitchSection(Comment); 376c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola if (!SeenIdent) { 377c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola EmitIntValue(0, 1); 378c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola SeenIdent = true; 379c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola } 380c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola EmitBytes(IdentString); 381c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola EmitIntValue(0, 1); 382c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola PopSection(); 383c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola} 384c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola 385c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindolavoid MCELFStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) { 38697551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola switch (expr->getKind()) { 38772062f5744557e270a38192554c3126ea5f97434Tim Northover case MCExpr::Target: 38872062f5744557e270a38192554c3126ea5f97434Tim Northover cast<MCTargetExpr>(expr)->fixELFSymbolsInTLSFixups(getAssembler()); 38972062f5744557e270a38192554c3126ea5f97434Tim Northover break; 39097551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola case MCExpr::Constant: 39197551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola break; 39297551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola 39397551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola case MCExpr::Binary: { 39497551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola const MCBinaryExpr *be = cast<MCBinaryExpr>(expr); 39597551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola fixSymbolsInTLSFixups(be->getLHS()); 39697551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola fixSymbolsInTLSFixups(be->getRHS()); 39797551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola break; 39897551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola } 39997551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola 40097551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola case MCExpr::SymbolRef: { 40197551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola const MCSymbolRefExpr &symRef = *cast<MCSymbolRefExpr>(expr); 402bf8209daf875fa533a379290a91d01be5152597dRafael Espindola switch (symRef.getKind()) { 403bf8209daf875fa533a379290a91d01be5152597dRafael Espindola default: 40497551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola return; 405d02c8b6cc1d07bfe37fc055eefdac21b1c9303cbJoerg Sonnenberger case MCSymbolRefExpr::VK_GOTTPOFF: 406d02c8b6cc1d07bfe37fc055eefdac21b1c9303cbJoerg Sonnenberger case MCSymbolRefExpr::VK_INDNTPOFF: 407bf8209daf875fa533a379290a91d01be5152597dRafael Espindola case MCSymbolRefExpr::VK_NTPOFF: 408bf8209daf875fa533a379290a91d01be5152597dRafael Espindola case MCSymbolRefExpr::VK_GOTNTPOFF: 409bf8209daf875fa533a379290a91d01be5152597dRafael Espindola case MCSymbolRefExpr::VK_TLSGD: 410d02c8b6cc1d07bfe37fc055eefdac21b1c9303cbJoerg Sonnenberger case MCSymbolRefExpr::VK_TLSLD: 411bf8209daf875fa533a379290a91d01be5152597dRafael Espindola case MCSymbolRefExpr::VK_TLSLDM: 412bf8209daf875fa533a379290a91d01be5152597dRafael Espindola case MCSymbolRefExpr::VK_TPOFF: 413de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar case MCSymbolRefExpr::VK_TPREL: 414bf8209daf875fa533a379290a91d01be5152597dRafael Espindola case MCSymbolRefExpr::VK_DTPOFF: 415de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar case MCSymbolRefExpr::VK_DTPREL: 416228e0afcfd0d5f167a95c6ddbec2c6a4a90b6d2bUlrich Weigand case MCSymbolRefExpr::VK_PPC_DTPMOD: 41792cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_TPREL_LO: 418cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_TPREL_HI: 41992cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_TPREL_HA: 420cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_TPREL_HIGHER: 421cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_TPREL_HIGHERA: 422cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_TPREL_HIGHEST: 423cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_TPREL_HIGHESTA: 42492cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_DTPREL_LO: 425cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_DTPREL_HI: 42692cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_DTPREL_HA: 427cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHER: 428cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHERA: 429cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHEST: 430cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHESTA: 431cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TPREL: 43292cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO: 433cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HI: 43492cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HA: 435cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_DTPREL: 436cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_LO: 437cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HI: 438cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HA: 4393a42989d3ddfe30c6b87fe1f3d7f1164e0868a40Bill Schmidt case MCSymbolRefExpr::VK_PPC_TLS: 440cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TLSGD: 44192cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO: 442cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HI: 44392cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HA: 4447a34599db017a5486cf7cd11eb124984acec8286Ulrich Weigand case MCSymbolRefExpr::VK_PPC_TLSGD: 445cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TLSLD: 44692cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO: 447cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HI: 44892cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HA: 4497a34599db017a5486cf7cd11eb124984acec8286Ulrich Weigand case MCSymbolRefExpr::VK_PPC_TLSLD: 450bf8209daf875fa533a379290a91d01be5152597dRafael Espindola break; 451bf8209daf875fa533a379290a91d01be5152597dRafael Espindola } 4526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar getAssembler().registerSymbol(symRef.getSymbol()); 4536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar cast<MCSymbolELF>(symRef.getSymbol()).setType(ELF::STT_TLS); 45497551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola break; 45597551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola } 45697551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola 45797551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola case MCExpr::Unary: 45897551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola fixSymbolsInTLSFixups(cast<MCUnaryExpr>(expr)->getSubExpr()); 45997551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola break; 46097551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola } 46197551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola} 46297551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola 46336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid MCELFStreamer::EmitInstToFragment(const MCInst &Inst, 46436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) { 46536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines this->MCObjectStreamer::EmitInstToFragment(Inst, STI); 466251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky MCRelaxableFragment &F = *cast<MCRelaxableFragment>(getCurrentFragment()); 4673565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 468dedb045c3296c831962c4ae101531c38c273ba89Rafael Espindola for (unsigned i = 0, e = F.getFixups().size(); i != e; ++i) 469dedb045c3296c831962c4ae101531c38c273ba89Rafael Espindola fixSymbolsInTLSFixups(F.getFixups()[i].getValue()); 47093ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer} 47193ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer 47236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid MCELFStreamer::EmitInstToData(const MCInst &Inst, 47336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) { 4744766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky MCAssembler &Assembler = getAssembler(); 4753565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming SmallVector<MCFixup, 4> Fixups; 4763565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming SmallString<256> Code; 4773565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming raw_svector_ostream VecOS(Code); 4786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Assembler.getEmitter().encodeInstruction(Inst, VecOS, Fixups, STI); 4793565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 48097551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola for (unsigned i = 0, e = Fixups.size(); i != e; ++i) 48197551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola fixSymbolsInTLSFixups(Fixups[i].getValue()); 48297551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola 4834766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // There are several possibilities here: 4844766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // 4854766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // If bundling is disabled, append the encoded instruction to the current data 4864766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // fragment (or create a new such fragment if the current fragment is not a 4874766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // data fragment). 4884766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // 4894766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // If bundling is enabled: 4909ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky // - If we're not in a bundle-locked group, emit the instruction into a 4919ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky // fragment of its own. If there are no fixups registered for the 4929ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky // instruction, emit a MCCompactEncodedInstFragment. Otherwise, emit a 4939ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky // MCDataFragment. 4944766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // - If we're in a bundle-locked group, append the instruction to the current 4954766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // data fragment because we want all the instructions in a group to get into 4964766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // the same fragment. Be careful not to do that for the first instruction in 4974766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // the group, though. 4984766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky MCDataFragment *DF; 4994766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 5004766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky if (Assembler.isBundlingEnabled()) { 5016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCSection &Sec = *getCurrentSectionOnly(); 5026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Assembler.getRelaxAll() && isBundleLocked()) 5030c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar // If the -mc-relax-all flag is used and we are bundle-locked, we re-use 5040c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar // the current bundle group. 5050c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar DF = BundleGroups.back(); 5066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar else if (Assembler.getRelaxAll() && !isBundleLocked()) 5070c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar // When not in a bundle-locked group and the -mc-relax-all flag is used, 5080c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar // we create a new temporary fragment which will be later merged into 5090c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar // the current fragment. 5100c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar DF = new MCDataFragment(); 5116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar else if (isBundleLocked() && !Sec.isBundleGroupBeforeFirstInst()) 51267144e37ba5cd35ee917daac631e03963b05a674Derek Schuff // If we are bundle-locked, we re-use the current fragment. 51367144e37ba5cd35ee917daac631e03963b05a674Derek Schuff // The bundle-locking directive ensures this is a new data fragment. 51467144e37ba5cd35ee917daac631e03963b05a674Derek Schuff DF = cast<MCDataFragment>(getCurrentFragment()); 5156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar else if (!isBundleLocked() && Fixups.size() == 0) { 5169ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky // Optimize memory usage by emitting the instruction to a 5179ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky // MCCompactEncodedInstFragment when not in a bundle-locked group and 5189ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky // there are no fixups registered. 519df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne MCCompactEncodedInstFragment *CEIF = new MCCompactEncodedInstFragment(); 520df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne insert(CEIF); 5219ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky CEIF->getContents().append(Code.begin(), Code.end()); 5229ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky return; 52367144e37ba5cd35ee917daac631e03963b05a674Derek Schuff } else { 524df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne DF = new MCDataFragment(); 525df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne insert(DF); 52637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 5276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Sec.getBundleLockState() == MCSection::BundleLockedAlignToEnd) { 52837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // If this fragment is for a group marked "align_to_end", set a flag 52937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // in the fragment. This can happen after the fragment has already been 53037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // created if there are nested bundle_align groups and an inner one 53137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // is the one marked align_to_end. 53237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines DF->setAlignToBundleEnd(true); 5336c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky } 5344766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 5354766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // We're now emitting an instruction in a bundle group, so this flag has 5364766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // to be turned off. 5376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Sec.setBundleGroupBeforeFirstInst(false); 5384766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky } else { 5394766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky DF = getOrCreateDataFragment(); 5404766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky } 5414766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 54293ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer // Add the fixups and data. 5433565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming for (unsigned i = 0, e = Fixups.size(); i != e; ++i) { 54493ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer Fixups[i].setOffset(Fixups[i].getOffset() + DF->getContents().size()); 54564d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky DF->getFixups().push_back(Fixups[i]); 5463565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming } 5474766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky DF->setHasInstructions(true); 54893ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer DF->getContents().append(Code.begin(), Code.end()); 5490c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 5500c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar if (Assembler.isBundlingEnabled() && Assembler.getRelaxAll()) { 5516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!isBundleLocked()) { 5520c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar mergeFragment(getOrCreateDataFragment(), DF); 5530c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar delete DF; 5540c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar } 5550c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar } 55693ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer} 5573565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 5584766ef41b31e4f97bce1179c3b0398303bf65356Eli Benderskyvoid MCELFStreamer::EmitBundleAlignMode(unsigned AlignPow2) { 5594766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky assert(AlignPow2 <= 30 && "Invalid bundle alignment"); 5604766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky MCAssembler &Assembler = getAssembler(); 56137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (AlignPow2 > 0 && (Assembler.getBundleAlignSize() == 0 || 56237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Assembler.getBundleAlignSize() == 1U << AlignPow2)) 56337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Assembler.setBundleAlignSize(1U << AlignPow2); 5644766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky else 56537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines report_fatal_error(".bundle_align_mode cannot be changed once set"); 5664766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky} 5674766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 5686c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Benderskyvoid MCELFStreamer::EmitBundleLock(bool AlignToEnd) { 5696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCSection &Sec = *getCurrentSectionOnly(); 5704766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 5714766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // Sanity checks 5724766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // 5734766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky if (!getAssembler().isBundlingEnabled()) 5744766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky report_fatal_error(".bundle_lock forbidden when bundling is disabled"); 57537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 5766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!isBundleLocked()) 5776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Sec.setBundleGroupBeforeFirstInst(true); 5784766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 5796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (getAssembler().getRelaxAll() && !isBundleLocked()) { 5800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar // TODO: drop the lock state and set directly in the fragment 5810c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar MCDataFragment *DF = new MCDataFragment(); 5820c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar BundleGroups.push_back(DF); 5830c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar } 5840c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 5856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Sec.setBundleLockState(AlignToEnd ? MCSection::BundleLockedAlignToEnd 5866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar : MCSection::BundleLocked); 5874766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky} 5884766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 5894766ef41b31e4f97bce1179c3b0398303bf65356Eli Benderskyvoid MCELFStreamer::EmitBundleUnlock() { 5906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCSection &Sec = *getCurrentSectionOnly(); 5914766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 5924766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // Sanity checks 5934766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky if (!getAssembler().isBundlingEnabled()) 5944766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky report_fatal_error(".bundle_unlock forbidden when bundling is disabled"); 5956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar else if (!isBundleLocked()) 5964766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky report_fatal_error(".bundle_unlock without matching lock"); 5976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar else if (Sec.isBundleGroupBeforeFirstInst()) 5984766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky report_fatal_error("Empty bundle-locked group is forbidden"); 5994766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 6000c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar // When the -mc-relax-all flag is used, we emit instructions to fragments 601f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // stored on a stack. When the bundle unlock is emitted, we pop a fragment 6020c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar // from the stack a merge it to the one below. 6030c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar if (getAssembler().getRelaxAll()) { 6040c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar assert(!BundleGroups.empty() && "There are no bundle groups"); 6050c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar MCDataFragment *DF = BundleGroups.back(); 6060c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 6070c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar // FIXME: Use BundleGroups to track the lock state instead. 6086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Sec.setBundleLockState(MCSection::NotBundleLocked); 6090c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 6106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // FIXME: Use more separate fragments for nested groups. 6116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!isBundleLocked()) { 6120c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar mergeFragment(getOrCreateDataFragment(), DF); 6130c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar BundleGroups.pop_back(); 6140c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar delete DF; 6150c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar } 6160c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 6176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Sec.getBundleLockState() != MCSection::BundleLockedAlignToEnd) 6180c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar getOrCreateDataFragment()->setAlignToBundleEnd(false); 6190c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar } else 6206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Sec.setBundleLockState(MCSection::NotBundleLocked); 6214766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky} 6224766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 6235cc319a42a914b24b164a94d9a563c728a7a4026Richard Mittonvoid MCELFStreamer::FinishImpl() { 6246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Ensure the last section gets aligned if necessary. 6256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCSection *CurSection = getCurrentSectionOnly(); 6266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar setSectionAlignmentForBundling(getAssembler(), CurSection); 6276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 628dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines EmitFrames(nullptr); 6295cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 63099b4237c1647156f0e1d3d7e03efdab23ed79778Rafael Espindola this->MCObjectStreamer::FinishImpl(); 6313565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming} 6325cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 63336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesMCStreamer *llvm::createELFStreamer(MCContext &Context, MCAsmBackend &MAB, 6340c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar raw_pwrite_stream &OS, MCCodeEmitter *CE, 63537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool RelaxAll) { 63636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCELFStreamer *S = new MCELFStreamer(Context, MAB, OS, CE); 6373565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming if (RelaxAll) 6383565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming S->getAssembler().setRelaxAll(true); 6393565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming return S; 6403565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming} 641645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien 6426eb3e87df04f8b035562d9865292c23f5b79f1a2Tim Northovervoid MCELFStreamer::EmitThumbFunc(MCSymbol *Func) { 6436eb3e87df04f8b035562d9865292c23f5b79f1a2Tim Northover llvm_unreachable("Generic ELF doesn't support this directive"); 6446eb3e87df04f8b035562d9865292c23f5b79f1a2Tim Northover} 6456eb3e87df04f8b035562d9865292c23f5b79f1a2Tim Northover 646645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) { 647645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien llvm_unreachable("ELF doesn't support this directive"); 648645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien} 649645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien 650645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::BeginCOFFSymbolDef(const MCSymbol *Symbol) { 651645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien llvm_unreachable("ELF doesn't support this directive"); 652645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien} 653645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien 654645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EmitCOFFSymbolStorageClass(int StorageClass) { 655645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien llvm_unreachable("ELF doesn't support this directive"); 656645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien} 657645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien 658645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EmitCOFFSymbolType(int Type) { 659645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien llvm_unreachable("ELF doesn't support this directive"); 660645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien} 661645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien 662645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EndCOFFSymbolDef() { 663645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien llvm_unreachable("ELF doesn't support this directive"); 664645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien} 665645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien 6666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid MCELFStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol, 667645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien uint64_t Size, unsigned ByteAlignment) { 668645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien llvm_unreachable("ELF doesn't support this directive"); 669645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien} 670645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien 6716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid MCELFStreamer::EmitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, 672645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien uint64_t Size, unsigned ByteAlignment) { 673645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien llvm_unreachable("ELF doesn't support this directive"); 674645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien} 675