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" 1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCAssembler.h" 193565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/MC/MCCodeEmitter.h" 20f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola#include "llvm/MC/MCContext.h" 216eb3e87df04f8b035562d9865292c23f5b79f1a2Tim Northover#include "llvm/MC/MCELF.h" 223565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/MC/MCELFSymbolFlags.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" 273565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/MC/MCSection.h" 28d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/MC/MCSectionELF.h" 293565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/MC/MCSymbol.h" 30484291c27319668ad99cb87def000254357736fbRafael Espindola#include "llvm/MC/MCValue.h" 313565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/Support/Debug.h" 323565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/Support/ELF.h" 333565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/Support/ErrorHandling.h" 343565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/Support/raw_ostream.h" 353565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 363565a06ebf44a193a8b333cbeff2ee154298d450Matt Flemingusing namespace llvm; 373565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 38645016533d1208d2e7a17d917d64b8b63c4f9939Logan ChienMCELFStreamer::~MCELFStreamer() { 39f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola} 40f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola 41d80781b98b771d370730ab7c630018f23e202b57Rafael Espindolavoid MCELFStreamer::InitSections() { 42d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola // This emulates the same behavior of GNU as. This makes it easier 43d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola // to compare the output as the major sections are in the same order. 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SwitchSection(getContext().getObjectFileInfo()->getTextSection()); 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EmitCodeAlignment(4); 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SwitchSection(getContext().getObjectFileInfo()->getDataSection()); 4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EmitCodeAlignment(4); 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SwitchSection(getContext().getObjectFileInfo()->getBSSSection()); 5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EmitCodeAlignment(4); 5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SwitchSection(getContext().getObjectFileInfo()->getTextSection()); 54d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola} 55d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola 563565a06ebf44a193a8b333cbeff2ee154298d450Matt Flemingvoid MCELFStreamer::EmitLabel(MCSymbol *Symbol) { 57ba210243ef7d325ef6954d459091edf580a241f9Rafael Espindola assert(Symbol->isUndefined() && "Cannot define a symbol twice!"); 58ba210243ef7d325ef6954d459091edf580a241f9Rafael Espindola 59ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola MCObjectStreamer::EmitLabel(Symbol); 6073ffea47d20bc9f559b4ce0c60166ee504073832Rafael Espindola 61e1a2587ee273943390608df096378116ce52ffbaRafael Espindola const MCSectionELF &Section = 62e1a2587ee273943390608df096378116ce52ffbaRafael Espindola static_cast<const MCSectionELF&>(Symbol->getSection()); 63ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola MCSymbolData &SD = getAssembler().getSymbolData(*Symbol); 641c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola if (Section.getFlags() & ELF::SHF_TLS) 652ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin MCELF::SetType(SD, ELF::STT_TLS); 663565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming} 673565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 683565a06ebf44a193a8b333cbeff2ee154298d450Matt Flemingvoid MCELFStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) { 6906866a72b0117e15463b0706d994270b3e20948dBill Wendling // Let the target do whatever target specific stuff it needs to do. 7006866a72b0117e15463b0706d994270b3e20948dBill Wendling getAssembler().getBackend().handleAssemblerFlag(Flag); 7106866a72b0117e15463b0706d994270b3e20948dBill Wendling // Do any generic stuff we need to do. 723565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming switch (Flag) { 73ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach case MCAF_SyntaxUnified: return; // no-op here. 74bd27f5adbd8f3b8ab8def5aa43fbc406ac9b8cbeEvan Cheng case MCAF_Code16: return; // Change parsing mode; no-op here. 75bd27f5adbd8f3b8ab8def5aa43fbc406ac9b8cbeEvan Cheng case MCAF_Code32: return; // Change parsing mode; no-op here. 76bd27f5adbd8f3b8ab8def5aa43fbc406ac9b8cbeEvan Cheng case MCAF_Code64: return; // Change parsing mode; no-op here. 773565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCAF_SubsectionsViaSymbols: 783565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming getAssembler().setSubsectionsViaSymbols(true); 793565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming return; 803565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming } 813565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 82858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper llvm_unreachable("invalid assembler flag!"); 833565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming} 843565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 85df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbournevoid MCELFStreamer::ChangeSection(const MCSection *Section, 86df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne const MCExpr *Subsection) { 874766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky MCSectionData *CurSection = getCurrentSectionData(); 884766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky if (CurSection && CurSection->isBundleLocked()) 894766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky report_fatal_error("Unterminated .bundle_lock when changing a section"); 901f4f9e3d35a2264d86f97dfb6d1e4ccb434f449bRafael Espindola const MCSymbol *Grp = static_cast<const MCSectionELF *>(Section)->getGroup(); 911f4f9e3d35a2264d86f97dfb6d1e4ccb434f449bRafael Espindola if (Grp) 921f4f9e3d35a2264d86f97dfb6d1e4ccb434f449bRafael Espindola getAssembler().getOrCreateSymbolData(*Grp); 93df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne this->MCObjectStreamer::ChangeSection(Section, Subsection); 941f4f9e3d35a2264d86f97dfb6d1e4ccb434f449bRafael Espindola} 951f4f9e3d35a2264d86f97dfb6d1e4ccb434f449bRafael Espindola 96484291c27319668ad99cb87def000254357736fbRafael Espindolavoid MCELFStreamer::EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) { 97484291c27319668ad99cb87def000254357736fbRafael Espindola getAssembler().getOrCreateSymbolData(*Symbol); 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *Value = MCSymbolRefExpr::Create( 9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Symbol, MCSymbolRefExpr::VK_WEAKREF, getContext()); 100484291c27319668ad99cb87def000254357736fbRafael Espindola Alias->setVariableValue(Value); 101484291c27319668ad99cb87def000254357736fbRafael Espindola} 102484291c27319668ad99cb87def000254357736fbRafael Espindola 10301a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// When GNU as encounters more than one .type declaration for an object it seems 10401a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// to use a mechanism similar to the one below to decide which type is actually 10501a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// used in the object file. The greater of T1 and T2 is selected based on the 10601a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// following ordering: 10701a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// STT_NOTYPE < STT_OBJECT < STT_FUNC < STT_GNU_IFUNC < STT_TLS < anything else 10801a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// If neither T1 < T2 nor T2 < T1 according to this ordering, use T2 (the user 10901a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// provided type). 11001a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbournestatic unsigned CombineSymbolTypes(unsigned T1, unsigned T2) { 11101a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne unsigned TypeOrdering[] = {ELF::STT_NOTYPE, ELF::STT_OBJECT, ELF::STT_FUNC, 11201a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne ELF::STT_GNU_IFUNC, ELF::STT_TLS}; 11301a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne for (unsigned i = 0; i != array_lengthof(TypeOrdering); ++i) { 11401a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne if (T1 == TypeOrdering[i]) 11501a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne return T2; 11601a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne if (T2 == TypeOrdering[i]) 11701a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne return T1; 11801a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne } 11901a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne 12001a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne return T2; 12101a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne} 12201a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne 1231c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasoolbool MCELFStreamer::EmitSymbolAttribute(MCSymbol *Symbol, 1241c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool MCSymbolAttr Attribute) { 1253565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // Indirect symbols are handled differently, to match how 'as' handles 1263565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // them. This makes writing matching .o files easier. 1273565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming if (Attribute == MCSA_IndirectSymbol) { 1283565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // Note that we intentionally cannot use the symbol data here; this is 1293565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // important for matching the string table that 'as' generates. 1303565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming IndirectSymbolData ISD; 1313565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming ISD.Symbol = Symbol; 1323565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming ISD.SectionData = getCurrentSectionData(); 1333565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming getAssembler().getIndirectSymbols().push_back(ISD); 1341c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool return true; 1353565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming } 1363565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 1373565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // Adding a symbol attribute always introduces the symbol, note that an 1383565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // important side effect of calling getOrCreateSymbolData here is to register 1393565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // the symbol with the assembler. 1403565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol); 1413565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 1423565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // The implementation of symbol attributes is designed to match 'as', but it 1433565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // leaves much to desired. It doesn't really make sense to arbitrarily add and 1443565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // remove flags, but 'as' allows this (in particular, see .desc). 1453565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // 1463565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // In the future it might be worth trying to make these operations more well 1473565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming // defined. 1483565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming switch (Attribute) { 1493565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_LazyReference: 1503565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_Reference: 151e8e98d7f2eaa0613442ce21ab6a040c0f04f5b4dKevin Enderby case MCSA_SymbolResolver: 1523565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_PrivateExtern: 1533565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_WeakDefinition: 154f8020a3978b9a56074a3a5f9821c63165e37bff7Eli Friedman case MCSA_WeakDefAutoPrivate: 1553565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_Invalid: 1563565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_IndirectSymbol: 1571c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool return false; 1583565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 1593f90a4c42d1683600e91c2aea325bacf59c37f5eJim Grosbach case MCSA_NoDeadStrip: 1607e528a1724d8f38dd817396938aaf768887c8b30Rafael Espindola case MCSA_ELF_TypeGnuUniqueObject: 1617e528a1724d8f38dd817396938aaf768887c8b30Rafael Espindola // Ignore for now. 1627e528a1724d8f38dd817396938aaf768887c8b30Rafael Espindola break; 1637e528a1724d8f38dd817396938aaf768887c8b30Rafael Espindola 1643565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_Global: 1652ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin MCELF::SetBinding(SD, ELF::STB_GLOBAL); 1663565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming SD.setExternal(true); 167f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola BindingExplicitlySet.insert(Symbol); 1683565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 1693565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 170230c27472458d5f1f52f96347b655d1b5c531f33Benjamin Kramer case MCSA_WeakReference: 1713565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_Weak: 1722ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin MCELF::SetBinding(SD, ELF::STB_WEAK); 1733223f19ff0920ffee686faba3bf74babf580e8a5Rafael Espindola SD.setExternal(true); 174f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola BindingExplicitlySet.insert(Symbol); 1753565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 1763565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 1773565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_Local: 1782ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin MCELF::SetBinding(SD, ELF::STB_LOCAL); 179f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola SD.setExternal(false); 180f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola BindingExplicitlySet.insert(Symbol); 1813565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 1823565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 1833565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_ELF_TypeFunction: 18401a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne MCELF::SetType(SD, CombineSymbolTypes(MCELF::GetType(SD), 18501a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne ELF::STT_FUNC)); 1863565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 1873565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 188a0c17a495b12debcb7f206993bbc6020e2e6e8dfRoman Divacky case MCSA_ELF_TypeIndFunction: 18901a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne MCELF::SetType(SD, CombineSymbolTypes(MCELF::GetType(SD), 19001a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne ELF::STT_GNU_IFUNC)); 191a0c17a495b12debcb7f206993bbc6020e2e6e8dfRoman Divacky break; 192a0c17a495b12debcb7f206993bbc6020e2e6e8dfRoman Divacky 1933565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_ELF_TypeObject: 19401a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne MCELF::SetType(SD, CombineSymbolTypes(MCELF::GetType(SD), 19501a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne ELF::STT_OBJECT)); 1963565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 1973565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 1983565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_ELF_TypeTLS: 19901a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne MCELF::SetType(SD, CombineSymbolTypes(MCELF::GetType(SD), 20001a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne ELF::STT_TLS)); 2013565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 2023565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 2033565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_ELF_TypeCommon: 20401a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne // TODO: Emit these as a common symbol. 20501a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne MCELF::SetType(SD, CombineSymbolTypes(MCELF::GetType(SD), 20601a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne ELF::STT_OBJECT)); 2073565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 2083565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 2093565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_ELF_TypeNoType: 21001a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne MCELF::SetType(SD, CombineSymbolTypes(MCELF::GetType(SD), 21101a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne ELF::STT_NOTYPE)); 2123565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 2133565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 2143565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_Protected: 2152ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin MCELF::SetVisibility(SD, ELF::STV_PROTECTED); 2163565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 2173565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 2183565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_Hidden: 2192ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin MCELF::SetVisibility(SD, ELF::STV_HIDDEN); 2203565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 2213565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 2223565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming case MCSA_Internal: 2232ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin MCELF::SetVisibility(SD, ELF::STV_INTERNAL); 2243565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming break; 2253565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming } 2261c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool 2271c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool return true; 2283565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming} 2293565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 2303565a06ebf44a193a8b333cbeff2ee154298d450Matt Flemingvoid MCELFStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, 2313565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming unsigned ByteAlignment) { 2323565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol); 2333565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 234f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola if (!BindingExplicitlySet.count(Symbol)) { 2352ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin MCELF::SetBinding(SD, ELF::STB_GLOBAL); 236f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola SD.setExternal(true); 237f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola } 238f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola 2392ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin MCELF::SetType(SD, ELF::STT_OBJECT); 24055d02f3a138badd5b1f96240b4d4b416d9026e2cRafael Espindola 2412ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin if (MCELF::GetBinding(SD) == ELF_STB_Local) { 2423565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming const MCSection *Section = getAssembler().getContext().getELFSection(".bss", 243946227d64afcc8cb3f4db94b6ee0cdb1aa55fa31Jim Grosbach ELF::SHT_NOBITS, 244946227d64afcc8cb3f4db94b6ee0cdb1aa55fa31Jim Grosbach ELF::SHF_WRITE | 245946227d64afcc8cb3f4db94b6ee0cdb1aa55fa31Jim Grosbach ELF::SHF_ALLOC, 246946227d64afcc8cb3f4db94b6ee0cdb1aa55fa31Jim Grosbach SectionKind::getBSS()); 2475cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 2485cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton AssignSection(Symbol, Section); 2491963572f9de87cd1ac5f16e504e27c3c26267e6fRafael Espindola 2509e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola struct LocalCommon L = {&SD, Size, ByteAlignment}; 2519e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola LocalCommons.push_back(L); 252f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola } else { 253f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola SD.setCommon(Size, ByteAlignment); 2543565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming } 2553565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 256f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola SD.setSize(MCConstantExpr::Create(Size, getContext())); 2573565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming} 2583565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 259645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) { 260645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol); 261645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien SD.setSize(Value); 262645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien} 263645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien 26436a16015ac108e2f0dd2d6d96a6d364bc74c50d7Benjamin Kramervoid MCELFStreamer::EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, 26536a16015ac108e2f0dd2d6d96a6d364bc74c50d7Benjamin Kramer unsigned ByteAlignment) { 266f13743bb3c3fb37a59b59f26056bc391bf0adcdcJason W Kim // FIXME: Should this be caught and done earlier? 267f13743bb3c3fb37a59b59f26056bc391bf0adcdcJason W Kim MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol); 2682ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin MCELF::SetBinding(SD, ELF::STB_LOCAL); 269f13743bb3c3fb37a59b59f26056bc391bf0adcdcJason W Kim SD.setExternal(false); 270f13743bb3c3fb37a59b59f26056bc391bf0adcdcJason W Kim BindingExplicitlySet.insert(Symbol); 27136a16015ac108e2f0dd2d6d96a6d364bc74c50d7Benjamin Kramer EmitCommonSymbol(Symbol, Size, ByteAlignment); 272f13743bb3c3fb37a59b59f26056bc391bf0adcdcJason W Kim} 273f13743bb3c3fb37a59b59f26056bc391bf0adcdcJason W Kim 274dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid MCELFStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size, 275dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const SMLoc &Loc) { 2764766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky if (getCurrentSectionData()->isBundleLocked()) 2774766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky report_fatal_error("Emitting values inside a locked bundle is forbidden"); 2785f7692604d44192206fbaf390085a95c9fb1a40bDavid Meyer fixSymbolsInTLSFixups(Value); 279dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCObjectStreamer::EmitValueImpl(Value, Size, Loc); 2805f7692604d44192206fbaf390085a95c9fb1a40bDavid Meyer} 2815f7692604d44192206fbaf390085a95c9fb1a40bDavid Meyer 2824766ef41b31e4f97bce1179c3b0398303bf65356Eli Benderskyvoid MCELFStreamer::EmitValueToAlignment(unsigned ByteAlignment, 2834766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky int64_t Value, 2844766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky unsigned ValueSize, 2854766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky unsigned MaxBytesToEmit) { 2864766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky if (getCurrentSectionData()->isBundleLocked()) 2874766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky report_fatal_error("Emitting values inside a locked bundle is forbidden"); 2884766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky MCObjectStreamer::EmitValueToAlignment(ByteAlignment, Value, 2894766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky ValueSize, MaxBytesToEmit); 2904766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky} 2914766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 29272580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger// Add a symbol for the file name of this module. They start after the 29372580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger// null symbol and don't count as normal symbol, i.e. a non-STT_FILE symbol 29472580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger// with the same name may appear. 2953565a06ebf44a193a8b333cbeff2ee154298d450Matt Flemingvoid MCELFStreamer::EmitFileDirective(StringRef Filename) { 29672580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger getAssembler().addFileName(Filename); 2973565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming} 2983565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 299c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindolavoid MCELFStreamer::EmitIdent(StringRef IdentString) { 300c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola const MCSection *Comment = getAssembler().getContext().getELFSection( 301c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola ".comment", ELF::SHT_PROGBITS, ELF::SHF_MERGE | ELF::SHF_STRINGS, 302c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola SectionKind::getReadOnly(), 1, ""); 303c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola PushSection(); 304c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola SwitchSection(Comment); 305c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola if (!SeenIdent) { 306c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola EmitIntValue(0, 1); 307c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola SeenIdent = true; 308c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola } 309c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola EmitBytes(IdentString); 310c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola EmitIntValue(0, 1); 311c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola PopSection(); 312c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola} 313c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola 314c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindolavoid MCELFStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) { 31597551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola switch (expr->getKind()) { 31672062f5744557e270a38192554c3126ea5f97434Tim Northover case MCExpr::Target: 31772062f5744557e270a38192554c3126ea5f97434Tim Northover cast<MCTargetExpr>(expr)->fixELFSymbolsInTLSFixups(getAssembler()); 31872062f5744557e270a38192554c3126ea5f97434Tim Northover break; 31997551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola case MCExpr::Constant: 32097551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola break; 32197551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola 32297551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola case MCExpr::Binary: { 32397551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola const MCBinaryExpr *be = cast<MCBinaryExpr>(expr); 32497551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola fixSymbolsInTLSFixups(be->getLHS()); 32597551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola fixSymbolsInTLSFixups(be->getRHS()); 32697551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola break; 32797551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola } 32897551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola 32997551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola case MCExpr::SymbolRef: { 33097551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola const MCSymbolRefExpr &symRef = *cast<MCSymbolRefExpr>(expr); 331bf8209daf875fa533a379290a91d01be5152597dRafael Espindola switch (symRef.getKind()) { 332bf8209daf875fa533a379290a91d01be5152597dRafael Espindola default: 33397551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola return; 334d02c8b6cc1d07bfe37fc055eefdac21b1c9303cbJoerg Sonnenberger case MCSymbolRefExpr::VK_GOTTPOFF: 335d02c8b6cc1d07bfe37fc055eefdac21b1c9303cbJoerg Sonnenberger case MCSymbolRefExpr::VK_INDNTPOFF: 336bf8209daf875fa533a379290a91d01be5152597dRafael Espindola case MCSymbolRefExpr::VK_NTPOFF: 337bf8209daf875fa533a379290a91d01be5152597dRafael Espindola case MCSymbolRefExpr::VK_GOTNTPOFF: 338bf8209daf875fa533a379290a91d01be5152597dRafael Espindola case MCSymbolRefExpr::VK_TLSGD: 339d02c8b6cc1d07bfe37fc055eefdac21b1c9303cbJoerg Sonnenberger case MCSymbolRefExpr::VK_TLSLD: 340bf8209daf875fa533a379290a91d01be5152597dRafael Espindola case MCSymbolRefExpr::VK_TLSLDM: 341bf8209daf875fa533a379290a91d01be5152597dRafael Espindola case MCSymbolRefExpr::VK_TPOFF: 342bf8209daf875fa533a379290a91d01be5152597dRafael Espindola case MCSymbolRefExpr::VK_DTPOFF: 3433507d24547ce668c9a50c72b6748c0a303e295c1Bruno Cardoso Lopes case MCSymbolRefExpr::VK_Mips_TLSGD: 3443507d24547ce668c9a50c72b6748c0a303e295c1Bruno Cardoso Lopes case MCSymbolRefExpr::VK_Mips_GOTTPREL: 3453507d24547ce668c9a50c72b6748c0a303e295c1Bruno Cardoso Lopes case MCSymbolRefExpr::VK_Mips_TPREL_HI: 3463507d24547ce668c9a50c72b6748c0a303e295c1Bruno Cardoso Lopes case MCSymbolRefExpr::VK_Mips_TPREL_LO: 347228e0afcfd0d5f167a95c6ddbec2c6a4a90b6d2bUlrich Weigand case MCSymbolRefExpr::VK_PPC_DTPMOD: 348cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_TPREL: 34992cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_TPREL_LO: 350cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_TPREL_HI: 35192cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_TPREL_HA: 352cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_TPREL_HIGHER: 353cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_TPREL_HIGHERA: 354cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_TPREL_HIGHEST: 355cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_TPREL_HIGHESTA: 356cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_DTPREL: 35792cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_DTPREL_LO: 358cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_DTPREL_HI: 35992cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_DTPREL_HA: 360cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHER: 361cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHERA: 362cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHEST: 363cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHESTA: 364cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TPREL: 36592cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO: 366cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HI: 36792cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HA: 368cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_DTPREL: 369cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_LO: 370cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HI: 371cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HA: 3723a42989d3ddfe30c6b87fe1f3d7f1164e0868a40Bill Schmidt case MCSymbolRefExpr::VK_PPC_TLS: 373cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TLSGD: 37492cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO: 375cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HI: 37692cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HA: 3777a34599db017a5486cf7cd11eb124984acec8286Ulrich Weigand case MCSymbolRefExpr::VK_PPC_TLSGD: 378cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TLSLD: 37992cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO: 380cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HI: 38192cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HA: 3827a34599db017a5486cf7cd11eb124984acec8286Ulrich Weigand case MCSymbolRefExpr::VK_PPC_TLSLD: 383bf8209daf875fa533a379290a91d01be5152597dRafael Espindola break; 384bf8209daf875fa533a379290a91d01be5152597dRafael Espindola } 38597551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola MCSymbolData &SD = getAssembler().getOrCreateSymbolData(symRef.getSymbol()); 3862ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin MCELF::SetType(SD, ELF::STT_TLS); 38797551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola break; 38897551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola } 38997551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola 39097551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola case MCExpr::Unary: 39197551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola fixSymbolsInTLSFixups(cast<MCUnaryExpr>(expr)->getSubExpr()); 39297551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola break; 39397551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola } 39497551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola} 39597551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola 39636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid MCELFStreamer::EmitInstToFragment(const MCInst &Inst, 39736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) { 39836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines this->MCObjectStreamer::EmitInstToFragment(Inst, STI); 399251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky MCRelaxableFragment &F = *cast<MCRelaxableFragment>(getCurrentFragment()); 4003565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 401dedb045c3296c831962c4ae101531c38c273ba89Rafael Espindola for (unsigned i = 0, e = F.getFixups().size(); i != e; ++i) 402dedb045c3296c831962c4ae101531c38c273ba89Rafael Espindola fixSymbolsInTLSFixups(F.getFixups()[i].getValue()); 40393ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer} 40493ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer 40536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid MCELFStreamer::EmitInstToData(const MCInst &Inst, 40636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) { 4074766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky MCAssembler &Assembler = getAssembler(); 4083565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming SmallVector<MCFixup, 4> Fixups; 4093565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming SmallString<256> Code; 4103565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming raw_svector_ostream VecOS(Code); 41136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Assembler.getEmitter().EncodeInstruction(Inst, VecOS, Fixups, STI); 4123565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming VecOS.flush(); 4133565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 41497551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola for (unsigned i = 0, e = Fixups.size(); i != e; ++i) 41597551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola fixSymbolsInTLSFixups(Fixups[i].getValue()); 41697551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola 4174766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // There are several possibilities here: 4184766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // 4194766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // If bundling is disabled, append the encoded instruction to the current data 4204766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // fragment (or create a new such fragment if the current fragment is not a 4214766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // data fragment). 4224766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // 4234766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // If bundling is enabled: 4249ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky // - If we're not in a bundle-locked group, emit the instruction into a 4259ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky // fragment of its own. If there are no fixups registered for the 4269ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky // instruction, emit a MCCompactEncodedInstFragment. Otherwise, emit a 4279ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky // MCDataFragment. 4284766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // - If we're in a bundle-locked group, append the instruction to the current 4294766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // data fragment because we want all the instructions in a group to get into 4304766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // the same fragment. Be careful not to do that for the first instruction in 4314766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // the group, though. 4324766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky MCDataFragment *DF; 4334766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 4344766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky if (Assembler.isBundlingEnabled()) { 4354766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky MCSectionData *SD = getCurrentSectionData(); 4364766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky if (SD->isBundleLocked() && !SD->isBundleGroupBeforeFirstInst()) 43767144e37ba5cd35ee917daac631e03963b05a674Derek Schuff // If we are bundle-locked, we re-use the current fragment. 43867144e37ba5cd35ee917daac631e03963b05a674Derek Schuff // The bundle-locking directive ensures this is a new data fragment. 43967144e37ba5cd35ee917daac631e03963b05a674Derek Schuff DF = cast<MCDataFragment>(getCurrentFragment()); 4409ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky else if (!SD->isBundleLocked() && Fixups.size() == 0) { 4419ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky // Optimize memory usage by emitting the instruction to a 4429ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky // MCCompactEncodedInstFragment when not in a bundle-locked group and 4439ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky // there are no fixups registered. 444df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne MCCompactEncodedInstFragment *CEIF = new MCCompactEncodedInstFragment(); 445df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne insert(CEIF); 4469ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky CEIF->getContents().append(Code.begin(), Code.end()); 4479ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky return; 44867144e37ba5cd35ee917daac631e03963b05a674Derek Schuff } else { 449df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne DF = new MCDataFragment(); 450df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne insert(DF); 4516c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky if (SD->getBundleLockState() == MCSectionData::BundleLockedAlignToEnd) { 4526c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky // If this is a new fragment created for a bundle-locked group, and the 4536c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky // group was marked as "align_to_end", set a flag in the fragment. 4546c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky DF->setAlignToBundleEnd(true); 4556c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky } 4566c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky } 4574766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 4584766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // We're now emitting an instruction in a bundle group, so this flag has 4594766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // to be turned off. 4604766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky SD->setBundleGroupBeforeFirstInst(false); 4614766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky } else { 4624766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky DF = getOrCreateDataFragment(); 4634766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky } 4644766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 46593ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer // Add the fixups and data. 4663565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming for (unsigned i = 0, e = Fixups.size(); i != e; ++i) { 46793ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer Fixups[i].setOffset(Fixups[i].getOffset() + DF->getContents().size()); 46864d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky DF->getFixups().push_back(Fixups[i]); 4693565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming } 4704766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky DF->setHasInstructions(true); 47193ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer DF->getContents().append(Code.begin(), Code.end()); 47293ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer} 4733565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 4744766ef41b31e4f97bce1179c3b0398303bf65356Eli Benderskyvoid MCELFStreamer::EmitBundleAlignMode(unsigned AlignPow2) { 4754766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky assert(AlignPow2 <= 30 && "Invalid bundle alignment"); 4764766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky MCAssembler &Assembler = getAssembler(); 4774766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky if (Assembler.getBundleAlignSize() == 0 && AlignPow2 > 0) 4784766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky Assembler.setBundleAlignSize(1 << AlignPow2); 4794766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky else 4804766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky report_fatal_error(".bundle_align_mode should be only set once per file"); 4814766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky} 4824766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 4836c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Benderskyvoid MCELFStreamer::EmitBundleLock(bool AlignToEnd) { 4844766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky MCSectionData *SD = getCurrentSectionData(); 4854766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 4864766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // Sanity checks 4874766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // 4884766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky if (!getAssembler().isBundlingEnabled()) 4894766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky report_fatal_error(".bundle_lock forbidden when bundling is disabled"); 4904766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky else if (SD->isBundleLocked()) 4914766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky report_fatal_error("Nesting of .bundle_lock is forbidden"); 4924766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 4936c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky SD->setBundleLockState(AlignToEnd ? MCSectionData::BundleLockedAlignToEnd : 4946c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky MCSectionData::BundleLocked); 4954766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky SD->setBundleGroupBeforeFirstInst(true); 4964766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky} 4974766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 4984766ef41b31e4f97bce1179c3b0398303bf65356Eli Benderskyvoid MCELFStreamer::EmitBundleUnlock() { 4994766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky MCSectionData *SD = getCurrentSectionData(); 5004766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 5014766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky // Sanity checks 5024766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky if (!getAssembler().isBundlingEnabled()) 5034766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky report_fatal_error(".bundle_unlock forbidden when bundling is disabled"); 5044766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky else if (!SD->isBundleLocked()) 5054766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky report_fatal_error(".bundle_unlock without matching lock"); 5064766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky else if (SD->isBundleGroupBeforeFirstInst()) 5074766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky report_fatal_error("Empty bundle-locked group is forbidden"); 5084766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 5096c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky SD->setBundleLockState(MCSectionData::NotBundleLocked); 5104766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky} 5114766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 5125cc319a42a914b24b164a94d9a563c728a7a4026Richard Mittonvoid MCELFStreamer::Flush() { 5139e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola for (std::vector<LocalCommon>::const_iterator i = LocalCommons.begin(), 5149e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola e = LocalCommons.end(); 5159e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola i != e; ++i) { 5169e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola MCSymbolData *SD = i->SD; 5179e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola uint64_t Size = i->Size; 5189e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola unsigned ByteAlignment = i->ByteAlignment; 5199e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola const MCSymbol &Symbol = SD->getSymbol(); 5209e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola const MCSection &Section = Symbol.getSection(); 5219e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola 5229e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola MCSectionData &SectData = getAssembler().getOrCreateSectionData(Section); 5239e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola new MCAlignFragment(ByteAlignment, 0, 1, ByteAlignment, &SectData); 5249e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola 5259e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola MCFragment *F = new MCFillFragment(0, 0, Size, &SectData); 5269e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola SD->setFragment(F); 5279e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola 5289e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola // Update the maximum alignment of the section if necessary. 5299e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola if (ByteAlignment > SectData.getAlignment()) 5309e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola SectData.setAlignment(ByteAlignment); 5319e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola } 5329e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola 5335cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton LocalCommons.clear(); 5345cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton} 5355cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 5365cc319a42a914b24b164a94d9a563c728a7a4026Richard Mittonvoid MCELFStreamer::FinishImpl() { 537dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines EmitFrames(nullptr); 5385cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 5395cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton Flush(); 5405cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 54199b4237c1647156f0e1d3d7e03efdab23ed79778Rafael Espindola this->MCObjectStreamer::FinishImpl(); 5423565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming} 5435cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 54436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesMCStreamer *llvm::createELFStreamer(MCContext &Context, MCAsmBackend &MAB, 54536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines raw_ostream &OS, MCCodeEmitter *CE, 54636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool RelaxAll, bool NoExecStack) { 54736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCELFStreamer *S = new MCELFStreamer(Context, MAB, OS, CE); 5483565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming if (RelaxAll) 5493565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming S->getAssembler().setRelaxAll(true); 55096aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola if (NoExecStack) 55196aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola S->getAssembler().setNoExecStack(true); 5523565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming return S; 5533565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming} 554645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien 5556eb3e87df04f8b035562d9865292c23f5b79f1a2Tim Northovervoid MCELFStreamer::EmitThumbFunc(MCSymbol *Func) { 5566eb3e87df04f8b035562d9865292c23f5b79f1a2Tim Northover llvm_unreachable("Generic ELF doesn't support this directive"); 5576eb3e87df04f8b035562d9865292c23f5b79f1a2Tim Northover} 5586eb3e87df04f8b035562d9865292c23f5b79f1a2Tim Northover 559645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) { 560645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien llvm_unreachable("ELF doesn't support this directive"); 561645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien} 562645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien 563645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::BeginCOFFSymbolDef(const MCSymbol *Symbol) { 564645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien llvm_unreachable("ELF doesn't support this directive"); 565645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien} 566645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien 567645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EmitCOFFSymbolStorageClass(int StorageClass) { 568645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien llvm_unreachable("ELF doesn't support this directive"); 569645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien} 570645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien 571645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EmitCOFFSymbolType(int Type) { 572645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien llvm_unreachable("ELF doesn't support this directive"); 573645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien} 574645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien 575645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EndCOFFSymbolDef() { 576645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien llvm_unreachable("ELF doesn't support this directive"); 577645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien} 578645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien 579645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EmitZerofill(const MCSection *Section, MCSymbol *Symbol, 580645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien uint64_t Size, unsigned ByteAlignment) { 581645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien llvm_unreachable("ELF doesn't support this directive"); 582645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien} 583645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien 584645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol, 585645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien uint64_t Size, unsigned ByteAlignment) { 586645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien llvm_unreachable("ELF doesn't support this directive"); 587645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien} 588