14 #define DEBUG_TYPE "WinCOFFStreamer"
52 virtual void InitSections();
53 virtual void InitToTextSection();
54 virtual void EmitLabel(
MCSymbol *Symbol);
55 virtual void EmitDebugLabel(
MCSymbol *Symbol);
59 virtual void EmitSymbolDesc(
MCSymbol *Symbol,
unsigned DescValue);
60 virtual void BeginCOFFSymbolDef(
MCSymbol const *Symbol);
61 virtual void EmitCOFFSymbolStorageClass(
int StorageClass);
62 virtual void EmitCOFFSymbolType(
int Type);
63 virtual void EndCOFFSymbolDef();
64 virtual void EmitCOFFSecRel32(
MCSymbol const *Symbol);
66 virtual void EmitCommonSymbol(
MCSymbol *Symbol, uint64_t Size,
67 unsigned ByteAlignment);
68 virtual void EmitLocalCommonSymbol(
MCSymbol *Symbol, uint64_t Size,
69 unsigned ByteAlignment);
71 uint64_t Size,
unsigned ByteAlignment);
73 uint64_t Size,
unsigned ByteAlignment);
74 virtual void EmitFileDirective(
StringRef Filename);
75 virtual void EmitIdent(
StringRef IdentString);
76 virtual void EmitWin64EHHandlerData();
77 virtual void FinishImpl();
80 virtual void EmitInstToData(
const MCInst &Inst) {
86 getAssembler().getEmitter().EncodeInstruction(Inst, VecOS, Fixups);
90 for (
unsigned i = 0, e = Fixups.
size(); i != e; ++i) {
100 SwitchSection(getContext().getCOFFSection(Section, Characteristics, Kind));
103 void SetSectionText() {
105 COFF::IMAGE_SCN_CNT_CODE
106 | COFF::IMAGE_SCN_MEM_EXECUTE
107 | COFF::IMAGE_SCN_MEM_READ,
109 EmitCodeAlignment(4, 0);
112 void SetSectionData() {
114 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
115 | COFF::IMAGE_SCN_MEM_READ
116 | COFF::IMAGE_SCN_MEM_WRITE,
118 EmitCodeAlignment(4, 0);
121 void SetSectionBSS() {
123 COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA
124 | COFF::IMAGE_SCN_MEM_READ
125 | COFF::IMAGE_SCN_MEM_WRITE,
127 EmitCodeAlignment(4, 0);
136 void WinCOFFStreamer::AddCommonSymbol(
MCSymbol *
Symbol, uint64_t Size,
138 assert(!Symbol->
isInSection() &&
"Symbol must not already have a section!");
140 std::string SectionName(
".bss$linkonce");
143 MCSymbolData &SymbolData = getAssembler().getOrCreateSymbolData(*Symbol);
146 COFF::IMAGE_SCN_LNK_COMDAT |
147 COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
148 COFF::IMAGE_SCN_MEM_READ |
149 COFF::IMAGE_SCN_MEM_WRITE;
154 SectionName, Characteristics, SectionKind::getBSS(), Selection);
156 MCSectionData &SectionData = getAssembler().getOrCreateSectionData(*Section);
163 AssignSection(Symbol, Section);
165 if (ByteAlignment != 1)
173 void WinCOFFStreamer::InitToTextSection() {
177 void WinCOFFStreamer::InitSections() {
184 void WinCOFFStreamer::EmitLabel(
MCSymbol *Symbol) {
185 assert(Symbol->
isUndefined() &&
"Cannot define a symbol twice!");
186 MCObjectStreamer::EmitLabel(Symbol);
189 void WinCOFFStreamer::EmitDebugLabel(
MCSymbol *Symbol) {
200 bool WinCOFFStreamer::EmitSymbolAttribute(
MCSymbol *Symbol,
202 assert(Symbol &&
"Symbol must be non-null!");
205 :
true) &&
"Got non COFF section in the COFF backend!");
209 MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol);
216 getAssembler().getOrCreateSymbolData(*Symbol).setExternal(
true);
226 void WinCOFFStreamer::EmitSymbolDesc(
MCSymbol *Symbol,
unsigned DescValue) {
230 void WinCOFFStreamer::BeginCOFFSymbolDef(
MCSymbol const *Symbol) {
233 :
true) &&
"Got non COFF section in the COFF backend!");
234 assert(CurSymbol == NULL &&
"EndCOFFSymbolDef must be called between calls "
235 "to BeginCOFFSymbolDef!");
239 void WinCOFFStreamer::EmitCOFFSymbolStorageClass(
int StorageClass) {
240 assert(CurSymbol != NULL &&
"BeginCOFFSymbolDef must be called first!");
241 assert((StorageClass & ~0xFF) == 0 &&
"StorageClass must only have data in "
244 getAssembler().getOrCreateSymbolData(*CurSymbol).modifyFlags(
249 void WinCOFFStreamer::EmitCOFFSymbolType(
int Type) {
250 assert(CurSymbol != NULL &&
"BeginCOFFSymbolDef must be called first!");
251 assert((Type & ~0xFFFF) == 0 &&
"Type must only have data in the first 2 "
254 getAssembler().getOrCreateSymbolData(*CurSymbol).modifyFlags(
259 void WinCOFFStreamer::EndCOFFSymbolDef() {
260 assert(CurSymbol != NULL &&
"BeginCOFFSymbolDef must be called first!");
264 void WinCOFFStreamer::EmitCOFFSecRel32(
MCSymbol const *Symbol)
270 MCSymbolRefExpr::Create (Symbol, getContext ()),
279 void WinCOFFStreamer::EmitCommonSymbol(
MCSymbol *Symbol, uint64_t Size,
280 unsigned ByteAlignment) {
283 :
true) &&
"Got non COFF section in the COFF backend!");
284 AddCommonSymbol(Symbol, Size, ByteAlignment,
true);
287 void WinCOFFStreamer::EmitLocalCommonSymbol(
MCSymbol *Symbol, uint64_t Size,
288 unsigned ByteAlignment) {
291 :
true) &&
"Got non COFF section in the COFF backend!");
292 AddCommonSymbol(Symbol, Size, ByteAlignment,
false);
296 uint64_t Size,
unsigned ByteAlignment) {
301 uint64_t Size,
unsigned ByteAlignment) {
305 void WinCOFFStreamer::EmitFileDirective(
StringRef Filename) {
311 void WinCOFFStreamer::EmitIdent(
StringRef IdentString) {
315 void WinCOFFStreamer::EmitWin64EHHandlerData() {
316 MCStreamer::EmitWin64EHHandlerData();
323 void WinCOFFStreamer::FinishImpl() {
325 MCObjectStreamer::FinishImpl();
335 WinCOFFStreamer *S =
new WinCOFFStreamer(Context, MAB, CE, OS);
336 S->getAssembler().setRelaxAll(RelaxAll);
void setExternal(bool Value)
SectionVariant getVariant() const
static SectionKind getDataRel()
virtual SmallVectorImpl< char > & getContents()
COFF::SymbolStorageClass StorageClass
static void EmitUnwindInfo(MCStreamer &streamer, MCWin64EHUnwindInfo *info)
SmallVectorImpl< MCFixup > & getFixups()
static SectionKind getBSS()
const MCSection & getSection() const
#define llvm_unreachable(msg)
A four-byte section relative fixup.
Streaming object file generation interface.
MCStreamer * createWinCOFFStreamer(MCContext &Ctx, MCAsmBackend &TAB, MCCodeEmitter &CE, raw_ostream &OS, bool RelaxAll=false)
MCCodeEmitter - Generic instruction encoding interface.
void append(in_iter in_start, in_iter in_end)
unsigned getAlignment() const
StringRef getName() const
getName - Get the symbol name.
void setFragment(MCFragment *Value)
void setAlignment(unsigned Value)
LLVM Value Representation.
MCAsmBackend - Generic interface to target specific assembler backends.
cl::opt< bool > RelaxAll("mc-relax-all", cl::desc("When used with filetype=obj, ""relax all fixups in the emitted object file"))
bool isUndefined() const
isUndefined - Check if this symbol undefined (i.e., implicitly defined).
COFF::SectionCharacteristics Characteristics
void modifyFlags(uint32_t Value, uint32_t Mask)
modifyFlags - Modify the flags via a mask
static SectionKind getText()