1fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//===- MCAssembler.h - Object File Generation -------------------*- C++ -*-===// 2fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// 3fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// The LLVM Compiler Infrastructure 4fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// 5fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// This file is distributed under the University of Illinois Open Source 6fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// License. See LICENSE.TXT for details. 7fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// 8fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//===----------------------------------------------------------------------===// 9fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 10fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#ifndef LLVM_MC_MCASSEMBLER_H 11fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#define LLVM_MC_MCASSEMBLER_H 12fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 1346836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar#include "llvm/ADT/DenseMap.h" 14475002078848d102b6577fe7283464c039b38af6Jim Grosbach#include "llvm/ADT/SmallPtrSet.h" 150705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar#include "llvm/ADT/SmallString.h" 16fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/ADT/ilist.h" 17fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/ADT/ilist_node.h" 1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCDirectives.h" 19255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/MC/MCFixup.h" 20255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/MC/MCInst.h" 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCLinkerOptimizationHint.h" 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCSubtargetInfo.h" 230705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar#include "llvm/Support/Casting.h" 241f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h" 2572580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger#include <algorithm> 260c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar#include <vector> // FIXME: Shouldn't be needed. 27fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 28fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarnamespace llvm { 29fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass raw_ostream; 30df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbarclass MCAsmLayout; 31fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCAssembler; 32a03a368acca1c5ea7eb7de7a4164cbd22308c82fDaniel Dunbarclass MCContext; 33cf871e5abff63a53f9e97ff9e37fb7297d0cb847Daniel Dunbarclass MCCodeEmitter; 341253a6fa3b0d79dc6ea25f2578f6473219d40047Daniel Dunbarclass MCExpr; 3527ade18431a3504b412e6359e80c9b88e3b0f932Daniel Dunbarclass MCFragment; 3653b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbarclass MCObjectWriter; 37fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCSection; 38fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCSectionData; 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass MCSubtargetInfo; 401253a6fa3b0d79dc6ea25f2578f6473219d40047Daniel Dunbarclass MCSymbol; 41071f73db4a0c3f7f00ef14d38af17f3c8d69827aDaniel Dunbarclass MCSymbolData; 42df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbarclass MCValue; 4378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Chengclass MCAsmBackend; 44fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 45fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCFragment : public ilist_node<MCFragment> { 467c3d45a03e64ac1b5b2ecdb7153989fd7cebfd2cDaniel Dunbar friend class MCAsmLayout; 477c3d45a03e64ac1b5b2ecdb7153989fd7cebfd2cDaniel Dunbar 481f7210e808373fa92be3a2d4fa653a6f79d5088bCraig Topper MCFragment(const MCFragment&) LLVM_DELETED_FUNCTION; 491f7210e808373fa92be3a2d4fa653a6f79d5088bCraig Topper void operator=(const MCFragment&) LLVM_DELETED_FUNCTION; 50fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 51fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarpublic: 520705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar enum FragmentType { 530705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar FT_Align, 543f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar FT_Data, 559ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky FT_CompactEncodedInst, 560705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar FT_Fill, 57251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky FT_Relaxable, 583bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby FT_Org, 593ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola FT_Dwarf, 60245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola FT_DwarfFrame, 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FT_LEB 620705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar }; 630705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 64014bc6e3ceac59ea7d1d435cfb88642157c5270cTDYaprivate: 650705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar FragmentType Kind; 660705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 675e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar /// Parent - The data for the section this fragment is in. 685e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar MCSectionData *Parent; 695e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar 70071f73db4a0c3f7f00ef14d38af17f3c8d69827aDaniel Dunbar /// Atom - The atom this fragment is in, as represented by it's defining 7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// symbol. 72071f73db4a0c3f7f00ef14d38af17f3c8d69827aDaniel Dunbar MCSymbolData *Atom; 73071f73db4a0c3f7f00ef14d38af17f3c8d69827aDaniel Dunbar 740705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// @name Assembler Backend Data 750705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// @{ 760705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar // 770705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar // FIXME: This could all be kept private to the assembler implementation. 780705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 79a5441fea1f5d4f86d6211af16dbf7d190f2a3c83Daniel Dunbar /// Offset - The offset of this fragment in its section. This is ~0 until 800705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// initialized. 81a5441fea1f5d4f86d6211af16dbf7d190f2a3c83Daniel Dunbar uint64_t Offset; 82a5441fea1f5d4f86d6211af16dbf7d190f2a3c83Daniel Dunbar 834f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola /// LayoutOrder - The layout order of this fragment. 84337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar unsigned LayoutOrder; 855a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar 860705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// @} 870705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 880705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarprotected: 89dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCFragment(FragmentType _Kind, MCSectionData *_Parent = nullptr); 900705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 910705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarpublic: 920705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar // Only for sentinel. 930705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar MCFragment(); 9436880e704f63d4c77a3c5a94047b5afdf79e82dbDaniel Dunbar virtual ~MCFragment(); 950705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 960705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar FragmentType getKind() const { return Kind; } 970705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 985e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar MCSectionData *getParent() const { return Parent; } 995e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar void setParent(MCSectionData *Value) { Parent = Value; } 1005e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar 101071f73db4a0c3f7f00ef14d38af17f3c8d69827aDaniel Dunbar MCSymbolData *getAtom() const { return Atom; } 102071f73db4a0c3f7f00ef14d38af17f3c8d69827aDaniel Dunbar void setAtom(MCSymbolData *Value) { Atom = Value; } 103071f73db4a0c3f7f00ef14d38af17f3c8d69827aDaniel Dunbar 104337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar unsigned getLayoutOrder() const { return LayoutOrder; } 105337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar void setLayoutOrder(unsigned Value) { LayoutOrder = Value; } 1065a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar 1074766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky /// \brief Does this fragment have instructions emitted into it? By default 1086c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky /// this is false, but specific fragment types may set it to true. 1094766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky virtual bool hasInstructions() const { return false; } 1104766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 1116c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky /// \brief Should this fragment be placed at the end of an aligned bundle? 1126c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky virtual bool alignToBundleEnd() const { return false; } 1139ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky virtual void setAlignToBundleEnd(bool V) { } 1146c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky 1154766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky /// \brief Get the padding size that must be inserted before this fragment. 1164766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky /// Used for bundling. By default, no padding is inserted. 1174766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky /// Note that padding size is restricted to 8 bits. This is an optimization 1184766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky /// to reduce the amount of space used for each fragment. In practice, larger 1194766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky /// padding should never be required. 1204766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky virtual uint8_t getBundlePadding() const { 1214766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky return 0; 1224766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky } 1234766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 1244766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky /// \brief Set the padding size for this fragment. By default it's a no-op, 1254766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky /// and only some fragments have a meaningful implementation. 1264766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky virtual void setBundlePadding(uint8_t N) { 1274766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky } 128b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar 129e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar void dump(); 1300705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}; 1310705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 1329ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky/// Interface implemented by fragments that contain encoded instructions and/or 1339ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky/// data. 1349ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky/// 13564d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Benderskyclass MCEncodedFragment : public MCFragment { 1362d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 1370bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar 1384766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky uint8_t BundlePadding; 1390bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbarpublic: 140dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCEncodedFragment(MCFragment::FragmentType FType, MCSectionData *SD = nullptr) 1414766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky : MCFragment(FType, SD), BundlePadding(0) 1424766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky { 14364d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky } 14464d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky virtual ~MCEncodedFragment(); 1450bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar 146550f0ade457c3b042fa099ecff2c022c7ab58b1eEli Bendersky virtual SmallVectorImpl<char> &getContents() = 0; 147550f0ade457c3b042fa099ecff2c022c7ab58b1eEli Bendersky virtual const SmallVectorImpl<char> &getContents() const = 0; 1480705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 14936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint8_t getBundlePadding() const override { 1504766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky return BundlePadding; 1514766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky } 1520bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar 15336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void setBundlePadding(uint8_t N) override { 1544766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky BundlePadding = N; 1558315a357e48f2eeb4fa929168d3cb65924d9893eDaniel Dunbar } 1568315a357e48f2eeb4fa929168d3cb65924d9893eDaniel Dunbar 15764d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky static bool classof(const MCFragment *F) { 15864d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky MCFragment::FragmentType Kind = F->getKind(); 1599ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky switch (Kind) { 1609ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky default: 1619ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky return false; 1629ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky case MCFragment::FT_Relaxable: 1639ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky case MCFragment::FT_CompactEncodedInst: 1649ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky case MCFragment::FT_Data: 1659ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky return true; 1669ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky } 1679ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky } 1689ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky}; 1699ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky 1709ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky/// Interface implemented by fragments that contain encoded instructions and/or 1719ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky/// data and also have fixups registered. 1729ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky/// 1739ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Benderskyclass MCEncodedFragmentWithFixups : public MCEncodedFragment { 17436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void anchor() override; 1759ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky 1769ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Benderskypublic: 1779ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky MCEncodedFragmentWithFixups(MCFragment::FragmentType FType, 178dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSectionData *SD = nullptr) 1799ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky : MCEncodedFragment(FType, SD) 1809ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky { 1819ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky } 1829ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky 1839ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky virtual ~MCEncodedFragmentWithFixups(); 1849ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky 1859ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky typedef SmallVectorImpl<MCFixup>::const_iterator const_fixup_iterator; 1869ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky typedef SmallVectorImpl<MCFixup>::iterator fixup_iterator; 1879ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky 1889ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky virtual SmallVectorImpl<MCFixup> &getFixups() = 0; 1899ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky virtual const SmallVectorImpl<MCFixup> &getFixups() const = 0; 1909ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky 1919ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky virtual fixup_iterator fixup_begin() = 0; 1929ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky virtual const_fixup_iterator fixup_begin() const = 0; 1939ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky virtual fixup_iterator fixup_end() = 0; 1949ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky virtual const_fixup_iterator fixup_end() const = 0; 1959ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky 1969ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky static bool classof(const MCFragment *F) { 1976a3cbc35a75468d565385a0db8e7051478f383f4Eli Bendersky MCFragment::FragmentType Kind = F->getKind(); 198dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return Kind == MCFragment::FT_Relaxable || Kind == MCFragment::FT_Data; 19964d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky } 20064d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky}; 20164d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky 202251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky/// Fragment for data and encoded instructions. 203251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky/// 2049ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Benderskyclass MCDataFragment : public MCEncodedFragmentWithFixups { 20536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void anchor() override; 2064766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 2074766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky /// \brief Does this fragment contain encoded instructions anywhere in it? 2084766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky bool HasInstructions; 2094766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 2106c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky /// \brief Should this fragment be aligned to the end of a bundle? 2116c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky bool AlignToBundleEnd; 2126c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky 213550f0ade457c3b042fa099ecff2c022c7ab58b1eEli Bendersky SmallVector<char, 32> Contents; 2140705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 2150bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar /// Fixups - The list of fixups in this fragment. 2165c10f509f45820d1198bfb975840e93a782745acEli Bendersky SmallVector<MCFixup, 4> Fixups; 2170bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbarpublic: 218dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCDataFragment(MCSectionData *SD = nullptr) 2199ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky : MCEncodedFragmentWithFixups(FT_Data, SD), 2206c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky HasInstructions(false), AlignToBundleEnd(false) 2214766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky { 22264d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky } 2230705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 22436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<char> &getContents() override { return Contents; } 22536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const SmallVectorImpl<char> &getContents() const override { 22636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Contents; 22736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 2280705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 22936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MCFixup> &getFixups() override { 23064d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky return Fixups; 23164d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky } 2320bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar 23336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const SmallVectorImpl<MCFixup> &getFixups() const override { 23464d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky return Fixups; 2358315a357e48f2eeb4fa929168d3cb65924d9893eDaniel Dunbar } 2368315a357e48f2eeb4fa929168d3cb65924d9893eDaniel Dunbar 23736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool hasInstructions() const override { return HasInstructions; } 2384766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky virtual void setHasInstructions(bool V) { HasInstructions = V; } 2394766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 24036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool alignToBundleEnd() const override { return AlignToBundleEnd; } 24136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void setAlignToBundleEnd(bool V) override { AlignToBundleEnd = V; } 2420bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar 24336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines fixup_iterator fixup_begin() override { return Fixups.begin(); } 24436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const_fixup_iterator fixup_begin() const override { return Fixups.begin(); } 2450bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar 24636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines fixup_iterator fixup_end() override {return Fixups.end();} 24736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const_fixup_iterator fixup_end() const override {return Fixups.end();} 2480bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar 249b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar static bool classof(const MCFragment *F) { 250dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return F->getKind() == MCFragment::FT_Data; 2510705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar } 2520705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}; 2530705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 2549ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky/// This is a compact (memory-size-wise) fragment for holding an encoded 2559ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky/// instruction (non-relaxable) that has no fixups registered. When applicable, 2569ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky/// it can be used instead of MCDataFragment and lead to lower memory 2579ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky/// consumption. 2589ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky/// 2599ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Benderskyclass MCCompactEncodedInstFragment : public MCEncodedFragment { 26036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void anchor() override; 2619ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky 2629ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky /// \brief Should this fragment be aligned to the end of a bundle? 2639ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky bool AlignToBundleEnd; 2649ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky 2659ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky SmallVector<char, 4> Contents; 2669ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Benderskypublic: 267dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCCompactEncodedInstFragment(MCSectionData *SD = nullptr) 2689ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky : MCEncodedFragment(FT_CompactEncodedInst, SD), AlignToBundleEnd(false) 2699ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky { 2709ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky } 2719ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky 27236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool hasInstructions() const override { 2739ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky return true; 2749ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky } 2759ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky 27636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<char> &getContents() override { return Contents; } 27736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const SmallVectorImpl<char> &getContents() const override { return Contents; } 2789ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky 27936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool alignToBundleEnd() const override { return AlignToBundleEnd; } 28036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void setAlignToBundleEnd(bool V) override { AlignToBundleEnd = V; } 2819ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky 2829ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky static bool classof(const MCFragment *F) { 2839ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky return F->getKind() == MCFragment::FT_CompactEncodedInst; 2849ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky } 2859ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky}; 2869ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky 287251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky/// A relaxable fragment holds on to its MCInst, since it may need to be 288251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky/// relaxed during the assembler layout and relaxation stage. 289251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky/// 2909ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Benderskyclass MCRelaxableFragment : public MCEncodedFragmentWithFixups { 29136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void anchor() override; 2922d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 2933f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar /// Inst - The instruction this is a fragment for. 2943f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar MCInst Inst; 2953f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar 29636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// STI - The MCSubtargetInfo in effect when the instruction was encoded. 29736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Keep a copy instead of a reference to make sure that updates to STI 29836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// in the assembler are not seen here. 29936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo STI; 30036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 30164d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky /// Contents - Binary data for the currently encoded instruction. 302550f0ade457c3b042fa099ecff2c022c7ab58b1eEli Bendersky SmallVector<char, 8> Contents; 3039799de910e97879bf9f30f359551071a94d61570Daniel Dunbar 3049799de910e97879bf9f30f359551071a94d61570Daniel Dunbar /// Fixups - The list of fixups in this fragment. 305c90e30aa6f3792a460202017523171f435e2ba34Daniel Dunbar SmallVector<MCFixup, 1> Fixups; 3063f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar 3073f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbarpublic: 30836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCRelaxableFragment(const MCInst &_Inst, 30936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &_STI, 310dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSectionData *SD = nullptr) 31136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : MCEncodedFragmentWithFixups(FT_Relaxable, SD), Inst(_Inst), STI(_STI) { 3129799de910e97879bf9f30f359551071a94d61570Daniel Dunbar } 3133f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar 31436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<char> &getContents() override { return Contents; } 31536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const SmallVectorImpl<char> &getContents() const override { return Contents; } 3169799de910e97879bf9f30f359551071a94d61570Daniel Dunbar 3173f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar const MCInst &getInst() const { return Inst; } 3181df46c36b6142d50acfa21063a6e682e7f055e8eLang Hames void setInst(const MCInst& Value) { Inst = Value; } 3199799de910e97879bf9f30f359551071a94d61570Daniel Dunbar 32036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &getSubtargetInfo() { return STI; } 32136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 32236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MCFixup> &getFixups() override { 32364d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky return Fixups; 32464d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky } 3259799de910e97879bf9f30f359551071a94d61570Daniel Dunbar 32636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const SmallVectorImpl<MCFixup> &getFixups() const override { 32764d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky return Fixups; 32864d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky } 3299799de910e97879bf9f30f359551071a94d61570Daniel Dunbar 33036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool hasInstructions() const override { return true; } 3319799de910e97879bf9f30f359551071a94d61570Daniel Dunbar 33236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines fixup_iterator fixup_begin() override { return Fixups.begin(); } 33336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const_fixup_iterator fixup_begin() const override { return Fixups.begin(); } 3349799de910e97879bf9f30f359551071a94d61570Daniel Dunbar 33536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines fixup_iterator fixup_end() override {return Fixups.end();} 33636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const_fixup_iterator fixup_end() const override {return Fixups.end();} 3379799de910e97879bf9f30f359551071a94d61570Daniel Dunbar 3383f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar static bool classof(const MCFragment *F) { 339251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky return F->getKind() == MCFragment::FT_Relaxable; 3403f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar } 3413f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar}; 3423f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar 3430705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarclass MCAlignFragment : public MCFragment { 3442d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 3452d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 3460705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// Alignment - The alignment to ensure, in bytes. 3470705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar unsigned Alignment; 3480705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 3490705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// Value - Value to use for filling padding bytes. 3500705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar int64_t Value; 3510705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 352c5252da873d547a19069eaf9030fec203f128f66Dmitri Gribenko /// ValueSize - The size of the integer (in bytes) of \p Value. 3530705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar unsigned ValueSize; 3540705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 3550705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// MaxBytesToEmit - The maximum number of bytes to emit; if the alignment 3560705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// cannot be satisfied in this width then this fragment is ignored. 3570705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar unsigned MaxBytesToEmit; 3580705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 3591c15413ebc8f4a35545a381a789a718627396d03Daniel Dunbar /// EmitNops - Flag to indicate that (optimal) NOPs should be emitted instead 3601c15413ebc8f4a35545a381a789a718627396d03Daniel Dunbar /// of using the provided value. The exact interpretation of this flag is 3611c15413ebc8f4a35545a381a789a718627396d03Daniel Dunbar /// target dependent. 3621c15413ebc8f4a35545a381a789a718627396d03Daniel Dunbar bool EmitNops : 1; 3636e72048add2a6464e038121c6c275da37528aa0aKevin Enderby 3640705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarpublic: 3650705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar MCAlignFragment(unsigned _Alignment, int64_t _Value, unsigned _ValueSize, 366dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned _MaxBytesToEmit, MCSectionData *SD = nullptr) 3670705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar : MCFragment(FT_Align, SD), Alignment(_Alignment), 3680705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar Value(_Value),ValueSize(_ValueSize), 3697a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola MaxBytesToEmit(_MaxBytesToEmit), EmitNops(false) {} 3700705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 3710705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// @name Accessors 3720705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// @{ 3730705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 3740705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar unsigned getAlignment() const { return Alignment; } 375b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar 3760705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar int64_t getValue() const { return Value; } 3770705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 3780705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar unsigned getValueSize() const { return ValueSize; } 3790705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 3800705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar unsigned getMaxBytesToEmit() const { return MaxBytesToEmit; } 3810705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 3821c15413ebc8f4a35545a381a789a718627396d03Daniel Dunbar bool hasEmitNops() const { return EmitNops; } 3831c15413ebc8f4a35545a381a789a718627396d03Daniel Dunbar void setEmitNops(bool Value) { EmitNops = Value; } 3846e72048add2a6464e038121c6c275da37528aa0aKevin Enderby 3850705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// @} 3860705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 387b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar static bool classof(const MCFragment *F) { 388b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar return F->getKind() == MCFragment::FT_Align; 3890705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar } 3900705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}; 3910705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 3920705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarclass MCFillFragment : public MCFragment { 3932d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 3942d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 3950705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// Value - Value to use for filling bytes. 396a4766d7af91b7e25151b3e97a0831b3615d2abc3Daniel Dunbar int64_t Value; 3970705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 398c5252da873d547a19069eaf9030fec203f128f66Dmitri Gribenko /// ValueSize - The size (in bytes) of \p Value to use when filling, or 0 if 3993153fec733acd079a9e681d16d39253b9517e02cDaniel Dunbar /// this is a virtual fill fragment. 4000705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar unsigned ValueSize; 4010705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 4023153fec733acd079a9e681d16d39253b9517e02cDaniel Dunbar /// Size - The number of bytes to insert. 4033153fec733acd079a9e681d16d39253b9517e02cDaniel Dunbar uint64_t Size; 4040705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 4050705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarpublic: 4063153fec733acd079a9e681d16d39253b9517e02cDaniel Dunbar MCFillFragment(int64_t _Value, unsigned _ValueSize, uint64_t _Size, 407dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSectionData *SD = nullptr) 4080705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar : MCFragment(FT_Fill, SD), 4093153fec733acd079a9e681d16d39253b9517e02cDaniel Dunbar Value(_Value), ValueSize(_ValueSize), Size(_Size) { 4103153fec733acd079a9e681d16d39253b9517e02cDaniel Dunbar assert((!ValueSize || (Size % ValueSize) == 0) && 4113153fec733acd079a9e681d16d39253b9517e02cDaniel Dunbar "Fill size must be a multiple of the value size!"); 4123153fec733acd079a9e681d16d39253b9517e02cDaniel Dunbar } 4130705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 4140705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// @name Accessors 4150705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// @{ 4160705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 417a4766d7af91b7e25151b3e97a0831b3615d2abc3Daniel Dunbar int64_t getValue() const { return Value; } 418b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar 4190705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar unsigned getValueSize() const { return ValueSize; } 4200705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 4213153fec733acd079a9e681d16d39253b9517e02cDaniel Dunbar uint64_t getSize() const { return Size; } 4220705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 4230705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// @} 4240705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 425b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar static bool classof(const MCFragment *F) { 426b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar return F->getKind() == MCFragment::FT_Fill; 4270705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar } 4280705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}; 4290705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 4300705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarclass MCOrgFragment : public MCFragment { 4312d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 4322d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 4330705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// Offset - The offset this fragment should start at. 4341253a6fa3b0d79dc6ea25f2578f6473219d40047Daniel Dunbar const MCExpr *Offset; 4350705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 436b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar /// Value - Value to use for filling bytes. 437d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar int8_t Value; 4380705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 4390705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarpublic: 440dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCOrgFragment(const MCExpr &_Offset, int8_t _Value, 441dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSectionData *SD = nullptr) 4420705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar : MCFragment(FT_Org, SD), 4437a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola Offset(&_Offset), Value(_Value) {} 444d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar 4450705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// @name Accessors 4460705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// @{ 4470705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 4481253a6fa3b0d79dc6ea25f2578f6473219d40047Daniel Dunbar const MCExpr &getOffset() const { return *Offset; } 449b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar 450d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar uint8_t getValue() const { return Value; } 4510705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 4520705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// @} 4530705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 454b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar static bool classof(const MCFragment *F) { 455b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar return F->getKind() == MCFragment::FT_Org; 4560705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar } 457fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}; 458fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 4593ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindolaclass MCLEBFragment : public MCFragment { 4602d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 4612d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 4623ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola /// Value - The value this fragment should contain. 4633ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola const MCExpr *Value; 4643ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola 4653ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola /// IsSigned - True if this is a sleb128, false if uleb128. 4663ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola bool IsSigned; 4673ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola 468db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola SmallString<8> Contents; 4693ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindolapublic: 470dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCLEBFragment(const MCExpr &Value_, bool IsSigned_, 471dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSectionData *SD = nullptr) 4723ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola : MCFragment(FT_LEB, SD), 473db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola Value(&Value_), IsSigned(IsSigned_) { Contents.push_back(0); } 4743ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola 4753ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola /// @name Accessors 4763ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola /// @{ 4773ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola 4783ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola const MCExpr &getValue() const { return *Value; } 4793ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola 4803ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola bool isSigned() const { return IsSigned; } 4813ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola 482db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola SmallString<8> &getContents() { return Contents; } 483db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola const SmallString<8> &getContents() const { return Contents; } 4843ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola 4853ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola /// @} 4863ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola 4873ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola static bool classof(const MCFragment *F) { 4883ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola return F->getKind() == MCFragment::FT_LEB; 4893ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola } 4903ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola}; 4913ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola 4923bb435301a2b5c901a993b0e151d05b596697038Kevin Enderbyclass MCDwarfLineAddrFragment : public MCFragment { 4932d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 4942d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 4953bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby /// LineDelta - the value of the difference between the two line numbers 4963bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby /// between two .loc dwarf directives. 4973bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby int64_t LineDelta; 4983bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby 4993bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby /// AddrDelta - The expression for the difference of the two symbols that 5003bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby /// make up the address delta between two .loc dwarf directives. 5013bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby const MCExpr *AddrDelta; 5023bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby 503db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola SmallString<8> Contents; 504187d8339dbc0530850e54a86edf36f1a865a5823Rafael Espindola 5053bb435301a2b5c901a993b0e151d05b596697038Kevin Enderbypublic: 5063bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby MCDwarfLineAddrFragment(int64_t _LineDelta, const MCExpr &_AddrDelta, 507dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSectionData *SD = nullptr) 5083bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby : MCFragment(FT_Dwarf, SD), 509db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola LineDelta(_LineDelta), AddrDelta(&_AddrDelta) { Contents.push_back(0); } 5103bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby 5113bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby /// @name Accessors 5123bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby /// @{ 5133bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby 5143bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby int64_t getLineDelta() const { return LineDelta; } 5153bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby 5163bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby const MCExpr &getAddrDelta() const { return *AddrDelta; } 5173bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby 518db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola SmallString<8> &getContents() { return Contents; } 519db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola const SmallString<8> &getContents() const { return Contents; } 520187d8339dbc0530850e54a86edf36f1a865a5823Rafael Espindola 5213bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby /// @} 5223bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby 5233bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby static bool classof(const MCFragment *F) { 5243bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby return F->getKind() == MCFragment::FT_Dwarf; 5253bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby } 5263bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby}; 5273bb435301a2b5c901a993b0e151d05b596697038Kevin Enderby 528245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindolaclass MCDwarfCallFrameFragment : public MCFragment { 5292d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 5302d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 531245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola /// AddrDelta - The expression for the difference of the two symbols that 532245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola /// make up the address delta between two .cfi_* dwarf directives. 533245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola const MCExpr *AddrDelta; 534245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola 535245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola SmallString<8> Contents; 536245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola 537245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindolapublic: 538dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCDwarfCallFrameFragment(const MCExpr &_AddrDelta, 539dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSectionData *SD = nullptr) 540245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola : MCFragment(FT_DwarfFrame, SD), 541245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola AddrDelta(&_AddrDelta) { Contents.push_back(0); } 542245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola 543245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola /// @name Accessors 544245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola /// @{ 545245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola 546245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola const MCExpr &getAddrDelta() const { return *AddrDelta; } 547245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola 548245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola SmallString<8> &getContents() { return Contents; } 549245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola const SmallString<8> &getContents() const { return Contents; } 550245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola 551245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola /// @} 552245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola 553245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola static bool classof(const MCFragment *F) { 554245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola return F->getKind() == MCFragment::FT_DwarfFrame; 555245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola } 556245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola}; 557245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola 558fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// FIXME: Should this be a separate class, or just merged into MCSection? Since 559fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// we anticipate the fast path being through an MCAssembler, the only reason to 560fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// keep it out is for API abstraction. 561fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCSectionData : public ilist_node<MCSectionData> { 5627c3d45a03e64ac1b5b2ecdb7153989fd7cebfd2cDaniel Dunbar friend class MCAsmLayout; 5637c3d45a03e64ac1b5b2ecdb7153989fd7cebfd2cDaniel Dunbar 56409bc9373f29b56d69ac3160446f25fc8020b3c16Craig Topper MCSectionData(const MCSectionData&) LLVM_DELETED_FUNCTION; 56509bc9373f29b56d69ac3160446f25fc8020b3c16Craig Topper void operator=(const MCSectionData&) LLVM_DELETED_FUNCTION; 566fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 567fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarpublic: 568fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar typedef iplist<MCFragment> FragmentListType; 569fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 5700705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar typedef FragmentListType::const_iterator const_iterator; 5710705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar typedef FragmentListType::iterator iterator; 5720705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 573cb7d743b4242345fa1081223b021b1504dce6fb7Daniel Dunbar typedef FragmentListType::const_reverse_iterator const_reverse_iterator; 574cb7d743b4242345fa1081223b021b1504dce6fb7Daniel Dunbar typedef FragmentListType::reverse_iterator reverse_iterator; 5753f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar 5766c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky /// \brief Express the state of bundle locked groups while emitting code. 5776c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky enum BundleLockStateType { 5786c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky NotBundleLocked, 5796c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky BundleLocked, 5806c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky BundleLockedAlignToEnd 5816c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky }; 582014bc6e3ceac59ea7d1d435cfb88642157c5270cTDYaprivate: 583a838bae1863b463c07056c086ab7c23faa9759e7Chris Lattner FragmentListType Fragments; 58481e400092f55c2eba157172bfc0dd0df8317638dDaniel Dunbar const MCSection *Section; 585fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 5865a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar /// Ordinal - The section index in the assemblers section list. 5875a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar unsigned Ordinal; 5885a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar 589f60c736c64d6c9d683df1cead3631958359c14f1Daniel Dunbar /// LayoutOrder - The index of this section in the layout order. 590f60c736c64d6c9d683df1cead3631958359c14f1Daniel Dunbar unsigned LayoutOrder; 591f60c736c64d6c9d683df1cead3631958359c14f1Daniel Dunbar 592fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// Alignment - The maximum alignment seen in this section. 593fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar unsigned Alignment; 594fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 5956c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky /// \brief Keeping track of bundle-locked state. 5966c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky BundleLockStateType BundleLockState; 5974766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 5984766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky /// \brief We've seen a bundle_lock directive but not its first instruction 5994766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky /// yet. 6004766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky bool BundleGroupBeforeFirstInst; 6014766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 602fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// @name Assembler Backend Data 603fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// @{ 604fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar // 605fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar // FIXME: This could all be kept private to the assembler implementation. 606fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 607e1ec617c6abf0b9dc1eecbbfe483bda3bb2b7795Daniel Dunbar /// HasInstructions - Whether this section has had instructions emitted into 608e1ec617c6abf0b9dc1eecbbfe483bda3bb2b7795Daniel Dunbar /// it. 609e1ec617c6abf0b9dc1eecbbfe483bda3bb2b7795Daniel Dunbar unsigned HasInstructions : 1; 610e1ec617c6abf0b9dc1eecbbfe483bda3bb2b7795Daniel Dunbar 611df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne /// Mapping from subsection number to insertion point for subsection numbers 612df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne /// below that number. 613df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne SmallVector<std::pair<unsigned, MCFragment *>, 1> SubsectionFragmentMap; 614df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne 615fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// @} 616fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 617b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarpublic: 618fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar // Only for use as sentinel. 619fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar MCSectionData(); 620dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSectionData(const MCSection &Section, MCAssembler *A = nullptr); 621fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 62281e400092f55c2eba157172bfc0dd0df8317638dDaniel Dunbar const MCSection &getSection() const { return *Section; } 623fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 624fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar unsigned getAlignment() const { return Alignment; } 625fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar void setAlignment(unsigned Value) { Alignment = Value; } 626fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 6275d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar bool hasInstructions() const { return HasInstructions; } 6285d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar void setHasInstructions(bool Value) { HasInstructions = Value; } 6295d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar 6305a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar unsigned getOrdinal() const { return Ordinal; } 6315a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar void setOrdinal(unsigned Value) { Ordinal = Value; } 6325a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar 633f60c736c64d6c9d683df1cead3631958359c14f1Daniel Dunbar unsigned getLayoutOrder() const { return LayoutOrder; } 634f60c736c64d6c9d683df1cead3631958359c14f1Daniel Dunbar void setLayoutOrder(unsigned Value) { LayoutOrder = Value; } 635f60c736c64d6c9d683df1cead3631958359c14f1Daniel Dunbar 636be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar /// @name Fragment Access 6370705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar /// @{ 6380705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 6390705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar const FragmentListType &getFragmentList() const { return Fragments; } 6400705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar FragmentListType &getFragmentList() { return Fragments; } 6410705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 6420705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar iterator begin() { return Fragments.begin(); } 6430705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar const_iterator begin() const { return Fragments.begin(); } 6440705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 6450705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar iterator end() { return Fragments.end(); } 6460705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar const_iterator end() const { return Fragments.end(); } 6470705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 648cb7d743b4242345fa1081223b021b1504dce6fb7Daniel Dunbar reverse_iterator rbegin() { return Fragments.rbegin(); } 649cb7d743b4242345fa1081223b021b1504dce6fb7Daniel Dunbar const_reverse_iterator rbegin() const { return Fragments.rbegin(); } 6503f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar 651cb7d743b4242345fa1081223b021b1504dce6fb7Daniel Dunbar reverse_iterator rend() { return Fragments.rend(); } 652cb7d743b4242345fa1081223b021b1504dce6fb7Daniel Dunbar const_reverse_iterator rend() const { return Fragments.rend(); } 6533f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar 654cb7d743b4242345fa1081223b021b1504dce6fb7Daniel Dunbar size_t size() const { return Fragments.size(); } 6553f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar 656cb7d743b4242345fa1081223b021b1504dce6fb7Daniel Dunbar bool empty() const { return Fragments.empty(); } 6573f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar 658df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne iterator getSubsectionInsertionPoint(unsigned Subsection); 659df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne 6604766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky bool isBundleLocked() const { 6616c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky return BundleLockState != NotBundleLocked; 6626c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky } 6636c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky 6646c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky BundleLockStateType getBundleLockState() const { 6656c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky return BundleLockState; 6664766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky } 6674766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 6686c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky void setBundleLockState(BundleLockStateType NewState) { 6696c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky BundleLockState = NewState; 6704766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky } 6714766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 6724766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky bool isBundleGroupBeforeFirstInst() const { 6734766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky return BundleGroupBeforeFirstInst; 6744766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky } 6754766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 6764766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky void setBundleGroupBeforeFirstInst(bool IsFirst) { 6774766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky BundleGroupBeforeFirstInst = IsFirst; 6784766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky } 6794766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 680b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar void dump(); 6815a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar 6825a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar /// @} 683fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}; 684fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 685f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar// FIXME: Same concerns as with SectionData. 686f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbarclass MCSymbolData : public ilist_node<MCSymbolData> { 687f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbarpublic: 688efbb5330b8d383a393c83d2da5d631c98b0bb3fdDaniel Dunbar const MCSymbol *Symbol; 689f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar 690f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar /// Fragment - The fragment this symbol's value is relative to, if any. 691f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar MCFragment *Fragment; 692f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar 693f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar /// Offset - The offset to apply to the fragment address to form this symbol's 694f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar /// value. 695f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar uint64_t Offset; 696b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar 6973edd9bb7a3da8526eb2f4a5dae2962a987d3d566Daniel Dunbar /// IsExternal - True if this symbol is visible outside this translation 6983edd9bb7a3da8526eb2f4a5dae2962a987d3d566Daniel Dunbar /// unit. 6993edd9bb7a3da8526eb2f4a5dae2962a987d3d566Daniel Dunbar unsigned IsExternal : 1; 700f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar 7016aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar /// IsPrivateExtern - True if this symbol is private extern. 7026aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar unsigned IsPrivateExtern : 1; 7036aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar 7048f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar /// CommonSize - The size of the symbol, if it is 'common', or 0. 7058f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar // 7068f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar // FIXME: Pack this in with other fields? We could put it in offset, since a 7078f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar // common symbol can never get a definition. 7088f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar uint64_t CommonSize; 7098f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar 7106c8b3d2f1f6fe6eb6a7ae81eab24c1b6db9232aeMatt Fleming /// SymbolSize - An expression describing how to calculate the size of 7116c8b3d2f1f6fe6eb6a7ae81eab24c1b6db9232aeMatt Fleming /// a symbol. If a symbol has no size this field will be NULL. 7126c8b3d2f1f6fe6eb6a7ae81eab24c1b6db9232aeMatt Fleming const MCExpr *SymbolSize; 7136c8b3d2f1f6fe6eb6a7ae81eab24c1b6db9232aeMatt Fleming 7148f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar /// CommonAlign - The alignment of the symbol, if it is 'common'. 7158f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar // 7168f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar // FIXME: Pack this in with other fields? 7178f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar unsigned CommonAlign; 7188f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar 7196aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar /// Flags - The Flags field is used by object file implementations to store 7206aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar /// additional per symbol information which is not easily classified. 7216aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar uint32_t Flags; 7226aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar 723be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar /// Index - Index field, for use by the object file implementation. 724be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar uint64_t Index; 725be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar 726f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbarpublic: 727f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar // Only for use as sentinel. 728f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar MCSymbolData(); 729cb579b3338fe8d9e4424b138f597a4696cb89de3Daniel Dunbar MCSymbolData(const MCSymbol &_Symbol, MCFragment *_Fragment, uint64_t _Offset, 730dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCAssembler *A = nullptr); 731f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar 732f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar /// @name Accessors 733f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar /// @{ 734f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar 735efbb5330b8d383a393c83d2da5d631c98b0bb3fdDaniel Dunbar const MCSymbol &getSymbol() const { return *Symbol; } 736f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar 737f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar MCFragment *getFragment() const { return Fragment; } 738f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar void setFragment(MCFragment *Value) { Fragment = Value; } 739f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar 740f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar uint64_t getOffset() const { return Offset; } 741f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar void setOffset(uint64_t Value) { Offset = Value; } 742f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar 7436aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar /// @} 7446aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar /// @name Symbol Attributes 7456aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar /// @{ 746b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar 7476aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar bool isExternal() const { return IsExternal; } 7486aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar void setExternal(bool Value) { IsExternal = Value; } 749b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar 7506aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar bool isPrivateExtern() const { return IsPrivateExtern; } 7516aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar void setPrivateExtern(bool Value) { IsPrivateExtern = Value; } 7528f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar 7538f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar /// isCommon - Is this a 'common' symbol. 7548f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar bool isCommon() const { return CommonSize != 0; } 7558f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar 7568f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar /// setCommon - Mark this symbol as being 'common'. 7578f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar /// 7588f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar /// \param Size - The size of the symbol. 7598f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar /// \param Align - The alignment of the symbol. 7608f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar void setCommon(uint64_t Size, unsigned Align) { 7618f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar CommonSize = Size; 7628f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar CommonAlign = Align; 7638f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar } 7648f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar 7658f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar /// getCommonSize - Return the size of a 'common' symbol. 7668f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar uint64_t getCommonSize() const { 7678f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar assert(isCommon() && "Not a 'common' symbol!"); 7688f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar return CommonSize; 7698f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar } 7708f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar 7716c8b3d2f1f6fe6eb6a7ae81eab24c1b6db9232aeMatt Fleming void setSize(const MCExpr *SS) { 7726c8b3d2f1f6fe6eb6a7ae81eab24c1b6db9232aeMatt Fleming SymbolSize = SS; 7736c8b3d2f1f6fe6eb6a7ae81eab24c1b6db9232aeMatt Fleming } 7746c8b3d2f1f6fe6eb6a7ae81eab24c1b6db9232aeMatt Fleming 7756c8b3d2f1f6fe6eb6a7ae81eab24c1b6db9232aeMatt Fleming const MCExpr *getSize() const { 7766c8b3d2f1f6fe6eb6a7ae81eab24c1b6db9232aeMatt Fleming return SymbolSize; 7776c8b3d2f1f6fe6eb6a7ae81eab24c1b6db9232aeMatt Fleming } 7786c8b3d2f1f6fe6eb6a7ae81eab24c1b6db9232aeMatt Fleming 7796c8b3d2f1f6fe6eb6a7ae81eab24c1b6db9232aeMatt Fleming 7808f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar /// getCommonAlignment - Return the alignment of a 'common' symbol. 7818f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar unsigned getCommonAlignment() const { 7828f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar assert(isCommon() && "Not a 'common' symbol!"); 7838f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar return CommonAlign; 7848f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar } 7858f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar 7866aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar /// getFlags - Get the (implementation defined) symbol flags. 7876aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar uint32_t getFlags() const { return Flags; } 7883edd9bb7a3da8526eb2f4a5dae2962a987d3d566Daniel Dunbar 7896aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar /// setFlags - Set the (implementation defined) symbol flags. 7906aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar void setFlags(uint32_t Value) { Flags = Value; } 791b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar 792624d466a671feb563c137d1216ecad9d03d1a2edNathan Jeffords /// modifyFlags - Modify the flags via a mask 793624d466a671feb563c137d1216ecad9d03d1a2edNathan Jeffords void modifyFlags(uint32_t Value, uint32_t Mask) { 794624d466a671feb563c137d1216ecad9d03d1a2edNathan Jeffords Flags = (Flags & ~Mask) | Value; 795624d466a671feb563c137d1216ecad9d03d1a2edNathan Jeffords } 796624d466a671feb563c137d1216ecad9d03d1a2edNathan Jeffords 797be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar /// getIndex - Get the (implementation defined) index. 798be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar uint64_t getIndex() const { return Index; } 799be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar 800be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar /// setIndex - Set the (implementation defined) index. 801be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar void setIndex(uint64_t Value) { Index = Value; } 802b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar 803b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar /// @} 804b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar 805cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines void dump() const; 806f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar}; 807f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar 8080c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar// FIXME: This really doesn't belong here. See comments below. 8090c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbarstruct IndirectSymbolData { 8100c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar MCSymbol *Symbol; 8110c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar MCSectionData *SectionData; 8120c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar}; 8130c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar 8143e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach// FIXME: Ditto this. Purely so the Streamer and the ObjectWriter can talk 8153e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach// to one another. 8163e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbachstruct DataRegionData { 8173e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach // This enum should be kept in sync w/ the mach-o definition in 8183e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach // llvm/Object/MachOFormat.h. 8193e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach enum KindTy { Data = 1, JumpTable8, JumpTable16, JumpTable32 } Kind; 8203e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach MCSymbol *Start; 8213e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach MCSymbol *End; 8223e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach}; 8233e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach 824fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCAssembler { 8250cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar friend class MCAsmLayout; 8260cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar 827fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarpublic: 828fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar typedef iplist<MCSectionData> SectionDataListType; 829f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar typedef iplist<MCSymbolData> SymbolDataListType; 830fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 831fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar typedef SectionDataListType::const_iterator const_iterator; 832fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar typedef SectionDataListType::iterator iterator; 833fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 834f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar typedef SymbolDataListType::const_iterator const_symbol_iterator; 835f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar typedef SymbolDataListType::iterator symbol_iterator; 836f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar 837dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines typedef iterator_range<symbol_iterator> symbol_range; 838dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines typedef iterator_range<const_symbol_iterator> const_symbol_range; 839dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 84072580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger typedef std::vector<std::string> FileNameVectorType; 84172580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger typedef FileNameVectorType::const_iterator const_file_name_iterator; 84272580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger 843bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar typedef std::vector<IndirectSymbolData>::const_iterator 844bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar const_indirect_symbol_iterator; 8450c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar typedef std::vector<IndirectSymbolData>::iterator indirect_symbol_iterator; 8460c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar 8473e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach typedef std::vector<DataRegionData>::const_iterator 8483e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach const_data_region_iterator; 8493e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach typedef std::vector<DataRegionData>::iterator data_region_iterator; 8503e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach 85136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// MachO specific deployment target version info. 85236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // A Major version of 0 indicates that no version information was supplied 85336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // and so the corresponding load command should not be emitted. 85436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines typedef struct { 85536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCVersionMinType Kind; 85636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Major; 85736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Minor; 85836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Update; 85936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } VersionMinInfoType; 860fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarprivate: 86109bc9373f29b56d69ac3160446f25fc8020b3c16Craig Topper MCAssembler(const MCAssembler&) LLVM_DELETED_FUNCTION; 86209bc9373f29b56d69ac3160446f25fc8020b3c16Craig Topper void operator=(const MCAssembler&) LLVM_DELETED_FUNCTION; 863fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 864a03a368acca1c5ea7eb7de7a4164cbd22308c82fDaniel Dunbar MCContext &Context; 865a03a368acca1c5ea7eb7de7a4164cbd22308c82fDaniel Dunbar 86678c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackend &Backend; 8671f3e445184e5ca2aa4295c2a77f2a4e0b957fea1Daniel Dunbar 868cf871e5abff63a53f9e97ff9e37fb7297d0cb847Daniel Dunbar MCCodeEmitter &Emitter; 869cf871e5abff63a53f9e97ff9e37fb7297d0cb847Daniel Dunbar 87036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCObjectWriter &Writer; 871feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbar 872fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar raw_ostream &OS; 873b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar 874fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar iplist<MCSectionData> Sections; 875fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 876f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar iplist<MCSymbolData> Symbols; 877f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar 87846836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar /// The map of sections to their associated assembler backend data. 87946836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar // 88046836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar // FIXME: Avoid this indirection? 88146836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar DenseMap<const MCSection*, MCSectionData*> SectionMap; 88246836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar 88346836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar /// The map of symbols to their associated assembler backend data. 88446836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar // 88546836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar // FIXME: Avoid this indirection? 88646836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar DenseMap<const MCSymbol*, MCSymbolData*> SymbolMap; 88746836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar 8880c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar std::vector<IndirectSymbolData> IndirectSymbols; 8890c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar 8903e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach std::vector<DataRegionData> DataRegions; 891a94c33942373cb504b6e64c95415165907a89d34Daniel Dunbar 892a94c33942373cb504b6e64c95415165907a89d34Daniel Dunbar /// The list of linker options to propagate into the object file. 893a94c33942373cb504b6e64c95415165907a89d34Daniel Dunbar std::vector<std::vector<std::string> > LinkerOptions; 894a94c33942373cb504b6e64c95415165907a89d34Daniel Dunbar 89572580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger /// List of declared file names 89672580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger FileNameVectorType FileNames; 89772580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger 898475002078848d102b6577fe7283464c039b38af6Jim Grosbach /// The set of function symbols for which a .thumb_func directive has 899475002078848d102b6577fe7283464c039b38af6Jim Grosbach /// been seen. 900475002078848d102b6577fe7283464c039b38af6Jim Grosbach // 901475002078848d102b6577fe7283464c039b38af6Jim Grosbach // FIXME: We really would like this in target specific code rather than 902475002078848d102b6577fe7283464c039b38af6Jim Grosbach // here. Maybe when the relocation stuff moves to target specific, 903475002078848d102b6577fe7283464c039b38af6Jim Grosbach // this can go with it? The streamer would need some target specific 904475002078848d102b6577fe7283464c039b38af6Jim Grosbach // refactoring too. 905dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines mutable SmallPtrSet<const MCSymbol*, 64> ThumbFuncs; 906475002078848d102b6577fe7283464c039b38af6Jim Grosbach 9074766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky /// \brief The bundle alignment size currently set in the assembler. 9084766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky /// 9094766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky /// By default it's 0, which means bundling is disabled. 9104766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky unsigned BundleAlignSize; 9114766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 912ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar unsigned RelaxAll : 1; 91396aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola unsigned NoExecStack : 1; 9146009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar unsigned SubsectionsViaSymbols : 1; 9156009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar 9169a7bf438b50fed2c77f0e2bc835defa5b4728f82Jack Carter /// ELF specific e_header flags 9179a7bf438b50fed2c77f0e2bc835defa5b4728f82Jack Carter // It would be good if there were an MCELFAssembler class to hold this. 9189a7bf438b50fed2c77f0e2bc835defa5b4728f82Jack Carter // ELF header flags are used both by the integrated and standalone assemblers. 9199a7bf438b50fed2c77f0e2bc835defa5b4728f82Jack Carter // Access to the flags is necessary in cases where assembler directives affect 9209a7bf438b50fed2c77f0e2bc835defa5b4728f82Jack Carter // which flags to be set. 9219a7bf438b50fed2c77f0e2bc835defa5b4728f82Jack Carter unsigned ELFHeaderEFlags; 92236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 92336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Used to communicate Linker Optimization Hint information between 92436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// the Streamer and the .o writer 92536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCLOHContainer LOHContainer; 92636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 92736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines VersionMinInfoType VersionMinInfo; 9280705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarprivate: 92953b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar /// Evaluate a fixup to a relocatable expression and the value which should be 93053b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar /// placed into the fixup. 93153b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar /// 93253b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar /// \param Layout The layout to use for evaluation. 93353b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar /// \param Fixup The fixup to evaluate. 93453b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar /// \param DF The fragment the fixup is inside. 93553b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar /// \param Target [out] On return, the relocatable expression the fixup 93653b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar /// evaluates to. 9377a2bdde0a0eebcd2125055e0eacaca040f0b766cChris Lattner /// \param Value [out] On return, the value of the fixup as currently laid 93853b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar /// out. 93953b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar /// \return Whether the fixup value was fully resolved. This is true if the 940c5252da873d547a19069eaf9030fec203f128f66Dmitri Gribenko /// \p Value result is fixed, otherwise the value may change due to 94153b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar /// relocation. 942f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach bool evaluateFixup(const MCAsmLayout &Layout, 943c90e30aa6f3792a460202017523171f435e2ba34Daniel Dunbar const MCFixup &Fixup, const MCFragment *DF, 94453b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar MCValue &Target, uint64_t &Value) const; 94553b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar 946f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar /// Check whether a fixup can be satisfied, or whether it needs to be relaxed 947f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar /// (increased in size, in order to hold its value correctly). 948251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky bool fixupNeedsRelaxation(const MCFixup &Fixup, const MCRelaxableFragment *DF, 9498d39eb47d6a15d36be7ac0d0154a6897e42f5adcDaniel Dunbar const MCAsmLayout &Layout) const; 950f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar 951337055e62f28f18a9a8c4a090633cae1c2256ae1Daniel Dunbar /// Check whether the given fragment needs relaxation. 952251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky bool fragmentNeedsRelaxation(const MCRelaxableFragment *IF, 953337055e62f28f18a9a8c4a090633cae1c2256ae1Daniel Dunbar const MCAsmLayout &Layout) const; 954337055e62f28f18a9a8c4a090633cae1c2256ae1Daniel Dunbar 955f43e3fdb4ffddff6f71b5597c813c43e1e206564Eli Bendersky /// \brief Perform one layout iteration and return true if any offsets 956f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar /// were adjusted. 957f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach bool layoutOnce(MCAsmLayout &Layout); 958f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar 959f43e3fdb4ffddff6f71b5597c813c43e1e206564Eli Bendersky /// \brief Perform one layout iteration of the given section and return true 960f43e3fdb4ffddff6f71b5597c813c43e1e206564Eli Bendersky /// if any offsets were adjusted. 961f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach bool layoutSectionOnce(MCAsmLayout &Layout, MCSectionData &SD); 96262b83b62f377ac248038672015dc65970327f786Rafael Espindola 963251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky bool relaxInstruction(MCAsmLayout &Layout, MCRelaxableFragment &IF); 9643ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola 965f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach bool relaxLEB(MCAsmLayout &Layout, MCLEBFragment &IF); 9663ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola 967f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach bool relaxDwarfLineAddr(MCAsmLayout &Layout, MCDwarfLineAddrFragment &DF); 968f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach bool relaxDwarfCallFrameFragment(MCAsmLayout &Layout, 969245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola MCDwarfCallFrameFragment &DF); 970187d8339dbc0530850e54a86edf36f1a865a5823Rafael Espindola 971f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach /// finishLayout - Finalize a layout, including fragment lowering. 972f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach void finishLayout(MCAsmLayout &Layout); 9733f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar 97436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::pair<uint64_t, bool> handleFixup(const MCAsmLayout &Layout, 97536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCFragment &F, const MCFixup &Fixup); 976179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola 977df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbarpublic: 9787a2bdde0a0eebcd2125055e0eacaca040f0b766cChris Lattner /// Compute the effective fragment size assuming it is laid out at the given 979c5252da873d547a19069eaf9030fec203f128f66Dmitri Gribenko /// \p SectionAddress and \p FragmentOffset. 980fdedd486243724139b1403a939f46b7de1138d93Jim Grosbach uint64_t computeFragmentSize(const MCAsmLayout &Layout, 981fdedd486243724139b1403a939f46b7de1138d93Jim Grosbach const MCFragment &F) const; 9822bf6afc277edb32b1d940def5b3eb0e0d32a22b9Rafael Espindola 9838ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar /// Find the symbol which defines the atom containing the given symbol, or 9848ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar /// null if there is no such symbol. 985b814110612024a092fd884050fbab9d012b16dc7Rafael Espindola const MCSymbolData *getAtom(const MCSymbolData *Symbol) const; 9868ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar 987238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar /// Check whether a particular symbol is visible to the linker and is required 988238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar /// in the symbol table, or whether it can be discarded by the assembler. This 989238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar /// also effects whether the assembler treats the label as potentially 990238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar /// defining a separate atom. 991843aa1f15b06fc3c2b39740ffb5bffd2fa6827ceDaniel Dunbar bool isSymbolLinkerVisible(const MCSymbol &SD) const; 992238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar 99353b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar /// Emit the section contents using the given object writer. 994f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach void writeSectionData(const MCSectionData *Section, 9955d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar const MCAsmLayout &Layout) const; 996df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar 997475002078848d102b6577fe7283464c039b38af6Jim Grosbach /// Check whether a given symbol has been flagged with .thumb_func. 998dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isThumbFunc(const MCSymbol *Func) const; 999475002078848d102b6577fe7283464c039b38af6Jim Grosbach 1000475002078848d102b6577fe7283464c039b38af6Jim Grosbach /// Flag a function symbol as the target of a .thumb_func directive. 1001475002078848d102b6577fe7283464c039b38af6Jim Grosbach void setIsThumbFunc(const MCSymbol *Func) { ThumbFuncs.insert(Func); } 1002475002078848d102b6577fe7283464c039b38af6Jim Grosbach 10039a7bf438b50fed2c77f0e2bc835defa5b4728f82Jack Carter /// ELF e_header flags 10049a7bf438b50fed2c77f0e2bc835defa5b4728f82Jack Carter unsigned getELFHeaderEFlags() const {return ELFHeaderEFlags;} 10059a7bf438b50fed2c77f0e2bc835defa5b4728f82Jack Carter void setELFHeaderEFlags(unsigned Flags) { ELFHeaderEFlags = Flags;} 10069a7bf438b50fed2c77f0e2bc835defa5b4728f82Jack Carter 100736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// MachO deployment target version information. 100836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const VersionMinInfoType &getVersionMinInfo() const { return VersionMinInfo; } 100936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void setVersionMinInfo(MCVersionMinType Kind, unsigned Major, unsigned Minor, 101036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Update) { 101136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines VersionMinInfo.Kind = Kind; 101236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines VersionMinInfo.Major = Major; 101336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines VersionMinInfo.Minor = Minor; 101436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines VersionMinInfo.Update = Update; 101536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 101636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1017fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarpublic: 1018fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// Construct a new assembler instance. 1019fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// 1020c5252da873d547a19069eaf9030fec203f128f66Dmitri Gribenko /// \param OS The stream to output to. 1021fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar // 1022fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar // FIXME: How are we going to parameterize this? Two obvious options are stay 1023fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar // concrete and require clients to pass in a target like object. The other 1024fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar // option is to make this abstract, and have targets provide concrete 1025fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar // implementations as we do with AsmParser. 102678c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAssembler(MCContext &Context_, MCAsmBackend &Backend_, 1027feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbar MCCodeEmitter &Emitter_, MCObjectWriter &Writer_, 1028feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbar raw_ostream &OS); 1029fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar ~MCAssembler(); 1030fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 10315399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigas /// Reuse an assembler instance 10325399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigas /// 10335399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigas void reset(); 10345399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigas 1035a03a368acca1c5ea7eb7de7a4164cbd22308c82fDaniel Dunbar MCContext &getContext() const { return Context; } 1036a03a368acca1c5ea7eb7de7a4164cbd22308c82fDaniel Dunbar 103778c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackend &getBackend() const { return Backend; } 1038f82f4490b130eca55b08d605456a4ceacccf288aDaniel Dunbar 1039cf871e5abff63a53f9e97ff9e37fb7297d0cb847Daniel Dunbar MCCodeEmitter &getEmitter() const { return Emitter; } 1040cf871e5abff63a53f9e97ff9e37fb7297d0cb847Daniel Dunbar 104136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCObjectWriter &getWriter() const { return Writer; } 1042feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbar 1043fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// Finish - Do final processing and write the object to the output stream. 1044c5252da873d547a19069eaf9030fec203f128f66Dmitri Gribenko /// \p Writer is used for custom object writer (as the MCJIT does), 1045c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner /// if not specified it is automatically created from backend. 1046feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbar void Finish(); 1047fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 10486009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar // FIXME: This does not belong here. 10496009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar bool getSubsectionsViaSymbols() const { 10506009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar return SubsectionsViaSymbols; 10516009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar } 10526009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar void setSubsectionsViaSymbols(bool Value) { 10536009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar SubsectionsViaSymbols = Value; 10546009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar } 10556009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar 1056ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar bool getRelaxAll() const { return RelaxAll; } 1057ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar void setRelaxAll(bool Value) { RelaxAll = Value; } 1058ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar 105996aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola bool getNoExecStack() const { return NoExecStack; } 106096aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola void setNoExecStack(bool Value) { NoExecStack = Value; } 106196aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola 10624766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky bool isBundlingEnabled() const { 10634766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky return BundleAlignSize != 0; 10644766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky } 10654766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 10664766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky unsigned getBundleAlignSize() const { 10674766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky return BundleAlignSize; 10684766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky } 10694766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 10704766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky void setBundleAlignSize(unsigned Size) { 10714766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky assert((Size == 0 || !(Size & (Size - 1))) && 10724766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky "Expect a power-of-two bundle align size"); 10734766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky BundleAlignSize = Size; 10744766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky } 10754766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky 1076fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// @name Section List Access 1077fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// @{ 1078fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 1079fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar const SectionDataListType &getSectionList() const { return Sections; } 1080b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar SectionDataListType &getSectionList() { return Sections; } 1081fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 1082fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar iterator begin() { return Sections.begin(); } 1083fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar const_iterator begin() const { return Sections.begin(); } 1084fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 1085fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar iterator end() { return Sections.end(); } 1086fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar const_iterator end() const { return Sections.end(); } 1087fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 1088fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar size_t size() const { return Sections.size(); } 1089fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 1090fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// @} 1091f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar /// @name Symbol List Access 1092f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar /// @{ 1093f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar 1094f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar const SymbolDataListType &getSymbolList() const { return Symbols; } 1095f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar SymbolDataListType &getSymbolList() { return Symbols; } 1096f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar 1097f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar symbol_iterator symbol_begin() { return Symbols.begin(); } 1098f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar const_symbol_iterator symbol_begin() const { return Symbols.begin(); } 1099f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar 1100f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar symbol_iterator symbol_end() { return Symbols.end(); } 1101f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar const_symbol_iterator symbol_end() const { return Symbols.end(); } 1102f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar 1103dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines symbol_range symbols() { return make_range(symbol_begin(), symbol_end()); } 1104dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const_symbol_range symbols() const { return make_range(symbol_begin(), symbol_end()); } 1105dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1106f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar size_t symbol_size() const { return Symbols.size(); } 1107f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar 1108f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar /// @} 11090c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar /// @name Indirect Symbol List Access 11100c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar /// @{ 11110c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar 11120c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar // FIXME: This is a total hack, this should not be here. Once things are 11130c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar // factored so that the streamer has direct access to the .o writer, it can 11140c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar // disappear. 11150c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar std::vector<IndirectSymbolData> &getIndirectSymbols() { 11160c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar return IndirectSymbols; 11170c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar } 11180c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar 11190c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar indirect_symbol_iterator indirect_symbol_begin() { 11200c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar return IndirectSymbols.begin(); 11210c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar } 1122bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar const_indirect_symbol_iterator indirect_symbol_begin() const { 1123bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar return IndirectSymbols.begin(); 1124bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar } 11250c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar 11260c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar indirect_symbol_iterator indirect_symbol_end() { 11270c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar return IndirectSymbols.end(); 11280c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar } 1129bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar const_indirect_symbol_iterator indirect_symbol_end() const { 1130bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar return IndirectSymbols.end(); 1131bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar } 11320c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar 11330c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar size_t indirect_symbol_size() const { return IndirectSymbols.size(); } 11340c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar 11350c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar /// @} 1136a94c33942373cb504b6e64c95415165907a89d34Daniel Dunbar /// @name Linker Option List Access 1137a94c33942373cb504b6e64c95415165907a89d34Daniel Dunbar /// @{ 1138a94c33942373cb504b6e64c95415165907a89d34Daniel Dunbar 1139a94c33942373cb504b6e64c95415165907a89d34Daniel Dunbar std::vector<std::vector<std::string> > &getLinkerOptions() { 1140a94c33942373cb504b6e64c95415165907a89d34Daniel Dunbar return LinkerOptions; 1141a94c33942373cb504b6e64c95415165907a89d34Daniel Dunbar } 1142a94c33942373cb504b6e64c95415165907a89d34Daniel Dunbar 1143a94c33942373cb504b6e64c95415165907a89d34Daniel Dunbar /// @} 11443e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach /// @name Data Region List Access 11453e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach /// @{ 11463e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach 11473e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach // FIXME: This is a total hack, this should not be here. Once things are 11483e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach // factored so that the streamer has direct access to the .o writer, it can 11493e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach // disappear. 11503e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach std::vector<DataRegionData> &getDataRegions() { 11513e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach return DataRegions; 11523e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach } 11533e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach 11543e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach data_region_iterator data_region_begin() { 11553e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach return DataRegions.begin(); 11563e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach } 11573e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach const_data_region_iterator data_region_begin() const { 11583e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach return DataRegions.begin(); 11593e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach } 11603e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach 11613e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach data_region_iterator data_region_end() { 11623e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach return DataRegions.end(); 11633e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach } 11643e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach const_data_region_iterator data_region_end() const { 11653e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach return DataRegions.end(); 11663e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach } 11673e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach 11683e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach size_t data_region_size() const { return DataRegions.size(); } 11693e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach 11703e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach /// @} 117136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// @name Data Region List Access 117236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// @{ 117336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 117436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // FIXME: This is a total hack, this should not be here. Once things are 117536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // factored so that the streamer has direct access to the .o writer, it can 117636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // disappear. 117736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCLOHContainer & getLOHContainer() { 117836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return LOHContainer; 117936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 118036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCLOHContainer & getLOHContainer() const { 118136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return const_cast<MCAssembler *>(this)->getLOHContainer(); 118236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 118336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// @} 118446836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar /// @name Backend Data Access 118546836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar /// @{ 118646836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar 1187a0e36d55c495b3325805c659ac365b5faea84e34Daniel Dunbar MCSectionData &getSectionData(const MCSection &Section) const { 1188a0e36d55c495b3325805c659ac365b5faea84e34Daniel Dunbar MCSectionData *Entry = SectionMap.lookup(&Section); 118946836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar assert(Entry && "Missing section data!"); 119046836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar return *Entry; 119146836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar } 119246836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar 119346836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar MCSectionData &getOrCreateSectionData(const MCSection &Section, 1194dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool *Created = nullptr) { 119546836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar MCSectionData *&Entry = SectionMap[&Section]; 119646836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar 119746836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar if (Created) *Created = !Entry; 119846836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar if (!Entry) 119946836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar Entry = new MCSectionData(Section, this); 120046836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar 120146836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar return *Entry; 120246836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar } 120346836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar 120436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool hasSymbolData(const MCSymbol &Symbol) const { 1205dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return SymbolMap.lookup(&Symbol) != nullptr; 1206dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 1207dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1208dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSymbolData &getSymbolData(const MCSymbol &Symbol) { 1209dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return const_cast<MCSymbolData &>( 1210dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines static_cast<const MCAssembler &>(*this).getSymbolData(Symbol)); 121136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 121236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1213dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MCSymbolData &getSymbolData(const MCSymbol &Symbol) const { 1214a0e36d55c495b3325805c659ac365b5faea84e34Daniel Dunbar MCSymbolData *Entry = SymbolMap.lookup(&Symbol); 121546836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar assert(Entry && "Missing symbol data!"); 121646836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar return *Entry; 121746836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar } 121846836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar 121946836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar MCSymbolData &getOrCreateSymbolData(const MCSymbol &Symbol, 1220dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool *Created = nullptr) { 122146836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar MCSymbolData *&Entry = SymbolMap[&Symbol]; 122246836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar 122346836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar if (Created) *Created = !Entry; 122446836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar if (!Entry) 1225dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Entry = new MCSymbolData(Symbol, nullptr, 0, this); 122646836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar 122746836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar return *Entry; 122846836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar } 122946836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar 123072580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger const_file_name_iterator file_names_begin() const { 123172580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger return FileNames.begin(); 123272580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger } 123372580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger 123472580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger const_file_name_iterator file_names_end() const { 123572580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger return FileNames.end(); 123672580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger } 123772580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger 123872580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger void addFileName(StringRef FileName) { 123972580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger if (std::find(file_names_begin(), file_names_end(), FileName) == 124072580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger file_names_end()) 124172580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger FileNames.push_back(FileName); 124272580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger } 124372580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger 124446836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar /// @} 1245b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar 1246b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar void dump(); 1247fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}; 1248fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 1249fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} // end namespace llvm 1250fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 1251fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#endif 1252