diff options
Diffstat (limited to 'contrib/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp')
| -rw-r--r-- | contrib/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp | 65 | 
1 files changed, 34 insertions, 31 deletions
diff --git a/contrib/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/contrib/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp index 204d97cbdd44..1f280e1d13fc 100644 --- a/contrib/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp +++ b/contrib/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp @@ -8,7 +8,7 @@  //===----------------------------------------------------------------------===//  ///  /// \file -/// \brief This file contains a printer that converts from our internal +/// This file contains a printer that converts from our internal  /// representation of machine-dependent LLVM code to the WebAssembly assembly  /// language.  /// @@ -31,10 +31,10 @@  #include "llvm/IR/DataLayout.h"  #include "llvm/IR/GlobalVariable.h"  #include "llvm/MC/MCContext.h" +#include "llvm/MC/MCSectionWasm.h"  #include "llvm/MC/MCStreamer.h"  #include "llvm/MC/MCSymbol.h"  #include "llvm/MC/MCSymbolWasm.h" -#include "llvm/MC/MCSymbolELF.h"  #include "llvm/Support/Debug.h"  #include "llvm/Support/TargetRegistry.h"  #include "llvm/Support/raw_ostream.h" @@ -53,7 +53,7 @@ MVT WebAssemblyAsmPrinter::getRegType(unsigned RegNo) const {                  MVT::v4i32, MVT::v4f32})      if (TRI->isTypeLegalForClass(*TRC, T))        return T; -  DEBUG(errs() << "Unknown type for register number: " << RegNo); +  LLVM_DEBUG(errs() << "Unknown type for register number: " << RegNo);    llvm_unreachable("Unknown register type");    return MVT::Other;  } @@ -84,21 +84,47 @@ void WebAssemblyAsmPrinter::EmitEndOfAsmFile(Module &M) {        SmallVector<MVT, 4> Results;        SmallVector<MVT, 4> Params;        ComputeSignatureVTs(F, TM, Params, Results); -      getTargetStreamer()->emitIndirectFunctionType(getSymbol(&F), Params, -                                                    Results); +      MCSymbol *Sym = getSymbol(&F); +      getTargetStreamer()->emitIndirectFunctionType(Sym, Params, Results); + +      if (TM.getTargetTriple().isOSBinFormatWasm() && +          F.hasFnAttribute("wasm-import-module")) { +        MCSymbolWasm *WasmSym = cast<MCSymbolWasm>(Sym); +        StringRef Name = F.getFnAttribute("wasm-import-module") +                             .getValueAsString(); +        getTargetStreamer()->emitImportModule(WasmSym, Name); +      }      }    }    for (const auto &G : M.globals()) {      if (!G.hasInitializer() && G.hasExternalLinkage()) {        if (G.getValueType()->isSized()) {          uint16_t Size = M.getDataLayout().getTypeAllocSize(G.getValueType()); -        if (TM.getTargetTriple().isOSBinFormatELF()) -          getTargetStreamer()->emitGlobalImport(G.getGlobalIdentifier());          OutStreamer->emitELFSize(getSymbol(&G),                                   MCConstantExpr::create(Size, OutContext));        }      }    } + +  if (const NamedMDNode *Named = M.getNamedMetadata("wasm.custom_sections")) { +    for (const Metadata *MD : Named->operands()) { +      const MDTuple *Tuple = dyn_cast<MDTuple>(MD); +      if (!Tuple || Tuple->getNumOperands() != 2) +        continue; +      const MDString *Name = dyn_cast<MDString>(Tuple->getOperand(0)); +      const MDString *Contents = dyn_cast<MDString>(Tuple->getOperand(1)); +      if (!Name || !Contents) +        continue; + +      OutStreamer->PushSection(); +      std::string SectionName = (".custom_section." + Name->getString()).str(); +      MCSectionWasm *mySection = +          OutContext.getWasmSection(SectionName, SectionKind::getMetadata()); +      OutStreamer->SwitchSection(mySection); +      OutStreamer->EmitBytes(Contents->getString()); +      OutStreamer->PopSection(); +    } +  }  }  void WebAssemblyAsmPrinter::EmitConstantPool() { @@ -133,36 +159,13 @@ void WebAssemblyAsmPrinter::EmitFunctionBodyStart() {    else      getTargetStreamer()->emitResult(CurrentFnSym, ArrayRef<MVT>()); -  if (TM.getTargetTriple().isOSBinFormatELF()) { -    assert(MFI->getLocals().empty()); -    for (unsigned Idx = 0, IdxE = MRI->getNumVirtRegs(); Idx != IdxE; ++Idx) { -      unsigned VReg = TargetRegisterInfo::index2VirtReg(Idx); -      unsigned WAReg = MFI->getWAReg(VReg); -      // Don't declare unused registers. -      if (WAReg == WebAssemblyFunctionInfo::UnusedReg) -        continue; -      // Don't redeclare parameters. -      if (WAReg < MFI->getParams().size()) -        continue; -      // Don't declare stackified registers. -      if (int(WAReg) < 0) -        continue; -      MFI->addLocal(getRegType(VReg)); -    } -  } -    getTargetStreamer()->emitLocal(MFI->getLocals());    AsmPrinter::EmitFunctionBodyStart();  } -void WebAssemblyAsmPrinter::EmitFunctionBodyEnd() { -  if (TM.getTargetTriple().isOSBinFormatELF()) -    getTargetStreamer()->emitEndFunc(); -} -  void WebAssemblyAsmPrinter::EmitInstruction(const MachineInstr *MI) { -  DEBUG(dbgs() << "EmitInstruction: " << *MI << '\n'); +  LLVM_DEBUG(dbgs() << "EmitInstruction: " << *MI << '\n');    switch (MI->getOpcode()) {    case WebAssembly::ARGUMENT_I32:  | 
