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