diff options
author | Dan Gohman <dan433584@gmail.com> | 2015-11-23 16:50:18 +0000 |
---|---|---|
committer | Dan Gohman <dan433584@gmail.com> | 2015-11-23 16:50:18 +0000 |
commit | 53828fd77797c8a9920619e19b5f4ad5cc779946 (patch) | |
tree | 4061406a202c67971f0cd133009ca96034b14921 /llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp | |
parent | 1ca881c4bbbe32213e435c050255b02764ea2004 (diff) | |
download | llvm-53828fd77797c8a9920619e19b5f4ad5cc779946.zip llvm-53828fd77797c8a9920619e19b5f4ad5cc779946.tar.gz llvm-53828fd77797c8a9920619e19b5f4ad5cc779946.tar.bz2 |
[WebAssembly] Emit .param, .result, and .local through MC.
This eliminates one of the main remaining uses of EmitRawText.
llvm-svn: 253878
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp | 49 |
1 files changed, 26 insertions, 23 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp index 512cdd1..c452e1d 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp @@ -84,7 +84,7 @@ private: unsigned AsmVariant, const char *ExtraCode, raw_ostream &OS) override; - std::string getRegTypeName(unsigned RegNo) const; + MVT getRegType(unsigned RegNo) const; const char *toString(MVT VT) const; std::string regToString(const MachineOperand &MO); }; @@ -95,14 +95,14 @@ private: // Helpers. //===----------------------------------------------------------------------===// -std::string WebAssemblyAsmPrinter::getRegTypeName(unsigned RegNo) const { +MVT WebAssemblyAsmPrinter::getRegType(unsigned RegNo) const { const TargetRegisterClass *TRC = MRI->getRegClass(RegNo); for (MVT T : {MVT::i32, MVT::i64, MVT::f32, MVT::f64}) if (TRC->hasType(T)) - return EVT(T).getEVTString(); + return T; DEBUG(errs() << "Unknown type for register number: " << RegNo); llvm_unreachable("Unknown register type"); - return "?"; + return MVT::Other; } std::string WebAssemblyAsmPrinter::regToString(const MachineOperand &MO) { @@ -165,21 +165,30 @@ static void ComputeLegalValueVTs(const Function &F, } void WebAssemblyAsmPrinter::EmitFunctionBodyStart() { - SmallString<128> Str; - raw_svector_ostream OS(Str); + if (!MFI->getParams().empty()) { + MCInst Param; + Param.setOpcode(WebAssembly::PARAM); + for (MVT VT : MFI->getParams()) + Param.addOperand(MCOperand::createImm(VT.SimpleTy)); + EmitToStreamer(*OutStreamer, Param); + } - for (MVT VT : MFI->getParams()) - OS << "\t" ".param " << toString(VT) << '\n'; SmallVector<MVT, 4> ResultVTs; const Function &F(*MF->getFunction()); ComputeLegalValueVTs(F, TM, F.getReturnType(), ResultVTs); // If the return type needs to be legalized it will get converted into // passing a pointer. - if (ResultVTs.size() == 1) - OS << "\t" ".result " << toString(ResultVTs.front()) << '\n'; + if (ResultVTs.size() == 1) { + MCInst Result; + Result.setOpcode(WebAssembly::RESULT); + Result.addOperand(MCOperand::createImm(ResultVTs.front().SimpleTy)); + EmitToStreamer(*OutStreamer, Result); + } - bool FirstWAReg = true; + bool AnyWARegs = false; + MCInst Local; + Local.setOpcode(WebAssembly::LOCAL); for (unsigned Idx = 0, IdxE = MRI->getNumVirtRegs(); Idx != IdxE; ++Idx) { unsigned VReg = TargetRegisterInfo::index2VirtReg(Idx); unsigned WAReg = MFI->getWAReg(VReg); @@ -192,20 +201,12 @@ void WebAssemblyAsmPrinter::EmitFunctionBodyStart() { // Don't declare stackified registers. if (int(WAReg) < 0) continue; - if (FirstWAReg) - OS << "\t" ".local "; - else - OS << ", "; - OS << getRegTypeName(VReg); - FirstWAReg = false; + Local.addOperand(MCOperand::createImm(getRegType(VReg).SimpleTy)); + AnyWARegs = true; } - if (!FirstWAReg) - OS << '\n'; + if (AnyWARegs) + EmitToStreamer(*OutStreamer, Local); - // EmitRawText appends a newline, so strip off the last newline. - StringRef Text = OS.str(); - if (!Text.empty()) - OutStreamer->EmitRawText(Text.substr(0, Text.size() - 1)); AsmPrinter::EmitFunctionBodyStart(); } @@ -283,6 +284,8 @@ void WebAssemblyAsmPrinter::EmitEndOfAsmFile(Module &M) { StringRef Text = OS.str(); if (!Text.empty()) OutStreamer->EmitRawText(Text.substr(0, Text.size() - 1)); + + AsmPrinter::EmitEndOfAsmFile(M); } bool WebAssemblyAsmPrinter::PrintAsmOperand(const MachineInstr *MI, |