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