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