diff options
author | JF Bastien <jfb@google.com> | 2015-08-31 22:24:11 +0000 |
---|---|---|
committer | JF Bastien <jfb@google.com> | 2015-08-31 22:24:11 +0000 |
commit | 73ff6afa87f0e5b162af37edd60b8f76035e72be (patch) | |
tree | 11e069866ab7d236f2ccf79318b09009f8001103 /llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp | |
parent | 3b0b43c8c6fefdac69d51279d63d106f296a7c7a (diff) | |
download | bcm5719-llvm-73ff6afa87f0e5b162af37edd60b8f76035e72be.tar.gz bcm5719-llvm-73ff6afa87f0e5b162af37edd60b8f76035e72be.zip |
WebAssembly: generate load/store
Summary: This handles all load/store operations that WebAssembly defines, and handles those necessary for C++ such as i1. I left a FIXME for outstanding features which aren't required for now.
Reviewers: sunfish
Subscribers: jfb, llvm-commits, dschuff
llvm-svn: 246500
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp index 12811b096eb..eb1343292d3 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp @@ -40,6 +40,7 @@ using namespace llvm; namespace { class WebAssemblyAsmPrinter final : public AsmPrinter { + bool hasAddr64; const WebAssemblyInstrInfo *TII; public: @@ -60,7 +61,9 @@ private: } bool runOnMachineFunction(MachineFunction &MF) override { - TII = MF.getSubtarget<WebAssemblySubtarget>().getInstrInfo(); + const auto &Subtarget = MF.getSubtarget<WebAssemblySubtarget>(); + hasAddr64 = Subtarget.hasAddr64(); + TII = Subtarget.getInstrInfo(); return AsmPrinter::runOnMachineFunction(MF); } @@ -97,23 +100,6 @@ static SmallString<32> OpcodeName(const WebAssemblyInstrInfo *TII, static std::string toSymbol(StringRef S) { return ("$" + S).str(); } -static const char *toString(const Type *Ty) { - switch (Ty->getTypeID()) { - default: break; - case Type::FloatTyID: return "f32"; - case Type::DoubleTyID: return "f64"; - case Type::IntegerTyID: - switch (Ty->getIntegerBitWidth()) { - case 32: return "i32"; - case 64: return "i64"; - default: break; - } - } - DEBUG(dbgs() << "Invalid type "; Ty->print(dbgs()); dbgs() << '\n'); - llvm_unreachable("invalid type"); - return "<invalid>"; -} - static std::string toString(const APFloat &FP) { static const size_t BufBytes = 128; char buf[BufBytes]; @@ -131,6 +117,28 @@ static std::string toString(const APFloat &FP) { return buf; } +static const char *toString(const Type *Ty, bool hasAddr64) { + switch (Ty->getTypeID()) { + default: break; + // Treat all pointers as the underlying integer into linear memory. + case Type::PointerTyID: return hasAddr64 ? "i64" : "i32"; + case Type::FloatTyID: return "f32"; + case Type::DoubleTyID: return "f64"; + case Type::IntegerTyID: + switch (Ty->getIntegerBitWidth()) { + case 8: return "i8"; + case 16: return "i16"; + case 32: return "i32"; + case 64: return "i64"; + default: break; + } + } + DEBUG(dbgs() << "Invalid type "; Ty->print(dbgs()); dbgs() << '\n'); + llvm_unreachable("invalid type"); + return "<invalid>"; +} + + //===----------------------------------------------------------------------===// // WebAssemblyAsmPrinter Implementation. //===----------------------------------------------------------------------===// @@ -186,7 +194,8 @@ void WebAssemblyAsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) { return; } - OS << "(global " << toSymbol(Name) << ' ' << toString(Init->getType()) << ' '; + OS << "(global " << toSymbol(Name) << ' ' + << toString(Init->getType(), hasAddr64) << ' '; if (const auto *C = dyn_cast<ConstantInt>(Init)) { assert(C->getBitWidth() <= 64 && "Printing wider types unimplemented"); OS << C->getZExtValue(); @@ -228,10 +237,10 @@ void WebAssemblyAsmPrinter::EmitFunctionBodyStart() { raw_svector_ostream OS(Str); const Function *F = MF->getFunction(); for (const Argument &A : F->args()) - OS << " (param " << toString(A.getType()) << ')'; + OS << " (param " << toString(A.getType(), hasAddr64) << ')'; const Type *Rt = F->getReturnType(); if (!Rt->isVoidTy()) - OS << " (result " << toString(Rt) << ')'; + OS << " (result " << toString(Rt, hasAddr64) << ')'; OS << '\n'; OutStreamer->EmitRawText(OS.str()); } |