18dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar//===- lib/MC/MCObjectStreamer.cpp - Object File MCStreamer Interface -----===//
28dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar//
38dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar//                     The LLVM Compiler Infrastructure
48dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar//
58dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar// This file is distributed under the University of Illinois Open Source
68dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar// License. See LICENSE.TXT for details.
78dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar//
88dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar//===----------------------------------------------------------------------===//
98dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar
108dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar#include "llvm/MC/MCObjectStreamer.h"
11df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne#include "llvm/ADT/STLExtras.h"
12f1d0f7781e766df878bec4e7977fa3204374f394Craig Topper#include "llvm/MC/MCAsmBackend.h"
13f1d0f7781e766df878bec4e7977fa3204374f394Craig Topper#include "llvm/MC/MCAsmInfo.h"
148dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar#include "llvm/MC/MCAssembler.h"
151abcd06856df324eac98d4bf5ba673fb77ae6a11Benjamin Kramer#include "llvm/MC/MCCodeEmitter.h"
1689b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola#include "llvm/MC/MCContext.h"
17f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola#include "llvm/MC/MCDwarf.h"
188067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer#include "llvm/MC/MCExpr.h"
19f1d0f7781e766df878bec4e7977fa3204374f394Craig Topper#include "llvm/MC/MCObjectWriter.h"
20b02f1e9a6bc332ebd77571fdffcdc44d77e76b31Serge Pavlov#include "llvm/MC/MCSection.h"
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCSymbol.h"
22f1d0f7781e766df878bec4e7977fa3204374f394Craig Topper#include "llvm/Support/ErrorHandling.h"
23de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/SourceMgr.h"
244c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/Support/TargetRegistry.h"
258dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbarusing namespace llvm;
268dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesMCObjectStreamer::MCObjectStreamer(MCContext &Context, MCAsmBackend &TAB,
280c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                   raw_pwrite_stream &OS,
290c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                   MCCodeEmitter *Emitter_)
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    : MCStreamer(Context),
315da3665cc501ed8928e63678254357214ec0b9ebChandler Carruth      Assembler(new MCAssembler(Context, TAB, *Emitter_,
32f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                *TAB.createObjectWriter(OS))),
336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      EmitEHFrame(true), EmitDebugFrame(false) {}
348dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar
358dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel DunbarMCObjectStreamer::~MCObjectStreamer() {
361abcd06856df324eac98d4bf5ba673fb77ae6a11Benjamin Kramer  delete &Assembler->getBackend();
371abcd06856df324eac98d4bf5ba673fb77ae6a11Benjamin Kramer  delete &Assembler->getEmitter();
38feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbar  delete &Assembler->getWriter();
398dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar  delete Assembler;
408dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar}
4183b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar
420c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarvoid MCObjectStreamer::flushPendingLabels(MCFragment *F, uint64_t FOffset) {
43f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (PendingLabels.empty())
44f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return;
45f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!F) {
46f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    F = new MCDataFragment();
47f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    MCSection *CurSection = getCurrentSectionOnly();
48f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    CurSection->getFragmentList().insert(CurInsertionPoint, F);
49f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    F->setParent(CurSection);
50f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
51f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (MCSymbol *Sym : PendingLabels) {
52f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    Sym->setFragment(F);
53f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    Sym->setOffset(FOffset);
5437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
55f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  PendingLabels.clear();
5637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
5737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid MCObjectStreamer::emitAbsoluteSymbolDiff(const MCSymbol *Hi,
596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                              const MCSymbol *Lo,
606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                              unsigned Size) {
616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // If not assigned to the same (valid) fragment, fallback.
62f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!Hi->getFragment() || Hi->getFragment() != Lo->getFragment() ||
63f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Hi->isVariable() || Lo->isVariable()) {
646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    MCStreamer::emitAbsoluteSymbolDiff(Hi, Lo, Size);
656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return;
666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  EmitIntValue(Hi->getOffset() - Lo->getOffset(), Size);
696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
715399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigasvoid MCObjectStreamer::reset() {
7299cbdde6198623ff014c776743caec2cf48f4840Pedro Artigas  if (Assembler)
7399cbdde6198623ff014c776743caec2cf48f4840Pedro Artigas    Assembler->reset();
746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  CurInsertionPoint = MCSection::iterator();
75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EmitEHFrame = true;
76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EmitDebugFrame = false;
7737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  PendingLabels.clear();
785399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigas  MCStreamer::reset();
795399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigas}
805399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigas
81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid MCObjectStreamer::EmitFrames(MCAsmBackend *MAB) {
82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!getNumFrameInfos())
83dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return;
84dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (EmitEHFrame)
86dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MCDwarfFrameEmitter::Emit(*this, MAB, true);
87dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (EmitDebugFrame)
89dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MCDwarfFrameEmitter::Emit(*this, MAB, false);
90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
91dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
928067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. SpencerMCFragment *MCObjectStreamer::getCurrentFragment() const {
936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  assert(getCurrentSectionOnly() && "No current section!");
948067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer
956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (CurInsertionPoint != getCurrentSectionOnly()->getFragmentList().begin())
96f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return &*std::prev(CurInsertionPoint);
978067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer
98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return nullptr;
998067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer}
1008067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer
10137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesMCDataFragment *MCObjectStreamer::getOrCreateDataFragment() {
1028067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer  MCDataFragment *F = dyn_cast_or_null<MCDataFragment>(getCurrentFragment());
10367144e37ba5cd35ee917daac631e03963b05a674Derek Schuff  // When bundling is enabled, we don't want to add data to a fragment that
10467144e37ba5cd35ee917daac631e03963b05a674Derek Schuff  // already has instructions (see MCELFStreamer::EmitInstToData for details)
1050c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (!F || (Assembler->isBundlingEnabled() && !Assembler->getRelaxAll() &&
1060c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar             F->hasInstructions())) {
107dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    F = new MCDataFragment();
108df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne    insert(F);
109df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  }
1108067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer  return F;
1118067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer}
1128067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer
113c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesvoid MCObjectStreamer::visitUsedSymbol(const MCSymbol &Sym) {
1146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Assembler->registerSymbol(Sym);
1158067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer}
1168067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer
117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid MCObjectStreamer::EmitCFISections(bool EH, bool Debug) {
118dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCStreamer::EmitCFISections(EH, Debug);
119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EmitEHFrame = EH;
120dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EmitDebugFrame = Debug;
121dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
122dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid MCObjectStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size,
124f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                     SMLoc Loc) {
125c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  MCStreamer::EmitValueImpl(Value, Size, Loc);
1266f95023a7f27075011a6eb7b84e03732b00a785bRafael Espindola  MCDataFragment *DF = getOrCreateDataFragment();
127f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  flushPendingLabels(DF, DF->getContents().size());
1286f95023a7f27075011a6eb7b84e03732b00a785bRafael Espindola
129de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MCCVLineEntry::Make(this);
130de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MCDwarfLineEntry::Make(this, getCurrentSection().first);
13141b646c127300c6e3b83f1a0bfc49c812110ebf4Cameron Zwarich
1326f95023a7f27075011a6eb7b84e03732b00a785bRafael Espindola  // Avoid fixups when possible.
1336f95023a7f27075011a6eb7b84e03732b00a785bRafael Espindola  int64_t AbsValue;
1346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (Value->evaluateAsAbsolute(AbsValue, getAssembler())) {
135a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindola    EmitIntValue(AbsValue, Size);
1362df042cb32ecb8d2e1d499dfa27d5074c8b40e13Rafael Espindola    return;
1376f95023a7f27075011a6eb7b84e03732b00a785bRafael Espindola  }
13864d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky  DF->getFixups().push_back(
1396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      MCFixup::create(DF->getContents().size(), Value,
140dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                      MCFixup::getKindForSize(Size, false), Loc));
1412df042cb32ecb8d2e1d499dfa27d5074c8b40e13Rafael Espindola  DF->getContents().resize(DF->getContents().size() + Size, 0);
1426f95023a7f27075011a6eb7b84e03732b00a785bRafael Espindola}
1436f95023a7f27075011a6eb7b84e03732b00a785bRafael Espindola
144547be2699c547b79a7735858a64921d8ccf180f7Rafael Espindolavoid MCObjectStreamer::EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) {
145c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // We need to create a local symbol to avoid relocations.
1466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Frame.Begin = getContext().createTempSymbol();
147c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  EmitLabel(Frame.Begin);
148547be2699c547b79a7735858a64921d8ccf180f7Rafael Espindola}
149547be2699c547b79a7735858a64921d8ccf180f7Rafael Espindola
1501fe9737eb49ecb80fbb547f0e16e10a726cd53cfRafael Espindolavoid MCObjectStreamer::EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) {
1516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Frame.End = getContext().createTempSymbol();
152c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  EmitLabel(Frame.End);
1531fe9737eb49ecb80fbb547f0e16e10a726cd53cfRafael Espindola}
1541fe9737eb49ecb80fbb547f0e16e10a726cd53cfRafael Espindola
155ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindolavoid MCObjectStreamer::EmitLabel(MCSymbol *Symbol) {
156ed708f9c1facb9928ef2f79503e7030c8f25b00dRafael Espindola  MCStreamer::EmitLabel(Symbol);
157ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola
1586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  getAssembler().registerSymbol(*Symbol);
15937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
16037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // If there is a current fragment, mark the symbol as pointing into it.
16137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // Otherwise queue the label and set its fragment pointer when we emit the
16237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // next fragment.
1630c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  auto *F = dyn_cast_or_null<MCDataFragment>(getCurrentFragment());
1640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (F && !(getAssembler().isBundlingEnabled() &&
1650c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar             getAssembler().getRelaxAll())) {
1666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setFragment(F);
1676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setOffset(F->getContents().size());
16837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  } else {
1696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    PendingLabels.push_back(Symbol);
17037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
171ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola}
172ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola
173e8cfbd843d737e1f95c3032c7670c2be3838a6f6Rafael Espindolavoid MCObjectStreamer::EmitULEB128Value(const MCExpr *Value) {
174660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola  int64_t IntValue;
1756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (Value->evaluateAsAbsolute(IntValue, getAssembler())) {
176e8cfbd843d737e1f95c3032c7670c2be3838a6f6Rafael Espindola    EmitULEB128IntValue(IntValue);
177660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola    return;
178660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola  }
179df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  insert(new MCLEBFragment(*Value, false));
1803ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola}
1813ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
182e8cfbd843d737e1f95c3032c7670c2be3838a6f6Rafael Espindolavoid MCObjectStreamer::EmitSLEB128Value(const MCExpr *Value) {
183660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola  int64_t IntValue;
1846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (Value->evaluateAsAbsolute(IntValue, getAssembler())) {
185e8cfbd843d737e1f95c3032c7670c2be3838a6f6Rafael Espindola    EmitSLEB128IntValue(IntValue);
186660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola    return;
187660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola  }
188df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  insert(new MCLEBFragment(*Value, true));
1893ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola}
1903ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
191484291c27319668ad99cb87def000254357736fbRafael Espindolavoid MCObjectStreamer::EmitWeakReference(MCSymbol *Alias,
192484291c27319668ad99cb87def000254357736fbRafael Espindola                                         const MCSymbol *Symbol) {
193484291c27319668ad99cb87def000254357736fbRafael Espindola  report_fatal_error("This file format doesn't support weak aliases.");
194484291c27319668ad99cb87def000254357736fbRafael Espindola}
195484291c27319668ad99cb87def000254357736fbRafael Espindola
1966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid MCObjectStreamer::ChangeSection(MCSection *Section,
197df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne                                     const MCExpr *Subsection) {
1984c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  changeSectionImpl(Section, Subsection);
1994c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
2004c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
2016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarbool MCObjectStreamer::changeSectionImpl(MCSection *Section,
2024c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                                         const MCExpr *Subsection) {
20383b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar  assert(Section && "Cannot switch to a null section!");
20437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  flushPendingLabels(nullptr);
20583b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar
2066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  bool Created = getAssembler().registerSection(*Section);
207df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne
208df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  int64_t IntSubsection = 0;
209df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  if (Subsection &&
2106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      !Subsection->evaluateAsAbsolute(IntSubsection, getAssembler()))
211df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne    report_fatal_error("Cannot evaluate subsection number");
212df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  if (IntSubsection < 0 || IntSubsection > 8192)
213df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne    report_fatal_error("Subsection number out of range");
214df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  CurInsertionPoint =
2156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Section->getSubsectionInsertionPoint(unsigned(IntSubsection));
2164c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  return Created;
21783b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar}
21883b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar
219ef76b273f96d99a4a260f3dcadde8fbb96256cf3Eli Benderskyvoid MCObjectStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
2206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  getAssembler().registerSymbol(*Symbol);
22136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MCStreamer::EmitAssignment(Symbol, Value);
222ef76b273f96d99a4a260f3dcadde8fbb96256cf3Eli Bendersky}
223ef76b273f96d99a4a260f3dcadde8fbb96256cf3Eli Bendersky
2246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarbool MCObjectStreamer::mayHaveInstructions(MCSection &Sec) const {
2256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return Sec.hasInstructions();
2266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
2276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
228c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesvoid MCObjectStreamer::EmitInstruction(const MCInst &Inst,
229c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                       const MCSubtargetInfo &STI) {
230c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  MCStreamer::EmitInstruction(Inst, STI);
231f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola
2326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  MCSection *Sec = getCurrentSectionOnly();
2336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Sec->setHasInstructions(true);
234f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola
235f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola  // Now that a machine instruction has been assembled into this section, make
236f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola  // a line entry for any .loc directive that has been seen.
237de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MCCVLineEntry::Make(this);
238de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MCDwarfLineEntry::Make(this, getCurrentSection().first);
239f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola
240f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola  // If this instruction doesn't need relaxation, just emit it as data.
2414766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  MCAssembler &Assembler = getAssembler();
2424766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  if (!Assembler.getBackend().mayNeedRelaxation(Inst)) {
24336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    EmitInstToData(Inst, STI);
244f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola    return;
245f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola  }
246f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola
2474766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // Otherwise, relax and emit it as data if either:
2484766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // - The RelaxAll flag was passed
2494766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // - Bundling is enabled and this instruction is inside a bundle-locked
2504766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //   group. We want to emit all such instructions into the same data
2514766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //   fragment.
2524766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  if (Assembler.getRelaxAll() ||
2536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      (Assembler.isBundlingEnabled() && Sec->isBundleLocked())) {
254f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola    MCInst Relaxed;
255de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    getAssembler().getBackend().relaxInstruction(Inst, STI, Relaxed);
256ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach    while (getAssembler().getBackend().mayNeedRelaxation(Relaxed))
257de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      getAssembler().getBackend().relaxInstruction(Relaxed, STI, Relaxed);
25836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    EmitInstToData(Relaxed, STI);
259f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola    return;
260f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola  }
261f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola
262f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola  // Otherwise emit to a separate fragment.
26336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EmitInstToFragment(Inst, STI);
264f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola}
265f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola
26636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid MCObjectStreamer::EmitInstToFragment(const MCInst &Inst,
26736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                          const MCSubtargetInfo &STI) {
2680c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (getAssembler().getRelaxAll() && getAssembler().isBundlingEnabled())
2690c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    llvm_unreachable("All instructions should have already been relaxed");
2700c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
2714766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // Always create a new, separate fragment here, because its size can change
2724766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // during relaxation.
27336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MCRelaxableFragment *IF = new MCRelaxableFragment(Inst, STI);
274df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  insert(IF);
275dedb045c3296c831962c4ae101531c38c273ba89Rafael Espindola
27650ebe53353f6870e913f7715d6d4fc5a1f5bedd6Eli Friedman  SmallString<128> Code;
27750ebe53353f6870e913f7715d6d4fc5a1f5bedd6Eli Friedman  raw_svector_ostream VecOS(Code);
2786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  getAssembler().getEmitter().encodeInstruction(Inst, VecOS, IF->getFixups(),
27936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                STI);
28064d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky  IF->getContents().append(Code.begin(), Code.end());
281dedb045c3296c831962c4ae101531c38c273ba89Rafael Espindola}
282dedb045c3296c831962c4ae101531c38c273ba89Rafael Espindola
283f78708593407286de34506e699da25a56b65a20dMatt Beaumont-Gay#ifndef NDEBUG
2844172a8abbabea2359d91bb07101166565127d798Craig Topperstatic const char *const BundlingNotImplementedMsg =
2854766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  "Aligned bundling is not implemented for this object format";
286f78708593407286de34506e699da25a56b65a20dMatt Beaumont-Gay#endif
2874766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
2884766ef41b31e4f97bce1179c3b0398303bf65356Eli Benderskyvoid MCObjectStreamer::EmitBundleAlignMode(unsigned AlignPow2) {
2894766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  llvm_unreachable(BundlingNotImplementedMsg);
2904766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky}
2914766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
2926c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Benderskyvoid MCObjectStreamer::EmitBundleLock(bool AlignToEnd) {
2934766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  llvm_unreachable(BundlingNotImplementedMsg);
2944766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky}
2954766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
2964766ef41b31e4f97bce1179c3b0398303bf65356Eli Benderskyvoid MCObjectStreamer::EmitBundleUnlock() {
2974766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  llvm_unreachable(BundlingNotImplementedMsg);
2984766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky}
2994766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
3004df4bccc71ea0477836db9a417d3da202c2baa09Ulrich Weigandvoid MCObjectStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
3014df4bccc71ea0477836db9a417d3da202c2baa09Ulrich Weigand                                             unsigned Column, unsigned Flags,
3024df4bccc71ea0477836db9a417d3da202c2baa09Ulrich Weigand                                             unsigned Isa,
3034df4bccc71ea0477836db9a417d3da202c2baa09Ulrich Weigand                                             unsigned Discriminator,
3044df4bccc71ea0477836db9a417d3da202c2baa09Ulrich Weigand                                             StringRef FileName) {
3054df4bccc71ea0477836db9a417d3da202c2baa09Ulrich Weigand  // In case we see two .loc directives in a row, make sure the
3064df4bccc71ea0477836db9a417d3da202c2baa09Ulrich Weigand  // first one gets a line entry.
307de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MCDwarfLineEntry::Make(this, getCurrentSection().first);
3084df4bccc71ea0477836db9a417d3da202c2baa09Ulrich Weigand
3094df4bccc71ea0477836db9a417d3da202c2baa09Ulrich Weigand  this->MCStreamer::EmitDwarfLocDirective(FileNo, Line, Column, Flags,
3104df4bccc71ea0477836db9a417d3da202c2baa09Ulrich Weigand                                          Isa, Discriminator, FileName);
3114df4bccc71ea0477836db9a417d3da202c2baa09Ulrich Weigand}
3124df4bccc71ea0477836db9a417d3da202c2baa09Ulrich Weigand
31337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstatic const MCExpr *buildSymbolDiff(MCObjectStreamer &OS, const MCSymbol *A,
31437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                     const MCSymbol *B) {
31537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  MCContext &Context = OS.getContext();
31637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
3176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const MCExpr *ARef = MCSymbolRefExpr::create(A, Variant, Context);
3186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const MCExpr *BRef = MCSymbolRefExpr::create(B, Variant, Context);
31937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const MCExpr *AddrDelta =
3206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      MCBinaryExpr::create(MCBinaryExpr::Sub, ARef, BRef, Context);
32137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return AddrDelta;
32237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
32337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
324f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarstatic void emitDwarfSetLineAddr(MCObjectStreamer &OS,
325f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                 MCDwarfLineTableParams Params,
326f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                 int64_t LineDelta, const MCSymbol *Label,
327f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                 int PointerSize) {
32837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // emit the sequence to set the address
32937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  OS.EmitIntValue(dwarf::DW_LNS_extended_op, 1);
33037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  OS.EmitULEB128IntValue(PointerSize + 1);
33137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  OS.EmitIntValue(dwarf::DW_LNE_set_address, 1);
33237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  OS.EmitSymbolValue(Label, PointerSize);
33337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
33437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // emit the sequence for the LineDelta (from 1) and a zero address delta.
335f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  MCDwarfLineAddr::Emit(&OS, Params, LineDelta, 0);
33637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
33737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
33832a006e606742b1c5401e49607e33717bb5441f0Rafael Espindolavoid MCObjectStreamer::EmitDwarfAdvanceLineAddr(int64_t LineDelta,
33932a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola                                                const MCSymbol *LastLabel,
340672b93a3324cc1da6d374eed4c75c050a9cad7beEvan Cheng                                                const MCSymbol *Label,
341672b93a3324cc1da6d374eed4c75c050a9cad7beEvan Cheng                                                unsigned PointerSize) {
34232a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola  if (!LastLabel) {
343f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    emitDwarfSetLineAddr(*this, Assembler->getDWARFLinetableParams(), LineDelta,
344f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                         Label, PointerSize);
34532a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola    return;
34632a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola  }
34737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const MCExpr *AddrDelta = buildSymbolDiff(*this, Label, LastLabel);
34832a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola  int64_t Res;
3496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (AddrDelta->evaluateAsAbsolute(Res, getAssembler())) {
350f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    MCDwarfLineAddr::Emit(this, Assembler->getDWARFLinetableParams(), LineDelta,
351f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                          Res);
35232a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola    return;
35332a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola  }
354df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  insert(new MCDwarfLineAddrFragment(LineDelta, *AddrDelta));
35532a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola}
35632a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola
357245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindolavoid MCObjectStreamer::EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel,
358245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola                                                 const MCSymbol *Label) {
35937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const MCExpr *AddrDelta = buildSymbolDiff(*this, Label, LastLabel);
360245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  int64_t Res;
3616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (AddrDelta->evaluateAsAbsolute(Res, getAssembler())) {
362245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    MCDwarfFrameEmitter::EmitAdvanceLoc(*this, Res);
363245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    return;
364245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  }
365df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  insert(new MCDwarfCallFrameFragment(*AddrDelta));
366245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola}
367245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola
368de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid MCObjectStreamer::EmitCVLocDirective(unsigned FunctionId, unsigned FileNo,
369de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          unsigned Line, unsigned Column,
370de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          bool PrologueEnd, bool IsStmt,
371de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          StringRef FileName) {
372de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // In case we see two .cv_loc directives in a row, make sure the
373de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // first one gets a line entry.
374de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MCCVLineEntry::Make(this);
375de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
376de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  this->MCStreamer::EmitCVLocDirective(FunctionId, FileNo, Line, Column,
377de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                       PrologueEnd, IsStmt, FileName);
378de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
379de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
380de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid MCObjectStreamer::EmitCVLinetableDirective(unsigned FunctionId,
381de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                const MCSymbol *Begin,
382de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                const MCSymbol *End) {
383de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  getContext().getCVContext().emitLineTableForFunction(*this, FunctionId, Begin,
384de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                       End);
385de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  this->MCStreamer::EmitCVLinetableDirective(FunctionId, Begin, End);
386de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
387de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
388de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid MCObjectStreamer::EmitCVInlineLinetableDirective(
389de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned PrimaryFunctionId, unsigned SourceFileId, unsigned SourceLineNum,
390de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const MCSymbol *FnStartSym, const MCSymbol *FnEndSym,
391de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ArrayRef<unsigned> SecondaryFunctionIds) {
392de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  getContext().getCVContext().emitInlineLineTableForFunction(
393de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      *this, PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym,
394de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      FnEndSym, SecondaryFunctionIds);
395de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  this->MCStreamer::EmitCVInlineLinetableDirective(
396de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym, FnEndSym,
397de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      SecondaryFunctionIds);
398de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
399de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
400de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid MCObjectStreamer::EmitCVDefRangeDirective(
401de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
402de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef FixedSizePortion) {
403de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  getContext().getCVContext().emitDefRange(*this, Ranges, FixedSizePortion);
404de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  this->MCStreamer::EmitCVDefRangeDirective(Ranges, FixedSizePortion);
405de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
406de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
407de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid MCObjectStreamer::EmitCVStringTableDirective() {
408de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  getContext().getCVContext().emitStringTable(*this);
409de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
410de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid MCObjectStreamer::EmitCVFileChecksumsDirective() {
411de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  getContext().getCVContext().emitFileChecksums(*this);
412de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
413de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
414de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
415a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindolavoid MCObjectStreamer::EmitBytes(StringRef Data) {
416de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MCCVLineEntry::Make(this);
417de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MCDwarfLineEntry::Make(this, getCurrentSection().first);
418f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  MCDataFragment *DF = getOrCreateDataFragment();
419f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  flushPendingLabels(DF, DF->getContents().size());
420f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  DF->getContents().append(Data.begin(), Data.end());
421e660fc15fe1f1b8a19488f39d0ec09acc79bed0dBenjamin Kramer}
422e660fc15fe1f1b8a19488f39d0ec09acc79bed0dBenjamin Kramer
423e660fc15fe1f1b8a19488f39d0ec09acc79bed0dBenjamin Kramervoid MCObjectStreamer::EmitValueToAlignment(unsigned ByteAlignment,
424e660fc15fe1f1b8a19488f39d0ec09acc79bed0dBenjamin Kramer                                            int64_t Value,
425e660fc15fe1f1b8a19488f39d0ec09acc79bed0dBenjamin Kramer                                            unsigned ValueSize,
426e660fc15fe1f1b8a19488f39d0ec09acc79bed0dBenjamin Kramer                                            unsigned MaxBytesToEmit) {
427e660fc15fe1f1b8a19488f39d0ec09acc79bed0dBenjamin Kramer  if (MaxBytesToEmit == 0)
428e660fc15fe1f1b8a19488f39d0ec09acc79bed0dBenjamin Kramer    MaxBytesToEmit = ByteAlignment;
429df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  insert(new MCAlignFragment(ByteAlignment, Value, ValueSize, MaxBytesToEmit));
430e660fc15fe1f1b8a19488f39d0ec09acc79bed0dBenjamin Kramer
431e660fc15fe1f1b8a19488f39d0ec09acc79bed0dBenjamin Kramer  // Update the maximum alignment on the current section if necessary.
4326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  MCSection *CurSec = getCurrentSection().first;
4336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (ByteAlignment > CurSec->getAlignment())
4346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    CurSec->setAlignment(ByteAlignment);
435e660fc15fe1f1b8a19488f39d0ec09acc79bed0dBenjamin Kramer}
436e660fc15fe1f1b8a19488f39d0ec09acc79bed0dBenjamin Kramer
437e660fc15fe1f1b8a19488f39d0ec09acc79bed0dBenjamin Kramervoid MCObjectStreamer::EmitCodeAlignment(unsigned ByteAlignment,
438e660fc15fe1f1b8a19488f39d0ec09acc79bed0dBenjamin Kramer                                         unsigned MaxBytesToEmit) {
439e660fc15fe1f1b8a19488f39d0ec09acc79bed0dBenjamin Kramer  EmitValueToAlignment(ByteAlignment, 0, 1, MaxBytesToEmit);
440e660fc15fe1f1b8a19488f39d0ec09acc79bed0dBenjamin Kramer  cast<MCAlignFragment>(getCurrentFragment())->setEmitNops(true);
441e660fc15fe1f1b8a19488f39d0ec09acc79bed0dBenjamin Kramer}
442e660fc15fe1f1b8a19488f39d0ec09acc79bed0dBenjamin Kramer
443f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid MCObjectStreamer::emitValueToOffset(const MCExpr *Offset,
444660a4d9e0a15ad25db10d25a1a8caeafc0ebad5eJim Grosbach                                         unsigned char Value) {
445f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  insert(new MCOrgFragment(*Offset, Value));
446e23930543c0de0adcfec00cd18e9243ad812a167Rafael Espindola}
447e23930543c0de0adcfec00cd18e9243ad812a167Rafael Espindola
44884bfc2f090639f933df06cc675c4385511516befAkira Hatanaka// Associate GPRel32 fixup with data and resize data area
44984bfc2f090639f933df06cc675c4385511516befAkira Hatanakavoid MCObjectStreamer::EmitGPRel32Value(const MCExpr *Value) {
45084bfc2f090639f933df06cc675c4385511516befAkira Hatanaka  MCDataFragment *DF = getOrCreateDataFragment();
451f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  flushPendingLabels(DF, DF->getContents().size());
45284bfc2f090639f933df06cc675c4385511516befAkira Hatanaka
4536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DF->getFixups().push_back(MCFixup::create(DF->getContents().size(),
45464d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky                                            Value, FK_GPRel_4));
45584bfc2f090639f933df06cc675c4385511516befAkira Hatanaka  DF->getContents().resize(DF->getContents().size() + 4, 0);
45684bfc2f090639f933df06cc675c4385511516befAkira Hatanaka}
45784bfc2f090639f933df06cc675c4385511516befAkira Hatanaka
458101771ba4d9c2421f836069fcedf9ddc8a0c9dc7Jack Carter// Associate GPRel32 fixup with data and resize data area
459101771ba4d9c2421f836069fcedf9ddc8a0c9dc7Jack Cartervoid MCObjectStreamer::EmitGPRel64Value(const MCExpr *Value) {
460101771ba4d9c2421f836069fcedf9ddc8a0c9dc7Jack Carter  MCDataFragment *DF = getOrCreateDataFragment();
461f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  flushPendingLabels(DF, DF->getContents().size());
462101771ba4d9c2421f836069fcedf9ddc8a0c9dc7Jack Carter
4636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DF->getFixups().push_back(MCFixup::create(DF->getContents().size(),
46464d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky                                            Value, FK_GPRel_4));
465101771ba4d9c2421f836069fcedf9ddc8a0c9dc7Jack Carter  DF->getContents().resize(DF->getContents().size() + 8, 0);
466101771ba4d9c2421f836069fcedf9ddc8a0c9dc7Jack Carter}
467101771ba4d9c2421f836069fcedf9ddc8a0c9dc7Jack Carter
468f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool MCObjectStreamer::EmitRelocDirective(const MCExpr &Offset, StringRef Name,
469f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                          const MCExpr *Expr, SMLoc Loc) {
470f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  int64_t OffsetValue;
471f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!Offset.evaluateAsAbsolute(OffsetValue))
472f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    llvm_unreachable("Offset is not absolute");
473f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
474de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (OffsetValue < 0)
475de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    llvm_unreachable("Offset is negative");
476de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
477f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  MCDataFragment *DF = getOrCreateDataFragment();
478f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  flushPendingLabels(DF, DF->getContents().size());
479f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
480de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Optional<MCFixupKind> MaybeKind = Assembler->getBackend().getFixupKind(Name);
481de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!MaybeKind.hasValue())
482f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return true;
483f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
484de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MCFixupKind Kind = *MaybeKind;
485de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
486f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (Expr == nullptr)
487f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    Expr =
488f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        MCSymbolRefExpr::create(getContext().createTempSymbol(), getContext());
489f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  DF->getFixups().push_back(MCFixup::create(OffsetValue, Expr, Kind, Loc));
490f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return false;
491f0070f2a973ff046ee63de827ab32ff215b369b2Benjamin Kramer}
492f0070f2a973ff046ee63de827ab32ff215b369b2Benjamin Kramer
493de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid MCObjectStreamer::emitFill(uint64_t NumBytes, uint8_t FillValue) {
494ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  const MCSection *Sec = getCurrentSection().first;
495de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  (void)Sec;
496ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  assert(Sec && "need a section");
497de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  insert(new MCFillFragment(FillValue, NumBytes));
498de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
499de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
500de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid MCObjectStreamer::emitFill(const MCExpr &NumBytes, uint64_t FillValue,
501de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                SMLoc Loc) {
502de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MCDataFragment *DF = getOrCreateDataFragment();
503de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  flushPendingLabels(DF, DF->getContents().size());
504de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
505de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  int64_t IntNumBytes;
506de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!NumBytes.evaluateAsAbsolute(IntNumBytes, getAssembler())) {
507de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    getContext().reportError(Loc, "expected absolute expression");
508de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return;
509de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
510de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
511de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (IntNumBytes <= 0) {
512de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    getContext().reportError(Loc, "invalid number of bytes");
513de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return;
514de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
515de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
516de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  emitFill(IntNumBytes, FillValue);
517de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
518de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
519de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid MCObjectStreamer::emitFill(const MCExpr &NumValues, int64_t Size,
520de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                int64_t Expr, SMLoc Loc) {
521de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  int64_t IntNumValues;
522de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!NumValues.evaluateAsAbsolute(IntNumValues, getAssembler())) {
523de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    getContext().reportError(Loc, "expected absolute expression");
524de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return;
525de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
526de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
527de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (IntNumValues < 0) {
528de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    getContext().getSourceManager()->PrintMessage(
529de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Loc, SourceMgr::DK_Warning,
530de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        "'.fill' directive with negative repeat count has no effect");
531de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return;
532de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
533de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
534de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MCStreamer::emitFill(IntNumValues, Size, Expr);
535b02f1e9a6bc332ebd77571fdffcdc44d77e76b31Serge Pavlov}
536b02f1e9a6bc332ebd77571fdffcdc44d77e76b31Serge Pavlov
53799b4237c1647156f0e1d3d7e03efdab23ed79778Rafael Espindolavoid MCObjectStreamer::FinishImpl() {
53894c2e85bea1ab1b837a4c055ccc83d5cd32dd027Kevin Enderby  // If we are generating dwarf for assembly source files dump out the sections.
53994c2e85bea1ab1b837a4c055ccc83d5cd32dd027Kevin Enderby  if (getContext().getGenDwarfForAssembly())
54036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    MCGenDwarfInfo::Emit(this);
54136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
54236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Dump out the dwarf file & directory tables and line tables.
543f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  MCDwarfLineTable::Emit(this, getAssembler().getDWARFLinetableParams());
54494c2e85bea1ab1b837a4c055ccc83d5cd32dd027Kevin Enderby
54537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  flushPendingLabels(nullptr);
54683b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar  getAssembler().Finish();
54783b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar}
548