You've already forked linux-packaging-mono
acceptance-tests
data
docs
external
Newtonsoft.Json
api-doc-tools
api-snapshot
aspnetwebstack
bdwgc
binary-reference-assemblies
bockbuild
boringssl
cecil
cecil-legacy
corefx
corert
helix-binaries
ikdasm
ikvm
illinker-test-assets
linker
llvm-project
clang
clang-tools-extra
compiler-rt
eng
libcxx
libcxxabi
libunwind
lld
lldb
llvm
bindings
cmake
docs
examples
include
lib
Analysis
AsmParser
BinaryFormat
Bitcode
CodeGen
DebugInfo
Demangle
ExecutionEngine
FuzzMutate
Fuzzer
IR
IRReader
LTO
LineEditor
Linker
MC
MCDisassembler
MCParser
CMakeLists.txt
ConstantPools.cpp
ELFObjectWriter.cpp
LLVMBuild.txt
MCAsmBackend.cpp
MCAsmInfo.cpp
MCAsmInfoCOFF.cpp
MCAsmInfoDarwin.cpp
MCAsmInfoELF.cpp
MCAsmInfoWasm.cpp
MCAsmStreamer.cpp
MCAssembler.cpp
MCCodeEmitter.cpp
MCCodePadder.cpp
MCCodeView.cpp
MCContext.cpp
MCDwarf.cpp
MCELFObjectTargetWriter.cpp
MCELFStreamer.cpp
MCExpr.cpp
MCFragment.cpp
MCInst.cpp
MCInstPrinter.cpp
MCInstrAnalysis.cpp
MCInstrDesc.cpp
MCLabel.cpp
MCLinkerOptimizationHint.cpp
MCMachOStreamer.cpp
MCMachObjectTargetWriter.cpp
MCNullStreamer.cpp
MCObjectFileInfo.cpp
MCObjectStreamer.cpp
MCObjectWriter.cpp
MCRegisterInfo.cpp
MCSchedule.cpp
MCSection.cpp
MCSectionCOFF.cpp
MCSectionELF.cpp
MCSectionMachO.cpp
MCSectionWasm.cpp
MCStreamer.cpp
MCSubtargetInfo.cpp
MCSymbol.cpp
MCSymbolELF.cpp
MCTargetOptions.cpp
MCValue.cpp
MCWasmObjectTargetWriter.cpp
MCWasmStreamer.cpp
MCWin64EH.cpp
MCWinCOFFStreamer.cpp
MCWinEH.cpp
MachObjectWriter.cpp
StringTableBuilder.cpp
SubtargetFeature.cpp
WasmObjectWriter.cpp
WinCOFFObjectWriter.cpp
Object
ObjectYAML
Option
Passes
ProfileData
Support
TableGen
Target
Testing
ToolDrivers
Transforms
WindowsManifest
XRay
CMakeLists.txt
LLVMBuild.txt
projects
resources
runtimes
scripts
test
tools
unittests
utils
.arcconfig
.clang-format
.clang-tidy
.gitattributes
.gitignore
CMakeLists.txt
CODE_OWNERS.TXT
CREDITS.TXT
LICENSE.TXT
LLVMBuild.txt
README.txt
RELEASE_TESTERS.TXT
configure
llvm.spec.in
version.txt.in
nuget
openmp
polly
Directory.Build.props
Directory.Build.targets
NuGet.config
azure-pipelines.yml
build.cmd
build.sh
dir.common.props
global.json
llvm.proj
mxe-Win64.cmake.in
nuget-buildtasks
nunit-lite
roslyn-binaries
rx
xunit-binaries
how-to-bump-roslyn-binaries.md
ikvm-native
llvm
m4
man
mcs
mono
msvc
netcore
po
runtime
samples
scripts
support
tools
COPYING.LIB
LICENSE
Makefile.am
Makefile.in
NEWS
README.md
acinclude.m4
aclocal.m4
autogen.sh
code_of_conduct.md
compile
config.guess
config.h.in
config.rpath
config.sub
configure.REMOVED.git-id
configure.ac.REMOVED.git-id
depcomp
install-sh
ltmain.sh.REMOVED.git-id
missing
mkinstalldirs
mono-uninstalled.pc.in
test-driver
winconfig.h
233 lines
7.5 KiB
C++
233 lines
7.5 KiB
C++
//===- lib/MC/MCWasmStreamer.cpp - Wasm Object Output ---------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file assembles .s files and emits Wasm .o object files.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/MC/MCWasmStreamer.h"
|
|
#include "llvm/ADT/STLExtras.h"
|
|
#include "llvm/ADT/SmallPtrSet.h"
|
|
#include "llvm/MC/MCAsmBackend.h"
|
|
#include "llvm/MC/MCAsmLayout.h"
|
|
#include "llvm/MC/MCAssembler.h"
|
|
#include "llvm/MC/MCCodeEmitter.h"
|
|
#include "llvm/MC/MCContext.h"
|
|
#include "llvm/MC/MCExpr.h"
|
|
#include "llvm/MC/MCInst.h"
|
|
#include "llvm/MC/MCObjectStreamer.h"
|
|
#include "llvm/MC/MCSection.h"
|
|
#include "llvm/MC/MCSectionWasm.h"
|
|
#include "llvm/MC/MCSymbol.h"
|
|
#include "llvm/MC/MCSymbolWasm.h"
|
|
#include "llvm/MC/MCValue.h"
|
|
#include "llvm/Support/Casting.h"
|
|
#include "llvm/Support/Debug.h"
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
#include "llvm/Support/TargetRegistry.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
using namespace llvm;
|
|
|
|
MCWasmStreamer::~MCWasmStreamer() {}
|
|
|
|
void MCWasmStreamer::mergeFragment(MCDataFragment *DF, MCDataFragment *EF) {
|
|
flushPendingLabels(DF, DF->getContents().size());
|
|
|
|
for (unsigned i = 0, e = EF->getFixups().size(); i != e; ++i) {
|
|
EF->getFixups()[i].setOffset(EF->getFixups()[i].getOffset() +
|
|
DF->getContents().size());
|
|
DF->getFixups().push_back(EF->getFixups()[i]);
|
|
}
|
|
DF->setHasInstructions(true);
|
|
DF->getContents().append(EF->getContents().begin(), EF->getContents().end());
|
|
}
|
|
|
|
void MCWasmStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
|
|
// Let the target do whatever target specific stuff it needs to do.
|
|
getAssembler().getBackend().handleAssemblerFlag(Flag);
|
|
|
|
// Do any generic stuff we need to do.
|
|
llvm_unreachable("invalid assembler flag!");
|
|
}
|
|
|
|
void MCWasmStreamer::ChangeSection(MCSection *Section,
|
|
const MCExpr *Subsection) {
|
|
MCAssembler &Asm = getAssembler();
|
|
auto *SectionWasm = static_cast<const MCSectionWasm *>(Section);
|
|
const MCSymbol *Grp = SectionWasm->getGroup();
|
|
if (Grp)
|
|
Asm.registerSymbol(*Grp);
|
|
|
|
this->MCObjectStreamer::ChangeSection(Section, Subsection);
|
|
}
|
|
|
|
void MCWasmStreamer::EmitWeakReference(MCSymbol *Alias,
|
|
const MCSymbol *Symbol) {
|
|
getAssembler().registerSymbol(*Symbol);
|
|
const MCExpr *Value = MCSymbolRefExpr::create(
|
|
Symbol, MCSymbolRefExpr::VK_WEAKREF, getContext());
|
|
Alias->setVariableValue(Value);
|
|
}
|
|
|
|
bool MCWasmStreamer::EmitSymbolAttribute(MCSymbol *S, MCSymbolAttr Attribute) {
|
|
assert(Attribute != MCSA_IndirectSymbol && "indirect symbols not supported");
|
|
|
|
auto *Symbol = cast<MCSymbolWasm>(S);
|
|
|
|
// Adding a symbol attribute always introduces the symbol, note that an
|
|
// important side effect of calling registerSymbol here is to register
|
|
// the symbol with the assembler.
|
|
getAssembler().registerSymbol(*Symbol);
|
|
|
|
switch (Attribute) {
|
|
case MCSA_LazyReference:
|
|
case MCSA_Reference:
|
|
case MCSA_SymbolResolver:
|
|
case MCSA_PrivateExtern:
|
|
case MCSA_WeakDefinition:
|
|
case MCSA_WeakDefAutoPrivate:
|
|
case MCSA_Invalid:
|
|
case MCSA_IndirectSymbol:
|
|
case MCSA_Protected:
|
|
return false;
|
|
|
|
case MCSA_Hidden:
|
|
Symbol->setHidden(true);
|
|
break;
|
|
|
|
case MCSA_Weak:
|
|
case MCSA_WeakReference:
|
|
Symbol->setWeak(true);
|
|
Symbol->setExternal(true);
|
|
break;
|
|
|
|
case MCSA_Global:
|
|
Symbol->setExternal(true);
|
|
break;
|
|
|
|
case MCSA_ELF_TypeFunction:
|
|
Symbol->setIsFunction(true);
|
|
break;
|
|
|
|
case MCSA_ELF_TypeObject:
|
|
Symbol->setIsFunction(false);
|
|
break;
|
|
|
|
default:
|
|
// unrecognized directive
|
|
llvm_unreachable("unexpected MCSymbolAttr");
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void MCWasmStreamer::EmitCommonSymbol(MCSymbol *S, uint64_t Size,
|
|
unsigned ByteAlignment) {
|
|
llvm_unreachable("Common symbols are not yet implemented for Wasm");
|
|
}
|
|
|
|
void MCWasmStreamer::emitELFSize(MCSymbol *Symbol, const MCExpr *Value) {
|
|
cast<MCSymbolWasm>(Symbol)->setSize(Value);
|
|
}
|
|
|
|
void MCWasmStreamer::EmitLocalCommonSymbol(MCSymbol *S, uint64_t Size,
|
|
unsigned ByteAlignment) {
|
|
llvm_unreachable("Local common symbols are not yet implemented for Wasm");
|
|
}
|
|
|
|
void MCWasmStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size,
|
|
SMLoc Loc) {
|
|
MCObjectStreamer::EmitValueImpl(Value, Size, Loc);
|
|
}
|
|
|
|
void MCWasmStreamer::EmitValueToAlignment(unsigned ByteAlignment, int64_t Value,
|
|
unsigned ValueSize,
|
|
unsigned MaxBytesToEmit) {
|
|
MCObjectStreamer::EmitValueToAlignment(ByteAlignment, Value, ValueSize,
|
|
MaxBytesToEmit);
|
|
}
|
|
|
|
void MCWasmStreamer::EmitIdent(StringRef IdentString) {
|
|
MCSection *Comment = getAssembler().getContext().getWasmSection(
|
|
".comment", SectionKind::getMetadata());
|
|
PushSection();
|
|
SwitchSection(Comment);
|
|
if (!SeenIdent) {
|
|
EmitIntValue(0, 1);
|
|
SeenIdent = true;
|
|
}
|
|
EmitBytes(IdentString);
|
|
EmitIntValue(0, 1);
|
|
PopSection();
|
|
}
|
|
|
|
void MCWasmStreamer::EmitInstToFragment(const MCInst &Inst,
|
|
const MCSubtargetInfo &STI) {
|
|
this->MCObjectStreamer::EmitInstToFragment(Inst, STI);
|
|
}
|
|
|
|
void MCWasmStreamer::EmitInstToData(const MCInst &Inst,
|
|
const MCSubtargetInfo &STI) {
|
|
MCAssembler &Assembler = getAssembler();
|
|
SmallVector<MCFixup, 4> Fixups;
|
|
SmallString<256> Code;
|
|
raw_svector_ostream VecOS(Code);
|
|
Assembler.getEmitter().encodeInstruction(Inst, VecOS, Fixups, STI);
|
|
|
|
// Append the encoded instruction to the current data fragment (or create a
|
|
// new such fragment if the current fragment is not a data fragment).
|
|
MCDataFragment *DF = getOrCreateDataFragment();
|
|
|
|
// Add the fixups and data.
|
|
for (unsigned i = 0, e = Fixups.size(); i != e; ++i) {
|
|
Fixups[i].setOffset(Fixups[i].getOffset() + DF->getContents().size());
|
|
DF->getFixups().push_back(Fixups[i]);
|
|
}
|
|
DF->setHasInstructions(true);
|
|
DF->getContents().append(Code.begin(), Code.end());
|
|
}
|
|
|
|
void MCWasmStreamer::FinishImpl() {
|
|
EmitFrames(nullptr);
|
|
|
|
this->MCObjectStreamer::FinishImpl();
|
|
}
|
|
|
|
MCStreamer *llvm::createWasmStreamer(MCContext &Context,
|
|
std::unique_ptr<MCAsmBackend> &&MAB,
|
|
raw_pwrite_stream &OS,
|
|
std::unique_ptr<MCCodeEmitter> &&CE,
|
|
bool RelaxAll) {
|
|
MCWasmStreamer *S =
|
|
new MCWasmStreamer(Context, std::move(MAB), OS, std::move(CE));
|
|
if (RelaxAll)
|
|
S->getAssembler().setRelaxAll(true);
|
|
return S;
|
|
}
|
|
|
|
void MCWasmStreamer::EmitThumbFunc(MCSymbol *Func) {
|
|
llvm_unreachable("Generic Wasm doesn't support this directive");
|
|
}
|
|
|
|
void MCWasmStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
|
|
llvm_unreachable("Wasm doesn't support this directive");
|
|
}
|
|
|
|
void MCWasmStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol,
|
|
uint64_t Size, unsigned ByteAlignment) {
|
|
llvm_unreachable("Wasm doesn't support this directive");
|
|
}
|
|
|
|
void MCWasmStreamer::EmitTBSSSymbol(MCSection *Section, MCSymbol *Symbol,
|
|
uint64_t Size, unsigned ByteAlignment) {
|
|
llvm_unreachable("Wasm doesn't support this directive");
|
|
}
|