Index: llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCCodeEmitter.cpp =================================================================== --- llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCCodeEmitter.cpp +++ llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCCodeEmitter.cpp @@ -16,6 +16,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/Statistic.h" #include "llvm/MC/MCCodeEmitter.h" +#include "llvm/MC/MCContext.h" #include "llvm/MC/MCFixup.h" #include "llvm/MC/MCInst.h" #include "llvm/MC/MCInstrInfo.h" @@ -25,6 +26,7 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/EndianStream.h" #include "llvm/Support/LEB128.h" +#include "llvm/Support/SMLoc.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; @@ -37,7 +39,7 @@ namespace { class WebAssemblyMCCodeEmitter final : public MCCodeEmitter { const MCInstrInfo &MCII; - + MCContext &Ctx; // Implementation generated by tablegen. uint64_t getBinaryCodeForInstr(const MCInst &MI, SmallVectorImpl &Fixups, @@ -48,12 +50,14 @@ const MCSubtargetInfo &STI) const override; public: - WebAssemblyMCCodeEmitter(const MCInstrInfo &MCII) : MCII(MCII) {} + WebAssemblyMCCodeEmitter(const MCInstrInfo &MCII, MCContext &Ctx) + : MCII(MCII), Ctx{Ctx} {} }; } // end anonymous namespace -MCCodeEmitter *llvm::createWebAssemblyMCCodeEmitter(const MCInstrInfo &MCII) { - return new WebAssemblyMCCodeEmitter(MCII); +MCCodeEmitter *llvm::createWebAssemblyMCCodeEmitter(const MCInstrInfo &MCII, + MCContext &Ctx) { + return new WebAssemblyMCCodeEmitter(MCII, Ctx); } void WebAssemblyMCCodeEmitter::encodeInstruction( @@ -120,7 +124,9 @@ support::endian::write(OS, MO.getImm(), support::little); break; case WebAssembly::OPERAND_GLOBAL: - llvm_unreachable("wasm globals should only be accessed symbolicly"); + Ctx.reportError( + SMLoc(), + Twine("Wasm globals should only be accessed symbolically!")); default: encodeULEB128(uint64_t(MO.getImm()), OS); } Index: llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h =================================================================== --- llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h +++ llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h @@ -16,6 +16,7 @@ #include "../WebAssemblySubtarget.h" #include "llvm/BinaryFormat/Wasm.h" +#include "llvm/MC/MCContext.h" #include "llvm/MC/MCInstrDesc.h" #include "llvm/Support/DataTypes.h" #include @@ -28,7 +29,8 @@ class MCObjectTargetWriter; class Triple; -MCCodeEmitter *createWebAssemblyMCCodeEmitter(const MCInstrInfo &MCII); +MCCodeEmitter *createWebAssemblyMCCodeEmitter(const MCInstrInfo &MCII, + MCContext &Ctx); MCAsmBackend *createWebAssemblyAsmBackend(const Triple &TT); Index: llvm/test/CodeGen/WebAssembly/inline-asm-failure.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/WebAssembly/inline-asm-failure.ll @@ -0,0 +1,26 @@ +; RUN: not llc -O0 --mtriple=wasm32 -filetype=obj \ +; RUN: -o /dev/null 2>&1 <%s | FileCheck %s +source_filename = "rust-issue-111471.c" +target datalayout = "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20" +target triple = "wasm32-unknown-unknown" + +@__main_void = hidden alias i32 (), ptr @main + +; Function Attrs: noinline nounwind optnone +define hidden void @get_global() #0 { +entry: + call void asm sideeffect "global.get 0", ""() #1, !srcloc !0 + ret void +} + +; Function Attrs: noinline nounwind optnone +define hidden i32 @main() #0 { +entry: + ret i32 0 +} + +attributes #0 = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="generic" "target-features"="+mutable-globals,+sign-ext" } +attributes #1 = { nounwind } + +!0 = !{i64 32} +; CHECK: :0: error: Wasm globals should only be accessed symbolically!