blob: c5a21312140bb7bcf7d368ae601c191ecf21fa6e [file] [log] [blame]
Sam Clegg9fa8af62017-06-21 20:58:17 +00001//===- llvm/MC/MCWinCOFFStreamer.cpp --------------------------------------===//
Chris Lattner56725be2010-07-11 22:05:00 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Chris Lattner56725be2010-07-11 22:05:00 +00006//
7//===----------------------------------------------------------------------===//
8//
Saleem Abdulrasoolcf1a29f2014-04-27 03:48:05 +00009// This file contains an implementation of a Windows COFF object file streamer.
Chris Lattner56725be2010-07-11 22:05:00 +000010//
11//===----------------------------------------------------------------------===//
12
Eugene Zelenko1d435522017-02-07 23:02:00 +000013#include "llvm/ADT/SmallString.h"
14#include "llvm/ADT/SmallVector.h"
15#include "llvm/ADT/Triple.h"
16#include "llvm/ADT/Twine.h"
Zachary Turner264b5d92017-06-07 03:48:56 +000017#include "llvm/BinaryFormat/COFF.h"
Evan Cheng5928e692011-07-25 23:24:55 +000018#include "llvm/MC/MCAsmBackend.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000019#include "llvm/MC/MCAssembler.h"
20#include "llvm/MC/MCCodeEmitter.h"
21#include "llvm/MC/MCContext.h"
22#include "llvm/MC/MCExpr.h"
Eugene Zelenko1d435522017-02-07 23:02:00 +000023#include "llvm/MC/MCFixup.h"
24#include "llvm/MC/MCFragment.h"
Rafael Espindolae308c0c2014-01-23 22:49:25 +000025#include "llvm/MC/MCObjectFileInfo.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000026#include "llvm/MC/MCObjectStreamer.h"
Peter Collingbournef7b81db2018-05-18 18:26:45 +000027#include "llvm/MC/MCObjectWriter.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000028#include "llvm/MC/MCSection.h"
Pete Cooperad9f9c32015-06-08 17:17:12 +000029#include "llvm/MC/MCSymbolCOFF.h"
Saleem Abdulrasoolcf1a29f2014-04-27 03:48:05 +000030#include "llvm/MC/MCWinCOFFStreamer.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000031#include "llvm/Support/Casting.h"
Chris Lattner56725be2010-07-11 22:05:00 +000032#include "llvm/Support/ErrorHandling.h"
Saleem Abdulrasool64d491e2014-10-07 19:37:57 +000033#include "llvm/Support/MathExtras.h"
Eugene Zelenko1d435522017-02-07 23:02:00 +000034#include "llvm/Support/SMLoc.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000035#include "llvm/Support/raw_ostream.h"
Eugene Zelenko1d435522017-02-07 23:02:00 +000036#include <algorithm>
37#include <cassert>
38#include <cstdint>
Rafael Espindolad3df3d32011-12-17 01:14:52 +000039
Chris Lattner56725be2010-07-11 22:05:00 +000040using namespace llvm;
41
Chandler Carruthf58e3762014-04-22 03:04:17 +000042#define DEBUG_TYPE "WinCOFFStreamer"
43
Lang Hames02d33052017-10-11 01:57:21 +000044MCWinCOFFStreamer::MCWinCOFFStreamer(MCContext &Context,
45 std::unique_ptr<MCAsmBackend> MAB,
Lang Hames2241ffa2017-10-11 23:34:47 +000046 std::unique_ptr<MCCodeEmitter> CE,
Peter Collingbournef7b81db2018-05-18 18:26:45 +000047 std::unique_ptr<MCObjectWriter> OW)
48 : MCObjectStreamer(Context, std::move(MAB), std::move(OW), std::move(CE)),
Lang Hames2241ffa2017-10-11 23:34:47 +000049 CurSymbol(nullptr) {}
Michael J. Spencere2da0a42010-07-19 06:13:10 +000050
Saleem Abdulrasoolcf1a29f2014-04-27 03:48:05 +000051void MCWinCOFFStreamer::EmitInstToData(const MCInst &Inst,
52 const MCSubtargetInfo &STI) {
53 MCDataFragment *DF = getOrCreateDataFragment();
Chris Lattner56725be2010-07-11 22:05:00 +000054
Saleem Abdulrasoolcf1a29f2014-04-27 03:48:05 +000055 SmallVector<MCFixup, 4> Fixups;
56 SmallString<256> Code;
57 raw_svector_ostream VecOS(Code);
Jim Grosbach91df21f2015-05-15 19:13:16 +000058 getAssembler().getEmitter().encodeInstruction(Inst, VecOS, Fixups, STI);
Saleem Abdulrasoolcf1a29f2014-04-27 03:48:05 +000059
60 // Add the fixups and data.
61 for (unsigned i = 0, e = Fixups.size(); i != e; ++i) {
62 Fixups[i].setOffset(Fixups[i].getOffset() + DF->getContents().size());
63 DF->getFixups().push_back(Fixups[i]);
64 }
Peter Smith57f661b2018-06-06 09:40:06 +000065 DF->setHasInstructions(STI);
Saleem Abdulrasoolcf1a29f2014-04-27 03:48:05 +000066 DF->getContents().append(Code.begin(), Code.end());
67}
68
Rafael Espindola7b61ddf2014-10-15 16:12:52 +000069void MCWinCOFFStreamer::InitSections(bool NoExecStack) {
Rafael Espindolaf2812532014-01-24 02:28:11 +000070 // FIXME: this is identical to the ELF one.
71 // This emulates the same behavior of GNU as. This makes it easier
72 // to compare the output as the major sections are in the same order.
73 SwitchSection(getContext().getObjectFileInfo()->getTextSection());
Rafael Espindola7b514962014-02-04 18:34:04 +000074 EmitCodeAlignment(4);
Rafael Espindolaf2812532014-01-24 02:28:11 +000075
76 SwitchSection(getContext().getObjectFileInfo()->getDataSection());
Rafael Espindola7b514962014-02-04 18:34:04 +000077 EmitCodeAlignment(4);
Rafael Espindolaf2812532014-01-24 02:28:11 +000078
79 SwitchSection(getContext().getObjectFileInfo()->getBSSSection());
Rafael Espindola7b514962014-02-04 18:34:04 +000080 EmitCodeAlignment(4);
Rafael Espindolaf2812532014-01-24 02:28:11 +000081
82 SwitchSection(getContext().getObjectFileInfo()->getTextSection());
Rafael Espindolaf667d922010-09-15 21:48:40 +000083}
84
Rafael Espindolabe991572017-02-10 15:13:12 +000085void MCWinCOFFStreamer::EmitLabel(MCSymbol *S, SMLoc Loc) {
David Majnemer230bbfb2016-07-08 21:54:16 +000086 auto *Symbol = cast<MCSymbolCOFF>(S);
Rafael Espindolabe991572017-02-10 15:13:12 +000087 MCObjectStreamer::EmitLabel(Symbol, Loc);
Rafael Espindola16795802010-11-28 16:22:59 +000088}
89
Saleem Abdulrasoolcf1a29f2014-04-27 03:48:05 +000090void MCWinCOFFStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
Reid Klecknerb2d10cf2019-09-03 18:16:52 +000091 // Let the target do whatever target specific stuff it needs to do.
92 getAssembler().getBackend().handleAssemblerFlag(Flag);
93
94 switch (Flag) {
95 // None of these require COFF specific handling.
96 case MCAF_SyntaxUnified:
97 case MCAF_Code16:
98 case MCAF_Code32:
99 case MCAF_Code64:
100 break;
101 case MCAF_SubsectionsViaSymbols:
102 llvm_unreachable("COFF doesn't support .subsections_via_symbols");
103 }
Chris Lattner56725be2010-07-11 22:05:00 +0000104}
105
Saleem Abdulrasoolcf1a29f2014-04-27 03:48:05 +0000106void MCWinCOFFStreamer::EmitThumbFunc(MCSymbol *Func) {
Jim Grosbach5a2c68d2010-11-05 22:08:08 +0000107 llvm_unreachable("not implemented");
108}
109
David Majnemer230bbfb2016-07-08 21:54:16 +0000110bool MCWinCOFFStreamer::EmitSymbolAttribute(MCSymbol *S,
Saleem Abdulrasoolcf1a29f2014-04-27 03:48:05 +0000111 MCSymbolAttr Attribute) {
David Majnemer230bbfb2016-07-08 21:54:16 +0000112 auto *Symbol = cast<MCSymbolCOFF>(S);
Rafael Espindolab5d316b2015-05-29 20:21:02 +0000113 getAssembler().registerSymbol(*Symbol);
Saleem Abdulrasool8e4fee02014-04-27 03:48:01 +0000114
Michael J. Spencere2da0a42010-07-19 06:13:10 +0000115 switch (Attribute) {
Saleem Abdulrasool8e4fee02014-04-27 03:48:01 +0000116 default: return false;
Michael J. Spencere2da0a42010-07-19 06:13:10 +0000117 case MCSA_WeakReference:
Saleem Abdulrasool8e4fee02014-04-27 03:48:01 +0000118 case MCSA_Weak:
David Majnemer230bbfb2016-07-08 21:54:16 +0000119 Symbol->setIsWeakExternal();
Rafael Espindola4d37b2a2015-05-29 21:45:01 +0000120 Symbol->setExternal(true);
Michael J. Spencere2da0a42010-07-19 06:13:10 +0000121 break;
Michael J. Spencere2da0a42010-07-19 06:13:10 +0000122 case MCSA_Global:
Rafael Espindola4d37b2a2015-05-29 21:45:01 +0000123 Symbol->setExternal(true);
Michael J. Spencere2da0a42010-07-19 06:13:10 +0000124 break;
Lang Hames6d22d8a2016-04-08 17:38:51 +0000125 case MCSA_AltEntry:
Lang Hamesf9033bb2016-04-11 18:33:45 +0000126 llvm_unreachable("COFF doesn't support the .alt_entry attribute");
Michael J. Spencere2da0a42010-07-19 06:13:10 +0000127 }
Saleem Abdulrasool4208b612013-08-09 01:52:03 +0000128
129 return true;
Chris Lattner56725be2010-07-11 22:05:00 +0000130}
131
Saleem Abdulrasoolcf1a29f2014-04-27 03:48:05 +0000132void MCWinCOFFStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
Michael J. Spencere2da0a42010-07-19 06:13:10 +0000133 llvm_unreachable("not implemented");
Chris Lattner56725be2010-07-11 22:05:00 +0000134}
135
David Majnemer230bbfb2016-07-08 21:54:16 +0000136void MCWinCOFFStreamer::BeginCOFFSymbolDef(MCSymbol const *S) {
137 auto *Symbol = cast<MCSymbolCOFF>(S);
Saleem Abdulrasool6663f8f2014-05-22 02:18:10 +0000138 if (CurSymbol)
Oliver Stannard9be59af2015-11-17 10:00:43 +0000139 Error("starting a new symbol definition without completing the "
140 "previous one");
Michael J. Spencere2da0a42010-07-19 06:13:10 +0000141 CurSymbol = Symbol;
Chris Lattner56725be2010-07-11 22:05:00 +0000142}
143
Saleem Abdulrasoolcf1a29f2014-04-27 03:48:05 +0000144void MCWinCOFFStreamer::EmitCOFFSymbolStorageClass(int StorageClass) {
Oliver Stannard9be59af2015-11-17 10:00:43 +0000145 if (!CurSymbol) {
146 Error("storage class specified outside of symbol definition");
147 return;
148 }
Saleem Abdulrasool6663f8f2014-05-22 02:18:10 +0000149
Oliver Stannard9be59af2015-11-17 10:00:43 +0000150 if (StorageClass & ~COFF::SSC_Invalid) {
151 Error("storage class value '" + Twine(StorageClass) +
Saleem Abdulrasool6663f8f2014-05-22 02:18:10 +0000152 "' out of range");
Oliver Stannard9be59af2015-11-17 10:00:43 +0000153 return;
154 }
Michael J. Spencere2da0a42010-07-19 06:13:10 +0000155
Rafael Espindolab5d316b2015-05-29 20:21:02 +0000156 getAssembler().registerSymbol(*CurSymbol);
Pete Cooper6bf1f302015-06-08 17:17:19 +0000157 cast<MCSymbolCOFF>(CurSymbol)->setClass((uint16_t)StorageClass);
Chris Lattner56725be2010-07-11 22:05:00 +0000158}
159
Saleem Abdulrasoolcf1a29f2014-04-27 03:48:05 +0000160void MCWinCOFFStreamer::EmitCOFFSymbolType(int Type) {
Oliver Stannard9be59af2015-11-17 10:00:43 +0000161 if (!CurSymbol) {
162 Error("symbol type specified outside of a symbol definition");
163 return;
164 }
Saleem Abdulrasool6663f8f2014-05-22 02:18:10 +0000165
Oliver Stannard9be59af2015-11-17 10:00:43 +0000166 if (Type & ~0xffff) {
167 Error("type value '" + Twine(Type) + "' out of range");
168 return;
169 }
Michael J. Spencere2da0a42010-07-19 06:13:10 +0000170
Rafael Espindolab5d316b2015-05-29 20:21:02 +0000171 getAssembler().registerSymbol(*CurSymbol);
Pete Cooperad9f9c32015-06-08 17:17:12 +0000172 cast<MCSymbolCOFF>(CurSymbol)->setType((uint16_t)Type);
Chris Lattner56725be2010-07-11 22:05:00 +0000173}
174
Saleem Abdulrasoolcf1a29f2014-04-27 03:48:05 +0000175void MCWinCOFFStreamer::EndCOFFSymbolDef() {
Saleem Abdulrasool6663f8f2014-05-22 02:18:10 +0000176 if (!CurSymbol)
Oliver Stannard9be59af2015-11-17 10:00:43 +0000177 Error("ending symbol definition without starting one");
Craig Topperbb694de2014-04-13 04:57:38 +0000178 CurSymbol = nullptr;
Chris Lattner56725be2010-07-11 22:05:00 +0000179}
180
David Majnemer4eecd302015-05-30 04:56:02 +0000181void MCWinCOFFStreamer::EmitCOFFSafeSEH(MCSymbol const *Symbol) {
David Majnemer279306c2015-06-01 07:34:26 +0000182 // SafeSEH is a feature specific to 32-bit x86. It does not exist (and is
183 // unnecessary) on all platforms which use table-based exception dispatch.
184 if (getContext().getObjectFileInfo()->getTargetTriple().getArch() !=
185 Triple::x86)
186 return;
187
Reid Kleckner2bc93ca2015-06-10 01:02:30 +0000188 const MCSymbolCOFF *CSymbol = cast<MCSymbolCOFF>(Symbol);
189 if (CSymbol->isSafeSEH())
David Majnemer4eecd302015-05-30 04:56:02 +0000190 return;
191
192 MCSection *SXData = getContext().getObjectFileInfo()->getSXDataSection();
193 getAssembler().registerSection(*SXData);
194 if (SXData->getAlignment() < 4)
Guillaume Chatelet18f805a2019-09-27 12:54:21 +0000195 SXData->setAlignment(Align(4));
David Majnemer4eecd302015-05-30 04:56:02 +0000196
Adrian McCarthy75248a72017-11-08 18:57:02 +0000197 new MCSymbolIdFragment(Symbol, SXData);
David Majnemer4eecd302015-05-30 04:56:02 +0000198
199 getAssembler().registerSymbol(*Symbol);
Reid Kleckner2bc93ca2015-06-10 01:02:30 +0000200 CSymbol->setIsSafeSEH();
201
202 // The Microsoft linker requires that the symbol type of a handler be
203 // function. Go ahead and oblige it here.
204 CSymbol->setType(COFF::IMAGE_SYM_DTYPE_FUNCTION
205 << COFF::SCT_COMPLEX_TYPE_SHIFT);
David Majnemer4eecd302015-05-30 04:56:02 +0000206}
207
Adrian McCarthydb2736d2018-01-09 23:49:30 +0000208void MCWinCOFFStreamer::EmitCOFFSymbolIndex(MCSymbol const *Symbol) {
209 MCSection *Sec = getCurrentSectionOnly();
210 getAssembler().registerSection(*Sec);
211 if (Sec->getAlignment() < 4)
Guillaume Chatelet18f805a2019-09-27 12:54:21 +0000212 Sec->setAlignment(Align(4));
Adrian McCarthydb2736d2018-01-09 23:49:30 +0000213
214 new MCSymbolIdFragment(Symbol, getCurrentSectionOnly());
215
216 getAssembler().registerSymbol(*Symbol);
217}
218
Reid Kleckner40a47a82017-06-22 21:02:14 +0000219void MCWinCOFFStreamer::EmitCOFFSectionIndex(const MCSymbol *Symbol) {
220 visitUsedSymbol(*Symbol);
Timur Iskhodzhanovc1fb2d62013-12-20 18:15:00 +0000221 MCDataFragment *DF = getOrCreateDataFragment();
Jim Grosbach13760bd2015-05-30 01:25:56 +0000222 const MCSymbolRefExpr *SRE = MCSymbolRefExpr::create(Symbol, getContext());
Jim Grosbach63661f82015-05-15 19:13:05 +0000223 MCFixup Fixup = MCFixup::create(DF->getContents().size(), SRE, FK_SecRel_2);
Saleem Abdulrasool8e4fee02014-04-27 03:48:01 +0000224 DF->getFixups().push_back(Fixup);
Timur Iskhodzhanov5fcaeeb2014-10-08 18:01:49 +0000225 DF->getContents().resize(DF->getContents().size() + 2, 0);
Timur Iskhodzhanovc1fb2d62013-12-20 18:15:00 +0000226}
227
Reid Kleckner40a47a82017-06-22 21:02:14 +0000228void MCWinCOFFStreamer::EmitCOFFSecRel32(const MCSymbol *Symbol,
Keno Fischerf7d84ee2017-01-02 03:00:19 +0000229 uint64_t Offset) {
Reid Kleckner40a47a82017-06-22 21:02:14 +0000230 visitUsedSymbol(*Symbol);
Rafael Espindolad3df3d32011-12-17 01:14:52 +0000231 MCDataFragment *DF = getOrCreateDataFragment();
Keno Fischerf7d84ee2017-01-02 03:00:19 +0000232 // Create Symbol A for the relocation relative reference.
233 const MCExpr *MCE = MCSymbolRefExpr::create(Symbol, getContext());
234 // Add the constant offset, if given.
235 if (Offset)
236 MCE = MCBinaryExpr::createAdd(
237 MCE, MCConstantExpr::create(Offset, getContext()), getContext());
238 // Build the secrel32 relocation.
239 MCFixup Fixup = MCFixup::create(DF->getContents().size(), MCE, FK_SecRel_4);
240 // Record the relocation.
Saleem Abdulrasool8e4fee02014-04-27 03:48:01 +0000241 DF->getFixups().push_back(Fixup);
Keno Fischerf7d84ee2017-01-02 03:00:19 +0000242 // Emit 4 bytes (zeros) to the object file.
Rafael Espindolad3df3d32011-12-17 01:14:52 +0000243 DF->getContents().resize(DF->getContents().size() + 4, 0);
244}
245
Martin Storsjo390bce42018-07-26 20:11:26 +0000246void MCWinCOFFStreamer::EmitCOFFImgRel32(const MCSymbol *Symbol,
247 int64_t Offset) {
248 visitUsedSymbol(*Symbol);
249 MCDataFragment *DF = getOrCreateDataFragment();
250 // Create Symbol A for the relocation relative reference.
251 const MCExpr *MCE = MCSymbolRefExpr::create(
252 Symbol, MCSymbolRefExpr::VK_COFF_IMGREL32, getContext());
253 // Add the constant offset, if given.
254 if (Offset)
255 MCE = MCBinaryExpr::createAdd(
256 MCE, MCConstantExpr::create(Offset, getContext()), getContext());
257 // Build the imgrel relocation.
258 MCFixup Fixup = MCFixup::create(DF->getContents().size(), MCE, FK_Data_4);
259 // Record the relocation.
260 DF->getFixups().push_back(Fixup);
261 // Emit 4 bytes (zeros) to the object file.
262 DF->getContents().resize(DF->getContents().size() + 4, 0);
263}
264
David Majnemer230bbfb2016-07-08 21:54:16 +0000265void MCWinCOFFStreamer::EmitCommonSymbol(MCSymbol *S, uint64_t Size,
Saleem Abdulrasoolcf1a29f2014-04-27 03:48:05 +0000266 unsigned ByteAlignment) {
David Majnemer230bbfb2016-07-08 21:54:16 +0000267 auto *Symbol = cast<MCSymbolCOFF>(S);
David Majnemera9bdb322014-04-08 22:33:40 +0000268
David Majnemer48227a32014-09-21 09:18:07 +0000269 const Triple &T = getContext().getObjectFileInfo()->getTargetTriple();
Reid Kleckner2f07c2e2019-07-08 21:05:20 +0000270 if (T.isWindowsMSVCEnvironment()) {
David Majnemer48227a32014-09-21 09:18:07 +0000271 if (ByteAlignment > 32)
272 report_fatal_error("alignment is limited to 32-bytes");
Saleem Abdulrasool64d491e2014-10-07 19:37:57 +0000273
David Majnemerd7586042014-10-08 06:38:53 +0000274 // Round size up to alignment so that we will honor the alignment request.
275 Size = std::max(Size, static_cast<uint64_t>(ByteAlignment));
276 }
David Majnemera9bdb322014-04-08 22:33:40 +0000277
Rafael Espindolab5d316b2015-05-29 20:21:02 +0000278 getAssembler().registerSymbol(*Symbol);
Rafael Espindola4d37b2a2015-05-29 21:45:01 +0000279 Symbol->setExternal(true);
Rafael Espindola14672502015-05-29 17:48:04 +0000280 Symbol->setCommon(Size, ByteAlignment);
Saleem Abdulrasool64d491e2014-10-07 19:37:57 +0000281
Reid Kleckner2f07c2e2019-07-08 21:05:20 +0000282 if (!T.isWindowsMSVCEnvironment() && ByteAlignment > 1) {
Saleem Abdulrasool64d491e2014-10-07 19:37:57 +0000283 SmallString<128> Directive;
284 raw_svector_ostream OS(Directive);
285 const MCObjectFileInfo *MFI = getContext().getObjectFileInfo();
286
287 OS << " -aligncomm:\"" << Symbol->getName() << "\","
288 << Log2_32_Ceil(ByteAlignment);
Saleem Abdulrasool64d491e2014-10-07 19:37:57 +0000289
290 PushSection();
291 SwitchSection(MFI->getDrectveSection());
292 EmitBytes(Directive);
293 PopSection();
294 }
Chris Lattner56725be2010-07-11 22:05:00 +0000295}
296
David Majnemer230bbfb2016-07-08 21:54:16 +0000297void MCWinCOFFStreamer::EmitLocalCommonSymbol(MCSymbol *S, uint64_t Size,
Saleem Abdulrasoolcf1a29f2014-04-27 03:48:05 +0000298 unsigned ByteAlignment) {
David Majnemer230bbfb2016-07-08 21:54:16 +0000299 auto *Symbol = cast<MCSymbolCOFF>(S);
David Majnemera9bdb322014-04-08 22:33:40 +0000300
Rafael Espindola0709a7b2015-05-21 19:20:38 +0000301 MCSection *Section = getContext().getObjectFileInfo()->getBSSSection();
Rafael Espindola07657a82018-01-09 21:55:10 +0000302 PushSection();
303 SwitchSection(Section);
304 EmitValueToAlignment(ByteAlignment, 0, 1, 0);
305 EmitLabel(Symbol);
Rafael Espindola4d37b2a2015-05-29 21:45:01 +0000306 Symbol->setExternal(false);
Rafael Espindola07657a82018-01-09 21:55:10 +0000307 EmitZeros(Size);
308 PopSection();
Chris Lattner56725be2010-07-11 22:05:00 +0000309}
310
Rafael Espindola0709a7b2015-05-21 19:20:38 +0000311void MCWinCOFFStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol,
Francis Visoiu Mistrih4d5b1072018-07-02 17:29:43 +0000312 uint64_t Size, unsigned ByteAlignment,
313 SMLoc Loc) {
Michael J. Spencere2da0a42010-07-19 06:13:10 +0000314 llvm_unreachable("not implemented");
Chris Lattner56725be2010-07-11 22:05:00 +0000315}
316
Rafael Espindola0709a7b2015-05-21 19:20:38 +0000317void MCWinCOFFStreamer::EmitTBSSSymbol(MCSection *Section, MCSymbol *Symbol,
318 uint64_t Size, unsigned ByteAlignment) {
Michael J. Spencere2da0a42010-07-19 06:13:10 +0000319 llvm_unreachable("not implemented");
Chris Lattner56725be2010-07-11 22:05:00 +0000320}
321
Rafael Espindola5645bad2013-10-16 01:05:45 +0000322// TODO: Implement this if you want to emit .comment section in COFF obj files.
Saleem Abdulrasoolcf1a29f2014-04-27 03:48:05 +0000323void MCWinCOFFStreamer::EmitIdent(StringRef IdentString) {
Saleem Abdulrasool8e4fee02014-04-27 03:48:01 +0000324 llvm_unreachable("not implemented");
Rafael Espindola5645bad2013-10-16 01:05:45 +0000325}
326
Reid Klecknere52d1e62017-10-10 01:26:25 +0000327void MCWinCOFFStreamer::EmitWinEHHandlerData(SMLoc Loc) {
Saleem Abdulrasoola8b1f722014-04-27 03:48:12 +0000328 llvm_unreachable("not implemented");
Charles Davis1c8bd5a2011-05-22 03:01:05 +0000329}
330
Saleem Abdulrasoolcf1a29f2014-04-27 03:48:05 +0000331void MCWinCOFFStreamer::FinishImpl() {
Rafael Espindola07082092012-01-07 03:13:18 +0000332 MCObjectStreamer::FinishImpl();
Chris Lattner56725be2010-07-11 22:05:00 +0000333}
Saleem Abdulrasool6663f8f2014-05-22 02:18:10 +0000334
Oliver Stannard9be59af2015-11-17 10:00:43 +0000335void MCWinCOFFStreamer::Error(const Twine &Msg) const {
336 getContext().reportError(SMLoc(), Msg);
Saleem Abdulrasool6663f8f2014-05-22 02:18:10 +0000337}