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