MCAssembler.h revision d5a8e98ef627a35284c9b5989664514f8f163968
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
130705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar#include "llvm/ADT/SmallString.h"
14fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/ADT/ilist.h"
15fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/ADT/ilist_node.h"
160705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar#include "llvm/MC/MCValue.h"
170705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar#include "llvm/Support/Casting.h"
181f2b32c5c6502c74890c188b0224e4c01ff22da4Benjamin Kramer#include "llvm/Support/DataTypes.h"
190c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar#include <vector> // FIXME: Shouldn't be needed.
20fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
21fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarnamespace llvm {
22fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass raw_ostream;
23fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCAssembler;
24fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCSection;
25fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCSectionData;
26fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
27fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCFragment : public ilist_node<MCFragment> {
28fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  MCFragment(const MCFragment&);     // DO NOT IMPLEMENT
29fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  void operator=(const MCFragment&); // DO NOT IMPLEMENT
30fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
31fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarpublic:
320705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  enum FragmentType {
330705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    FT_Data,
340705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    FT_Align,
350705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    FT_Fill,
36d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    FT_Org,
37d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    FT_ZeroFill
380705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  };
390705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
400705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarprivate:
410705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  FragmentType Kind;
420705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
435e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar  /// Parent - The data for the section this fragment is in.
445e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar  MCSectionData *Parent;
455e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar
460705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @name Assembler Backend Data
470705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @{
480705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  //
490705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  // FIXME: This could all be kept private to the assembler implementation.
500705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
51a5441fea1f5d4f86d6211af16dbf7d190f2a3c83Daniel Dunbar  /// Offset - The offset of this fragment in its section. This is ~0 until
520705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// initialized.
53a5441fea1f5d4f86d6211af16dbf7d190f2a3c83Daniel Dunbar  uint64_t Offset;
54a5441fea1f5d4f86d6211af16dbf7d190f2a3c83Daniel Dunbar
55a5441fea1f5d4f86d6211af16dbf7d190f2a3c83Daniel Dunbar  /// FileSize - The file size of this section. This is ~0 until initialized.
560705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  uint64_t FileSize;
570705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
580705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @}
590705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
600705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarprotected:
615e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar  MCFragment(FragmentType _Kind, MCSectionData *_Parent = 0);
620705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
630705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarpublic:
640705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  // Only for sentinel.
650705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  MCFragment();
660705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  virtual ~MCFragment();
670705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
680705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  FragmentType getKind() const { return Kind; }
690705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
705e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar  MCSectionData *getParent() const { return Parent; }
715e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar  void setParent(MCSectionData *Value) { Parent = Value; }
725e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar
730705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  // FIXME: This should be abstract, fix sentinel.
74d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  virtual uint64_t getMaxFileSize() const {
75f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar    assert(0 && "Invalid getMaxFileSize call!");
76361ae1d28dfa4c22ddec58b2b742eb514f97c694Daniel Dunbar    return 0;
770705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  };
780705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
790705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @name Assembler Backend Support
800705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @{
810705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  //
820705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  // FIXME: This could all be kept private to the assembler implementation.
830705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
845e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar  uint64_t getAddress() const;
855e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar
866742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar  uint64_t getFileSize() const {
870705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    assert(FileSize != ~UINT64_C(0) && "File size not set!");
880705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    return FileSize;
890705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
900705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  void setFileSize(uint64_t Value) {
910705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    assert(Value <= getMaxFileSize() && "Invalid file size!");
920705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    FileSize = Value;
930705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
940705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
95a5441fea1f5d4f86d6211af16dbf7d190f2a3c83Daniel Dunbar  uint64_t getOffset() const {
96a5441fea1f5d4f86d6211af16dbf7d190f2a3c83Daniel Dunbar    assert(Offset != ~UINT64_C(0) && "File offset not set!");
97a5441fea1f5d4f86d6211af16dbf7d190f2a3c83Daniel Dunbar    return Offset;
980705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
99a5441fea1f5d4f86d6211af16dbf7d190f2a3c83Daniel Dunbar  void setOffset(uint64_t Value) { Offset = Value; }
1000705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1010705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @}
1020705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1030705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  static bool classof(const MCFragment *O) { return true; }
1040705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar};
1050705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1060705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarclass MCDataFragment : public MCFragment {
1070705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  SmallString<32> Contents;
1080705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1090705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarpublic:
1100705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  MCDataFragment(MCSectionData *SD = 0) : MCFragment(FT_Data, SD) {}
1110705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1120705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @name Accessors
1130705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @{
1140705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
115d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  uint64_t getMaxFileSize() const {
1160705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    return Contents.size();
1170705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
1180705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1190705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  SmallString<32> &getContents() { return Contents; }
1200705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  const SmallString<32> &getContents() const { return Contents; }
1210705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1220705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @}
1230705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1240705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  static bool classof(const MCFragment *F) {
1250705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    return F->getKind() == MCFragment::FT_Data;
1260705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
1270705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  static bool classof(const MCDataFragment *) { return true; }
1280705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar};
1290705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1300705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarclass MCAlignFragment : public MCFragment {
1310705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// Alignment - The alignment to ensure, in bytes.
1320705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  unsigned Alignment;
1330705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1340705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// Value - Value to use for filling padding bytes.
1350705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  int64_t Value;
1360705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1370705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// ValueSize - The size of the integer (in bytes) of \arg Value.
1380705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  unsigned ValueSize;
1390705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1400705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// MaxBytesToEmit - The maximum number of bytes to emit; if the alignment
1410705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// cannot be satisfied in this width then this fragment is ignored.
1420705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  unsigned MaxBytesToEmit;
1430705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1440705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarpublic:
1450705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  MCAlignFragment(unsigned _Alignment, int64_t _Value, unsigned _ValueSize,
1460705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar                  unsigned _MaxBytesToEmit, MCSectionData *SD = 0)
1470705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    : MCFragment(FT_Align, SD), Alignment(_Alignment),
1480705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar      Value(_Value),ValueSize(_ValueSize),
1490705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar      MaxBytesToEmit(_MaxBytesToEmit) {}
1500705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1510705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @name Accessors
1520705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @{
1530705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
154d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  uint64_t getMaxFileSize() const {
1550705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    return std::max(Alignment - 1, MaxBytesToEmit);
1560705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
1570705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1580705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  unsigned getAlignment() const { return Alignment; }
1590705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1600705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  int64_t getValue() const { return Value; }
1610705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1620705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  unsigned getValueSize() const { return ValueSize; }
1630705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1640705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  unsigned getMaxBytesToEmit() const { return MaxBytesToEmit; }
1650705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1660705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @}
1670705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1680705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  static bool classof(const MCFragment *F) {
1690705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    return F->getKind() == MCFragment::FT_Align;
1700705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
1710705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  static bool classof(const MCAlignFragment *) { return true; }
1720705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar};
1730705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1740705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarclass MCFillFragment : public MCFragment {
1750705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// Value - Value to use for filling bytes.
1760705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  MCValue Value;
1770705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1780705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// ValueSize - The size (in bytes) of \arg Value to use when filling.
1790705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  unsigned ValueSize;
1800705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1810705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// Count - The number of copies of \arg Value to insert.
1820705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  uint64_t Count;
1830705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1840705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarpublic:
1850705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  MCFillFragment(MCValue _Value, unsigned _ValueSize, uint64_t _Count,
1860705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar                 MCSectionData *SD = 0)
1870705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    : MCFragment(FT_Fill, SD),
1880705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar      Value(_Value), ValueSize(_ValueSize), Count(_Count) {}
1890705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1900705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @name Accessors
1910705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @{
1920705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
193d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  uint64_t getMaxFileSize() const {
1940705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    return ValueSize * Count;
1950705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
1960705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1970705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  MCValue getValue() const { return Value; }
1980705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1990705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  unsigned getValueSize() const { return ValueSize; }
2000705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
2010705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  uint64_t getCount() const { return Count; }
2020705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
2030705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @}
2040705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
2050705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  static bool classof(const MCFragment *F) {
2060705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    return F->getKind() == MCFragment::FT_Fill;
2070705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
2080705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  static bool classof(const MCFillFragment *) { return true; }
2090705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar};
2100705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
2110705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarclass MCOrgFragment : public MCFragment {
2120705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// Offset - The offset this fragment should start at.
2130705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  MCValue Offset;
2140705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
2150705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// Value - Value to use for filling bytes.
216d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  int8_t Value;
2170705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
2180705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarpublic:
219d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  MCOrgFragment(MCValue _Offset, int8_t _Value, MCSectionData *SD = 0)
2200705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    : MCFragment(FT_Org, SD),
221d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      Offset(_Offset), Value(_Value) {}
222d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
2230705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @name Accessors
2240705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @{
2250705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
226d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  uint64_t getMaxFileSize() const {
227d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    // FIXME: This doesn't make much sense.
228d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    return ~UINT64_C(0);
2290705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
2300705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
2310705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  MCValue getOffset() const { return Offset; }
2320705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
233d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  uint8_t getValue() const { return Value; }
2340705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
2350705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @}
2360705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
2370705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  static bool classof(const MCFragment *F) {
2380705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    return F->getKind() == MCFragment::FT_Org;
2390705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
2400705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  static bool classof(const MCOrgFragment *) { return true; }
241fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar};
242fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
243d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar/// MCZeroFillFragment - Represent data which has a fixed size and alignment,
244d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar/// but requires no physical space in the object file.
245d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbarclass MCZeroFillFragment : public MCFragment {
246d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  /// Size - The size of this fragment.
247d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  uint64_t Size;
248d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
249d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  /// Alignment - The alignment for this fragment.
250d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  unsigned Alignment;
251d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
252d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbarpublic:
253d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  MCZeroFillFragment(uint64_t _Size, unsigned _Alignment, MCSectionData *SD = 0)
254d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    : MCFragment(FT_ZeroFill, SD),
255d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar      Size(_Size), Alignment(_Alignment) {}
256d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
257d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  /// @name Accessors
258d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  /// @{
259d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
260d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  uint64_t getMaxFileSize() const {
261d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    // FIXME: This also doesn't make much sense, this method is misnamed.
262d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    return ~UINT64_C(0);
263d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  }
264d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
265d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  uint64_t getSize() const { return Size; }
266d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
267d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  unsigned getAlignment() const { return Alignment; }
268d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
269d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  /// @}
270d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
271d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  static bool classof(const MCFragment *F) {
272d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    return F->getKind() == MCFragment::FT_ZeroFill;
273d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  }
274d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  static bool classof(const MCZeroFillFragment *) { return true; }
275d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar};
276d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
277fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// FIXME: Should this be a separate class, or just merged into MCSection? Since
278fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// we anticipate the fast path being through an MCAssembler, the only reason to
279fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// keep it out is for API abstraction.
280fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCSectionData : public ilist_node<MCSectionData> {
281fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  MCSectionData(const MCSectionData&);  // DO NOT IMPLEMENT
282fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  void operator=(const MCSectionData&); // DO NOT IMPLEMENT
283fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
284fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarpublic:
2853f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  /// Fixup - Represent a fixed size region of bytes inside some fragment which
2863f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  /// needs to be rewritten. This region will either be rewritten by the
2873f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  /// assembler or cause a relocation entry to be generated.
2883f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  struct Fixup {
2893f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    /// Fragment - The fragment containing the fixup.
2903f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    MCFragment *Fragment;
2913f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar
2923f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    /// Offset - The offset inside the fragment which needs to be rewritten.
2933f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    uint64_t Offset;
2943f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar
2953f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    /// Value - The expression to eventually write into the fragment.
2963f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    //
2973f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    // FIXME: We could probably get away with requiring the client to pass in an
2983f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    // owned reference whose lifetime extends past that of the fixup.
2993f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    MCValue Value;
3003f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar
3013f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    /// Size - The fixup size.
3023f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    unsigned Size;
3033f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar
3043f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    /// FixedValue - The value to replace the fix up by.
3053f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    //
3063f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    // FIXME: This should not be here.
3073f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    uint64_t FixedValue;
3083f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar
3093f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  public:
3103f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    Fixup(MCFragment &_Fragment, uint64_t _Offset, const MCValue &_Value,
3113f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar          unsigned _Size)
3123f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar      : Fragment(&_Fragment), Offset(_Offset), Value(_Value), Size(_Size),
3133f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar        FixedValue(0) {}
3143f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  };
3153f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar
316fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  typedef iplist<MCFragment> FragmentListType;
317fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
3180705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  typedef FragmentListType::const_iterator const_iterator;
3190705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  typedef FragmentListType::iterator iterator;
3200705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
3213f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  typedef std::vector<Fixup>::const_iterator const_fixup_iterator;
3223f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  typedef std::vector<Fixup>::iterator fixup_iterator;
3233f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar
324fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarprivate:
325fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  iplist<MCFragment> Fragments;
32681e400092f55c2eba157172bfc0dd0df8317638dDaniel Dunbar  const MCSection *Section;
327fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
328fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  /// Alignment - The maximum alignment seen in this section.
329fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  unsigned Alignment;
330fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
331fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  /// @name Assembler Backend Data
332fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  /// @{
333fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  //
334fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  // FIXME: This could all be kept private to the assembler implementation.
335fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
3365e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar  /// Address - The computed address of this section. This is ~0 until
3375e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar  /// initialized.
3385e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar  uint64_t Address;
3395e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar
3406742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar  /// Size - The content size of this section. This is ~0 until initialized.
3416742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar  uint64_t Size;
3426742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar
3430705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// FileSize - The size of this section in the object file. This is ~0 until
3440705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// initialized.
345fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  uint64_t FileSize;
346fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
3473f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  /// LastFixupLookup - Cache for the last looked up fixup.
3483f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  mutable unsigned LastFixupLookup;
3493f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar
3503f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  /// Fixups - The list of fixups in this section.
3513f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  std::vector<Fixup> Fixups;
3523f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar
353fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  /// @}
354fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
355fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarpublic:
356fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  // Only for use as sentinel.
357fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  MCSectionData();
358fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  MCSectionData(const MCSection &Section, MCAssembler *A = 0);
359fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
36081e400092f55c2eba157172bfc0dd0df8317638dDaniel Dunbar  const MCSection &getSection() const { return *Section; }
361fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
362fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  unsigned getAlignment() const { return Alignment; }
363fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  void setAlignment(unsigned Value) { Alignment = Value; }
364fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
365be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar  /// @name Fragment Access
3660705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @{
3670705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
3680705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  const FragmentListType &getFragmentList() const { return Fragments; }
3690705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  FragmentListType &getFragmentList() { return Fragments; }
3700705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
3710705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  iterator begin() { return Fragments.begin(); }
3720705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  const_iterator begin() const { return Fragments.begin(); }
3730705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
3740705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  iterator end() { return Fragments.end(); }
3750705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  const_iterator end() const { return Fragments.end(); }
3760705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
3770705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  size_t size() const { return Fragments.size(); }
3780705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
379f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  bool empty() const { return Fragments.empty(); }
380f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
3810705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// @}
3823f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  /// @name Fixup Access
3833f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  /// @{
3843f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar
3853f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  std::vector<Fixup> &getFixups() {
3863f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    return Fixups;
3873f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  }
3883f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar
3893f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  fixup_iterator fixup_begin() {
3903f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    return Fixups.begin();
3913f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  }
3923f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar
3933f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  fixup_iterator fixup_end() {
3943f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    return Fixups.end();
3953f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  }
3963f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar
3973f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  size_t fixup_size() const { return Fixups.size(); }
3983f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar
3993f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  /// @}
400fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  /// @name Assembler Backend Support
401fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  /// @{
402fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  //
403fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  // FIXME: This could all be kept private to the assembler implementation.
404fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
4053f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  /// LookupFixup - Look up the fixup for the given \arg Fragment and \arg
4063f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  /// Offset.
4073f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  ///
4083f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  /// If multiple fixups exist for the same fragment and offset it is undefined
4093f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  /// which one is returned.
4103f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  //
4113f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  // FIXME: This isn't horribly slow in practice, but there are much nicer
4123f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  // solutions to applying the fixups.
4133f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar  const Fixup *LookupFixup(const MCFragment *Fragment, uint64_t Offset) const;
4143f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar
4156742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar  uint64_t getAddress() const {
4165e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar    assert(Address != ~UINT64_C(0) && "Address not set!");
4175e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar    return Address;
4185e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar  }
4195e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar  void setAddress(uint64_t Value) { Address = Value; }
4205e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar
4216742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar  uint64_t getSize() const {
4226742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar    assert(Size != ~UINT64_C(0) && "File size not set!");
4236742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar    return Size;
4246742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar  }
4256742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar  void setSize(uint64_t Value) { Size = Value; }
4266742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar
4276742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar  uint64_t getFileSize() const {
4280705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    assert(FileSize != ~UINT64_C(0) && "File size not set!");
4290705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    return FileSize;
4300705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
431be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar  void setFileSize(uint64_t Value) { FileSize = Value; }
432fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
433fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  /// @}
434fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar};
435fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
436f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar// FIXME: Same concerns as with SectionData.
437f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbarclass MCSymbolData : public ilist_node<MCSymbolData> {
438f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbarpublic:
439f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  MCSymbol &Symbol;
440f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
441f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  /// Fragment - The fragment this symbol's value is relative to, if any.
442f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  MCFragment *Fragment;
443f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
444f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  /// Offset - The offset to apply to the fragment address to form this symbol's
445f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  /// value.
446f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  uint64_t Offset;
4473edd9bb7a3da8526eb2f4a5dae2962a987d3d566Daniel Dunbar
4483edd9bb7a3da8526eb2f4a5dae2962a987d3d566Daniel Dunbar  /// IsExternal - True if this symbol is visible outside this translation
4493edd9bb7a3da8526eb2f4a5dae2962a987d3d566Daniel Dunbar  /// unit.
4503edd9bb7a3da8526eb2f4a5dae2962a987d3d566Daniel Dunbar  unsigned IsExternal : 1;
451f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
4526aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  /// IsPrivateExtern - True if this symbol is private extern.
4536aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  unsigned IsPrivateExtern : 1;
4546aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar
4556aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  /// Flags - The Flags field is used by object file implementations to store
4566aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  /// additional per symbol information which is not easily classified.
4576aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  uint32_t Flags;
4586aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar
459be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar  /// Index - Index field, for use by the object file implementation.
460be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar  uint64_t Index;
461be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar
462f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbarpublic:
463f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  // Only for use as sentinel.
464f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  MCSymbolData();
465f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  MCSymbolData(MCSymbol &_Symbol, MCFragment *_Fragment, uint64_t _Offset,
466f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar               MCAssembler *A = 0);
467f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
468f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  /// @name Accessors
469f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  /// @{
470f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
471f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  MCSymbol &getSymbol() const { return Symbol; }
472f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
473f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  MCFragment *getFragment() const { return Fragment; }
474f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  void setFragment(MCFragment *Value) { Fragment = Value; }
475f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
476f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  uint64_t getOffset() const { return Offset; }
477f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  void setOffset(uint64_t Value) { Offset = Value; }
478f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
4796aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  /// @}
4806aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  /// @name Symbol Attributes
4816aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  /// @{
4826aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar
4836aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  bool isExternal() const { return IsExternal; }
4846aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  void setExternal(bool Value) { IsExternal = Value; }
4856aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar
4866aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  bool isPrivateExtern() const { return IsPrivateExtern; }
4876aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  void setPrivateExtern(bool Value) { IsPrivateExtern = Value; }
4886aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar
4896aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  /// getFlags - Get the (implementation defined) symbol flags.
4906aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  uint32_t getFlags() const { return Flags; }
4913edd9bb7a3da8526eb2f4a5dae2962a987d3d566Daniel Dunbar
4926aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  /// setFlags - Set the (implementation defined) symbol flags.
4936aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  void setFlags(uint32_t Value) { Flags = Value; }
4946aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar
495be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar  /// getIndex - Get the (implementation defined) index.
496be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar  uint64_t getIndex() const { return Index; }
497be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar
498be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar  /// setIndex - Set the (implementation defined) index.
499be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar  void setIndex(uint64_t Value) { Index = Value; }
500be9635569401b9a40984c02c6e171aa9da9ad0a2Daniel Dunbar
501f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  /// @}
502f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar};
503f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
5040c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar// FIXME: This really doesn't belong here. See comments below.
5050c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbarstruct IndirectSymbolData {
5060c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  MCSymbol *Symbol;
5070c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  MCSectionData *SectionData;
5080c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar};
5090c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar
510fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCAssembler {
511fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarpublic:
512fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  typedef iplist<MCSectionData> SectionDataListType;
513f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  typedef iplist<MCSymbolData> SymbolDataListType;
514fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
515fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  typedef SectionDataListType::const_iterator const_iterator;
516fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  typedef SectionDataListType::iterator iterator;
517fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
518f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  typedef SymbolDataListType::const_iterator const_symbol_iterator;
519f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  typedef SymbolDataListType::iterator symbol_iterator;
520f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
5210c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  typedef std::vector<IndirectSymbolData>::iterator indirect_symbol_iterator;
5220c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar
523fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarprivate:
524fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  MCAssembler(const MCAssembler&);    // DO NOT IMPLEMENT
525fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  void operator=(const MCAssembler&); // DO NOT IMPLEMENT
526fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
527fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  raw_ostream &OS;
528fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
529fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  iplist<MCSectionData> Sections;
530fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
531f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  iplist<MCSymbolData> Symbols;
532f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
5330c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  std::vector<IndirectSymbolData> IndirectSymbols;
5340c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar
5356009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar  unsigned SubsectionsViaSymbols : 1;
5366009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar
5370705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbarprivate:
5380705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// LayoutSection - Assign offsets and sizes to the fragments in the section
5390705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// \arg SD, and update the section size. The section file offset should
5400705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  /// already have been computed.
541edc670f3f2ba629b6803a1a7ed4aa47061afd276Daniel Dunbar  void LayoutSection(MCSectionData &SD);
5420705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
543fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarpublic:
544fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  /// Construct a new assembler instance.
545fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  ///
546fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  /// \arg OS - The stream to output to.
547fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  //
548fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  // FIXME: How are we going to parameterize this? Two obvious options are stay
549fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  // concrete and require clients to pass in a target like object. The other
550fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  // option is to make this abstract, and have targets provide concrete
551fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  // implementations as we do with AsmParser.
552fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  MCAssembler(raw_ostream &OS);
553fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  ~MCAssembler();
554fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
555fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  /// Finish - Do final processing and write the object to the output stream.
556fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  void Finish();
557fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
5586009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar  // FIXME: This does not belong here.
5596009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar  bool getSubsectionsViaSymbols() const {
5606009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar    return SubsectionsViaSymbols;
5616009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar  }
5626009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar  void setSubsectionsViaSymbols(bool Value) {
5636009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar    SubsectionsViaSymbols = Value;
5646009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar  }
5656009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar
566fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  /// @name Section List Access
567fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  /// @{
568fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
569fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  const SectionDataListType &getSectionList() const { return Sections; }
570fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  SectionDataListType &getSectionList() { return Sections; }
571fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
572fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  iterator begin() { return Sections.begin(); }
573fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  const_iterator begin() const { return Sections.begin(); }
574fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
575fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  iterator end() { return Sections.end(); }
576fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  const_iterator end() const { return Sections.end(); }
577fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
578fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  size_t size() const { return Sections.size(); }
579fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
580fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  /// @}
581f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  /// @name Symbol List Access
582f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  /// @{
583f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
584f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  const SymbolDataListType &getSymbolList() const { return Symbols; }
585f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  SymbolDataListType &getSymbolList() { return Symbols; }
586f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
587f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  symbol_iterator symbol_begin() { return Symbols.begin(); }
588f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  const_symbol_iterator symbol_begin() const { return Symbols.begin(); }
589f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
590f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  symbol_iterator symbol_end() { return Symbols.end(); }
591f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  const_symbol_iterator symbol_end() const { return Symbols.end(); }
592f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
593f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  size_t symbol_size() const { return Symbols.size(); }
594f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
595f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  /// @}
5960c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  /// @name Indirect Symbol List Access
5970c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  /// @{
5980c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar
5990c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  // FIXME: This is a total hack, this should not be here. Once things are
6000c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  // factored so that the streamer has direct access to the .o writer, it can
6010c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  // disappear.
6020c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  std::vector<IndirectSymbolData> &getIndirectSymbols() {
6030c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar    return IndirectSymbols;
6040c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  }
6050c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar
6060c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  indirect_symbol_iterator indirect_symbol_begin() {
6070c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar    return IndirectSymbols.begin();
6080c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  }
6090c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar
6100c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  indirect_symbol_iterator indirect_symbol_end() {
6110c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar    return IndirectSymbols.end();
6120c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  }
6130c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar
6140c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  size_t indirect_symbol_size() const { return IndirectSymbols.size(); }
6150c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar
6160c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  /// @}
617fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar};
618fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
619fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} // end namespace llvm
620fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
621fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#endif
622