Skip to content

Commit

Permalink
[WebAssembly] Remove WASM_STACK_POINTER.
Browse files Browse the repository at this point in the history
WASM_STACK_POINTER and the .stack_pointer directive are no longer needed
now that the stack pointer global is an import.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319956 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Dan Gohman committed Dec 6, 2017
1 parent 1c6190d commit 73135b4
Show file tree
Hide file tree
Showing 6 changed files with 4 additions and 66 deletions.
1 change: 0 additions & 1 deletion include/llvm/BinaryFormat/Wasm.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,6 @@ enum class ValType {

// Linking metadata kinds.
enum : unsigned {
WASM_STACK_POINTER = 0x1,
WASM_SYMBOL_INFO = 0x2,
WASM_DATA_SIZE = 0x3,
WASM_DATA_ALIGNMENT = 0x4,
Expand Down
39 changes: 4 additions & 35 deletions lib/MC/WasmObjectWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -287,8 +287,7 @@ class WasmObjectWriter : public MCObjectWriter {
void writeDataRelocSection();
void writeLinkingMetaDataSection(
ArrayRef<WasmDataSegment> Segments, uint32_t DataSize,
SmallVector<std::pair<StringRef, uint32_t>, 4> SymbolFlags,
Optional<uint32_t> StackPointerGlobal);
SmallVector<std::pair<StringRef, uint32_t>, 4> SymbolFlags);

uint32_t getProvisionalValue(const WasmRelocationEntry &RelEntry);
void applyRelocations(ArrayRef<WasmRelocationEntry> Relocations,
Expand Down Expand Up @@ -929,18 +928,11 @@ void WasmObjectWriter::writeDataRelocSection() {

void WasmObjectWriter::writeLinkingMetaDataSection(
ArrayRef<WasmDataSegment> Segments, uint32_t DataSize,
SmallVector<std::pair<StringRef, uint32_t>, 4> SymbolFlags,
Optional<uint32_t> StackPointerGlobal) {
SmallVector<std::pair<StringRef, uint32_t>, 4> SymbolFlags) {
SectionBookkeeping Section;
startSection(Section, wasm::WASM_SEC_CUSTOM, "linking");
SectionBookkeeping SubSection;

if (StackPointerGlobal.hasValue()) {
startSection(SubSection, wasm::WASM_STACK_POINTER);
encodeULEB128(StackPointerGlobal.getValue(), getStream()); // id
endSection(SubSection);
}

if (SymbolFlags.size() != 0) {
startSection(SubSection, wasm::WASM_SYMBOL_INFO);
encodeULEB128(SymbolFlags.size(), getStream());
Expand Down Expand Up @@ -1011,8 +1003,6 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
SmallPtrSet<const MCSymbolWasm *, 4> IsAddressTaken;
unsigned NumFuncImports = 0;
SmallVector<WasmDataSegment, 4> DataSegments;
Optional<StringRef> StackPointerGlobalName;
Optional<uint32_t> StackPointerGlobal;
uint32_t DataSize = 0;

// Populate the IsAddressTaken set.
Expand Down Expand Up @@ -1095,23 +1085,6 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
}
}

// In the special .stack_pointer section, we've encoded the stack pointer
// index.
MCSectionWasm *StackPtr =
Ctx.getWasmSection(".stack_pointer", SectionKind::getMetadata());
if (!StackPtr->getFragmentList().empty()) {
if (StackPtr->getFragmentList().size() != 1)
report_fatal_error("only one .stack_pointer fragment supported");
const MCFragment &Frag = *StackPtr->begin();
if (Frag.hasInstructions() || Frag.getKind() != MCFragment::FT_Data)
report_fatal_error("only data supported in .stack_pointer");
const auto &DataFrag = cast<MCDataFragment>(Frag);
if (!DataFrag.getFixups().empty())
report_fatal_error("fixups not supported in .stack_pointer");
const SmallVectorImpl<char> &Contents = DataFrag.getContents();
StackPointerGlobalName = StringRef(Contents.data(), Contents.size());
}

// Populate FunctionTypeIndices and Imports.
for (const MCSymbol &S : Asm.symbols()) {
const auto &WS = static_cast<const MCSymbolWasm &>(S);
Expand Down Expand Up @@ -1144,11 +1117,8 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,

// If this global is the stack pointer, make it mutable and remember it
// so that we can emit metadata for it.
if (StackPointerGlobalName.hasValue() &&
WS.getName() == StackPointerGlobalName.getValue()) {
if (WS.getName() == "__stack_pointer")
Import.IsMutable = true;
StackPointerGlobal = NumGlobalImports;
}

++NumGlobalImports;
}
Expand Down Expand Up @@ -1338,8 +1308,7 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
writeNameSection(Functions, Imports, NumFuncImports);
writeCodeRelocSection();
writeDataRelocSection();
writeLinkingMetaDataSection(DataSegments, DataSize, SymbolFlags,
StackPointerGlobal);
writeLinkingMetaDataSection(DataSegments, DataSize, SymbolFlags);

// TODO: Translate the .comment section to the output.
// TODO: Translate debug sections to the output.
Expand Down
17 changes: 0 additions & 17 deletions lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,6 @@ void WebAssemblyTargetAsmStreamer::emitGlobal(
}
}

void WebAssemblyTargetAsmStreamer::emitStackPointer(MCSymbol *Symbol) {
OS << "\t.stack_pointer\t" << Symbol->getName() << '\n';
}

void WebAssemblyTargetAsmStreamer::emitEndFunc() { OS << "\t.endfunc\n"; }

void WebAssemblyTargetAsmStreamer::emitIndirectFunctionType(
Expand Down Expand Up @@ -157,11 +153,6 @@ void WebAssemblyTargetELFStreamer::emitGlobal(
llvm_unreachable(".globalvar encoding not yet implemented");
}

void WebAssemblyTargetELFStreamer::emitStackPointer(
MCSymbol *Symbol) {
llvm_unreachable(".stack_pointer encoding not yet implemented");
}

void WebAssemblyTargetELFStreamer::emitEndFunc() {
Streamer.EmitIntValue(WebAssembly::End, 1);
}
Expand Down Expand Up @@ -238,14 +229,6 @@ void WebAssemblyTargetWasmStreamer::emitGlobal(
Streamer.PopSection();
}

void WebAssemblyTargetWasmStreamer::emitStackPointer(MCSymbol *Symbol) {
Streamer.PushSection();
Streamer.SwitchSection(Streamer.getContext().getWasmSection(
".stack_pointer", SectionKind::getMetadata()));
Streamer.EmitBytes(Symbol->getName());
Streamer.PopSection();
}

void WebAssemblyTargetWasmStreamer::emitEndFunc() {
llvm_unreachable(".end_func is not needed for direct wasm output");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,6 @@ class WebAssemblyTargetStreamer : public MCTargetStreamer {
virtual void emitLocal(ArrayRef<MVT> Types) = 0;
/// .globalvar
virtual void emitGlobal(ArrayRef<wasm::Global> Globals) = 0;
/// .stack_pointer
virtual void emitStackPointer(MCSymbol *Symbol) = 0;
/// .endfunc
virtual void emitEndFunc() = 0;
/// .functype
Expand All @@ -67,7 +65,6 @@ class WebAssemblyTargetAsmStreamer final : public WebAssemblyTargetStreamer {
void emitResult(MCSymbol *Symbol, ArrayRef<MVT> Types) override;
void emitLocal(ArrayRef<MVT> Types) override;
void emitGlobal(ArrayRef<wasm::Global> Globals) override;
void emitStackPointer(MCSymbol *Symbol) override;
void emitEndFunc() override;
void emitIndirectFunctionType(MCSymbol *Symbol,
SmallVectorImpl<MVT> &Params,
Expand All @@ -85,7 +82,6 @@ class WebAssemblyTargetELFStreamer final : public WebAssemblyTargetStreamer {
void emitResult(MCSymbol *Symbol, ArrayRef<MVT> Types) override;
void emitLocal(ArrayRef<MVT> Types) override;
void emitGlobal(ArrayRef<wasm::Global> Globals) override;
void emitStackPointer(MCSymbol *Symbol) override;
void emitEndFunc() override;
void emitIndirectFunctionType(MCSymbol *Symbol,
SmallVectorImpl<MVT> &Params,
Expand All @@ -103,7 +99,6 @@ class WebAssemblyTargetWasmStreamer final : public WebAssemblyTargetStreamer {
void emitResult(MCSymbol *Symbol, ArrayRef<MVT> Types) override;
void emitLocal(ArrayRef<MVT> Types) override;
void emitGlobal(ArrayRef<wasm::Global> Globals) override;
void emitStackPointer(MCSymbol *Symbol) override;
void emitEndFunc() override;
void emitIndirectFunctionType(MCSymbol *Symbol,
SmallVectorImpl<MVT> &Params,
Expand Down
6 changes: 0 additions & 6 deletions lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,12 +78,6 @@ WebAssemblyTargetStreamer *WebAssemblyAsmPrinter::getTargetStreamer() {
//===----------------------------------------------------------------------===//

void WebAssemblyAsmPrinter::EmitEndOfAsmFile(Module &M) {
// Declare the stack pointer.
if (TM.getTargetTriple().isOSBinFormatWasm()) {
getTargetStreamer()->emitStackPointer(
GetExternalSymbolSymbol("__stack_pointer"));
}

for (const auto &F : M) {
// Emit function type info for all undefined functions
if (F.isDeclarationForLinker() && !F.isIntrinsic()) {
Expand Down
2 changes: 0 additions & 2 deletions test/CodeGen/WebAssembly/stack-alignment.ll
Original file line number Diff line number Diff line change
Expand Up @@ -147,5 +147,3 @@ entry:
call void @somefunc(i32* %static)
ret void
}

; CHECK: .stack_pointer __stack_pointer

0 comments on commit 73135b4

Please sign in to comment.