MCAssembler.h revision 1f2b32c5c6502c74890c188b0224e4c01ff22da4
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 13fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/ADT/ilist.h" 14fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/ADT/ilist_node.h" 151f2b32c5c6502c74890c188b0224e4c01ff22da4Benjamin Kramer#include "llvm/Support/DataTypes.h" 16fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 17fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarnamespace llvm { 18fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass raw_ostream; 19fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCAssembler; 20fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCSection; 21fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCSectionData; 22fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 23fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCFragment : public ilist_node<MCFragment> { 24fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar MCFragment(const MCFragment&); // DO NOT IMPLEMENT 25fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar void operator=(const MCFragment&); // DO NOT IMPLEMENT 26fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 27fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarpublic: 28fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar MCFragment(MCSectionData *SD = 0); 29fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}; 30fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 31fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// FIXME: Should this be a separate class, or just merged into MCSection? Since 32fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// we anticipate the fast path being through an MCAssembler, the only reason to 33fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// keep it out is for API abstraction. 34fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCSectionData : public ilist_node<MCSectionData> { 35fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar MCSectionData(const MCSectionData&); // DO NOT IMPLEMENT 36fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar void operator=(const MCSectionData&); // DO NOT IMPLEMENT 37fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 38fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarpublic: 39fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar typedef iplist<MCFragment> FragmentListType; 40fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 41fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarprivate: 42fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar iplist<MCFragment> Fragments; 43fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar const MCSection &Section; 44fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 45fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// Alignment - The maximum alignment seen in this section. 46fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar unsigned Alignment; 47fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 48fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// @name Assembler Backend Data 49fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// @{ 50fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar // 51fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar // FIXME: This could all be kept private to the assembler implementation. 52fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 53fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// FileOffset - The offset of this section in the object file. 54fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar uint64_t FileOffset; 55fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 56fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// FileSize - The size of this section in the object file. 57fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar uint64_t FileSize; 58fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 59fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// @} 60fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 61fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarpublic: 62fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar // Only for use as sentinel. 63fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar MCSectionData(); 64fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar MCSectionData(const MCSection &Section, MCAssembler *A = 0); 65fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 66fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar const FragmentListType &getFragmentList() const { return Fragments; } 67fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar FragmentListType &getFragmentList() { return Fragments; } 68fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 69fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar const MCSection &getSection() const { return Section; } 70fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 71fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar unsigned getAlignment() const { return Alignment; } 72fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar void setAlignment(unsigned Value) { Alignment = Value; } 73fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 74fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// @name Assembler Backend Support 75fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// @{ 76fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar // 77fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar // FIXME: This could all be kept private to the assembler implementation. 78fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 79fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar unsigned getFileSize() const { return FileSize; } 80fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 81fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar uint64_t getFileOffset() const { return FileOffset; } 82fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar void setFileOffset(uint64_t Value) { FileOffset = Value; } 83fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 84fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar void WriteFileData(raw_ostream &OS) const; 85fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 86fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// @} 87fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}; 88fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 89fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCAssembler { 90fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarpublic: 91fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar typedef iplist<MCSectionData> SectionDataListType; 92fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 93fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar typedef SectionDataListType::const_iterator const_iterator; 94fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar typedef SectionDataListType::iterator iterator; 95fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 96fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarprivate: 97fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar MCAssembler(const MCAssembler&); // DO NOT IMPLEMENT 98fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar void operator=(const MCAssembler&); // DO NOT IMPLEMENT 99fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 100fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar raw_ostream &OS; 101fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 102fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar iplist<MCSectionData> Sections; 103fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 104fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarpublic: 105fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// Construct a new assembler instance. 106fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// 107fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// \arg OS - The stream to output to. 108fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar // 109fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar // FIXME: How are we going to parameterize this? Two obvious options are stay 110fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar // concrete and require clients to pass in a target like object. The other 111fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar // option is to make this abstract, and have targets provide concrete 112fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar // implementations as we do with AsmParser. 113fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar MCAssembler(raw_ostream &OS); 114fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar ~MCAssembler(); 115fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 116fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// Finish - Do final processing and write the object to the output stream. 117fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar void Finish(); 118fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 119fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// @name Section List Access 120fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// @{ 121fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 122fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar const SectionDataListType &getSectionList() const { return Sections; } 123fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar SectionDataListType &getSectionList() { return Sections; } 124fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 125fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar iterator begin() { return Sections.begin(); } 126fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar const_iterator begin() const { return Sections.begin(); } 127fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 128fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar iterator end() { return Sections.end(); } 129fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar const_iterator end() const { return Sections.end(); } 130fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 131fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar size_t size() const { return Sections.size(); } 132fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 133fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// @} 134fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}; 135fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 136fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} // end namespace llvm 137fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 138fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#endif 139