summaryrefslogtreecommitdiff
path: root/include/llvm/Target/TargetLoweringObjectFile.h
blob: 18ce1de01a00a82ff2008f531dd1dd6d2911713d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
//===-- llvm/Target/TargetLoweringObjectFile.h - Object Info ----*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file implements classes used to handle lowerings specific to common
// object file formats.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_TARGET_TARGETLOWERINGOBJECTFILE_H
#define LLVM_TARGET_TARGETLOWERINGOBJECTFILE_H

// FIXME: Switch to MC.
#include "llvm/Target/TargetAsmInfo.h"

namespace llvm {
  
class TargetLoweringObjectFile {
private:
  mutable StringMap<Section> Sections;
protected:
  
  TargetLoweringObjectFile();
  
  /// TextSection - Section directive for standard text.
  ///
  const Section *TextSection;           // Defaults to ".text".
  
  /// DataSection - Section directive for standard data.
  ///
  const Section *DataSection;           // Defaults to ".data".
  
  
  
  // FIXME: SINK THESE.
  const Section *BSSSection_;

  /// ReadOnlySection - This is the directive that is emitted to switch to a
  /// read-only section for constant data (e.g. data declared const,
  /// jump tables).
  const Section *ReadOnlySection;       // Defaults to NULL
  
  /// TLSDataSection - Section directive for Thread Local data.
  ///
  const Section *TLSDataSection;        // Defaults to ".tdata".
  
  /// TLSBSSSection - Section directive for Thread Local uninitialized data.
  /// Null if this target doesn't support a BSS section.
  ///
  const Section *TLSBSSSection;         // Defaults to ".tbss".
  
  const Section *CStringSection_;
  
public:
  // FIXME: NONPUB.
  const Section *getOrCreateSection(const char *Name,
                                    bool isDirective,
                                    SectionKind::Kind K) const;
public:
  
  virtual ~TargetLoweringObjectFile();
  
  const Section *getTextSection() const { return TextSection; }
  const Section *getDataSection() const { return DataSection; }
  
  
  /// getSectionForMergeableConstant - Given a mergeable constant with the
  /// specified size and relocation information, return a section that it
  /// should be placed in.
  virtual const Section *
  getSectionForMergeableConstant(SectionKind Kind) const;
  
  /// getKindForNamedSection - If this target wants to be able to override
  /// section flags based on the name of the section specified for a global
  /// variable, it can implement this.  This is used on ELF systems so that
  /// ".tbss" gets the TLS bit set etc.
  virtual SectionKind::Kind getKindForNamedSection(const char *Section,
                                                   SectionKind::Kind K) const{
    return K;
  }
  
  /// SectionForGlobal - This method computes the appropriate section to emit
  /// the specified global variable or function definition.  This should not
  /// be passed external (or available externally) globals.
  const Section *SectionForGlobal(const GlobalValue *GV,
                                  const TargetMachine &TM) const;
  
  /// getSpecialCasedSectionGlobals - Allow the target to completely override
  /// section assignment of a global.
  /// FIXME: ELIMINATE this by making PIC16 implement ADDRESS with
  /// getFlagsForNamedSection.
  virtual const Section *
  getSpecialCasedSectionGlobals(const GlobalValue *GV,
                                SectionKind Kind) const {
    return 0;
  }
  
  /// getSectionFlagsAsString - Turn the flags in the specified SectionKind
  /// into a string that can be printed to the assembly file after the
  /// ".section foo" part of a section directive.
  virtual void getSectionFlagsAsString(SectionKind Kind,
                                       SmallVectorImpl<char> &Str) const {
  }
  
protected:
  virtual const Section *SelectSectionForGlobal(const GlobalValue *GV,
                                                SectionKind Kind,
                                                const TargetMachine &TM) const;
};
  
  
  

class TargetLoweringObjectFileELF : public TargetLoweringObjectFile {
  bool AtIsCommentChar;  // True if @ is the comment character on this target.
public:
  /// ELF Constructor - AtIsCommentChar is true if the CommentCharacter from TAI
  /// is "@".
  TargetLoweringObjectFileELF(bool AtIsCommentChar = false,
                              // FIXME: REMOVE AFTER UNIQUING IS FIXED.
                              bool HasCrazyBSS = false);
  
  /// getSectionForMergeableConstant - Given a mergeable constant with the
  /// specified size and relocation information, return a section that it
  /// should be placed in.
  virtual const Section *
  getSectionForMergeableConstant(SectionKind Kind) const;
  
  virtual SectionKind::Kind getKindForNamedSection(const char *Section,
                                                   SectionKind::Kind K) const;
  void getSectionFlagsAsString(SectionKind Kind,
                               SmallVectorImpl<char> &Str) const;
  
  virtual const Section* SelectSectionForGlobal(const GlobalValue *GV,
                                                SectionKind Kind,
                                                const TargetMachine &TM) const;
protected:
  const Section *DataRelSection;
  const Section *DataRelLocalSection;
  const Section *DataRelROSection;
  const Section *DataRelROLocalSection;
  
  const Section *MergeableConst4Section;
  const Section *MergeableConst8Section;
  const Section *MergeableConst16Section;
};

class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
  const Section *TextCoalSection;
  const Section *ConstTextCoalSection;
  const Section *ConstDataCoalSection;
  const Section *ConstDataSection;
  const Section *DataCoalSection;
  const Section *FourByteConstantSection;
  const Section *EightByteConstantSection;
  const Section *SixteenByteConstantSection;
public:
  TargetLoweringObjectFileMachO();
  virtual const Section *SelectSectionForGlobal(const GlobalValue *GV,
                                                SectionKind Kind,
                                                const TargetMachine &TM) const;
  
  virtual const Section *
  getSectionForMergeableConstant(SectionKind Kind) const;
};



class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
public:
  TargetLoweringObjectFileCOFF();
  virtual void getSectionFlagsAsString(SectionKind Kind,
                                       SmallVectorImpl<char> &Str) const;
  
  virtual const Section *
  SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
                         const TargetMachine &TM) const;
};

} // end namespace llvm

#endif