X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FWebAssembly%2FWebAssemblyAsmPrinter.cpp;h=6a25c043c07ddd81296ce54f0b49dc07a439ec41;hb=b58587dac137302afc7802276cb8e32dc5f005a3;hp=c452e1dd024422a91b9234cd109445500b5d8a37;hpb=19dfe052ee3b5eefb2a9ac4300217f81aeaa810c;p=oota-llvm.git diff --git a/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp index c452e1dd024..6a25c043c07 100644 --- a/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp +++ b/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp @@ -21,7 +21,6 @@ #include "WebAssemblyMachineFunctionInfo.h" #include "WebAssemblyRegisterInfo.h" #include "WebAssemblySubtarget.h" -#include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringExtras.h" #include "llvm/CodeGen/Analysis.h" #include "llvm/CodeGen/AsmPrinter.h" @@ -34,7 +33,6 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Support/raw_ostream.h" - using namespace llvm; #define DEBUG_TYPE "asm-printer" @@ -58,10 +56,6 @@ private: // MachineFunctionPass Implementation. //===------------------------------------------------------------------===// - void getAnalysisUsage(AnalysisUsage &AU) const override { - AsmPrinter::getAnalysisUsage(AU); - } - bool runOnMachineFunction(MachineFunction &MF) override { MRI = &MF.getRegInfo(); MFI = MF.getInfo(); @@ -76,7 +70,7 @@ private: void EmitConstantPool() override; void EmitFunctionBodyStart() override; void EmitInstruction(const MachineInstr *MI) override; - void EmitEndOfAsmFile(Module &M) override; + const MCExpr *lowerConstant(const Constant *CV) override; bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, unsigned AsmVariant, const char *ExtraCode, raw_ostream &OS) override; @@ -96,7 +90,10 @@ private: //===----------------------------------------------------------------------===// MVT WebAssemblyAsmPrinter::getRegType(unsigned RegNo) const { - const TargetRegisterClass *TRC = MRI->getRegClass(RegNo); + const TargetRegisterClass *TRC = + TargetRegisterInfo::isVirtualRegister(RegNo) + ? MRI->getRegClass(RegNo) + : MRI->getTargetRegisterInfo()->getMinimalPhysRegClass(RegNo); for (MVT T : {MVT::i32, MVT::i64, MVT::f32, MVT::f64}) if (TRC->hasType(T)) return T; @@ -116,21 +113,7 @@ std::string WebAssemblyAsmPrinter::regToString(const MachineOperand &MO) { } const char *WebAssemblyAsmPrinter::toString(MVT VT) const { - switch (VT.SimpleTy) { - default: - break; - case MVT::f32: - return "f32"; - case MVT::f64: - return "f64"; - case MVT::i32: - return "i32"; - case MVT::i64: - return "i64"; - } - DEBUG(dbgs() << "Invalid type " << EVT(VT).getEVTString() << '\n'); - llvm_unreachable("invalid type"); - return ""; + return WebAssembly::TypeToString(VT); } //===----------------------------------------------------------------------===// @@ -146,11 +129,9 @@ void WebAssemblyAsmPrinter::EmitJumpTableInfo() { // Nothing to do; jump tables are incorporated into the instruction stream. } -static void ComputeLegalValueVTs(const Function &F, - const TargetMachine &TM, - Type *Ty, - SmallVectorImpl &ValueVTs) { - const DataLayout& DL(F.getParent()->getDataLayout()); +static void ComputeLegalValueVTs(const Function &F, const TargetMachine &TM, + Type *Ty, SmallVectorImpl &ValueVTs) { + const DataLayout &DL(F.getParent()->getDataLayout()); const WebAssemblyTargetLowering &TLI = *TM.getSubtarget(F).getTargetLowering(); SmallVector VTs; @@ -173,7 +154,6 @@ void WebAssemblyAsmPrinter::EmitFunctionBodyStart() { EmitToStreamer(*OutStreamer, Param); } - SmallVector ResultVTs; const Function &F(*MF->getFunction()); ComputeLegalValueVTs(F, TM, F.getReturnType(), ResultVTs); @@ -204,6 +184,13 @@ void WebAssemblyAsmPrinter::EmitFunctionBodyStart() { Local.addOperand(MCOperand::createImm(getRegType(VReg).SimpleTy)); AnyWARegs = true; } + auto &PhysRegs = MFI->getPhysRegs(); + for (unsigned PReg = 0; PReg < PhysRegs.size(); ++PReg) { + if (PhysRegs[PReg] == -1U) + continue; + Local.addOperand(MCOperand::createImm(getRegType(PReg).SimpleTy)); + AnyWARegs = true; + } if (AnyWARegs) EmitToStreamer(*OutStreamer, Local); @@ -231,61 +218,12 @@ void WebAssemblyAsmPrinter::EmitInstruction(const MachineInstr *MI) { } } -void WebAssemblyAsmPrinter::EmitEndOfAsmFile(Module &M) { - const DataLayout &DL = M.getDataLayout(); - - SmallString<128> Str; - raw_svector_ostream OS(Str); - for (const Function &F : M) - if (F.isDeclarationForLinker()) { - assert(F.hasName() && "imported functions must have a name"); - if (F.isIntrinsic()) - continue; - if (Str.empty()) - OS << "\t.imports\n"; - - MCSymbol *Sym = OutStreamer->getContext().getOrCreateSymbol(F.getName()); - OS << "\t.import " << *Sym << " \"\" " << *Sym; - - const WebAssemblyTargetLowering &TLI = - *TM.getSubtarget(F).getTargetLowering(); - - // If we need to legalize the return type, it'll get converted into - // passing a pointer. - bool SawParam = false; - SmallVector ResultVTs; - ComputeLegalValueVTs(F, TM, F.getReturnType(), ResultVTs); - if (ResultVTs.size() > 1) { - ResultVTs.clear(); - OS << " (param " << toString(TLI.getPointerTy(DL)); - SawParam = true; - } - - for (const Argument &A : F.args()) { - SmallVector ParamVTs; - ComputeLegalValueVTs(F, TM, A.getType(), ParamVTs); - for (MVT VT : ParamVTs) { - if (!SawParam) { - OS << " (param"; - SawParam = true; - } - OS << ' ' << toString(VT); - } - } - if (SawParam) - OS << ')'; - - for (MVT VT : ResultVTs) - OS << " (result " << toString(VT) << ')'; - - OS << '\n'; - } - - StringRef Text = OS.str(); - if (!Text.empty()) - OutStreamer->EmitRawText(Text.substr(0, Text.size() - 1)); - - AsmPrinter::EmitEndOfAsmFile(M); +const MCExpr *WebAssemblyAsmPrinter::lowerConstant(const Constant *CV) { + if (const GlobalValue *GV = dyn_cast(CV)) + if (GV->getValueType()->isFunctionTy()) + return MCSymbolRefExpr::create( + getSymbol(GV), MCSymbolRefExpr::VK_WebAssembly_FUNCTION, OutContext); + return AsmPrinter::lowerConstant(CV); } bool WebAssemblyAsmPrinter::PrintAsmOperand(const MachineInstr *MI, @@ -295,16 +233,36 @@ bool WebAssemblyAsmPrinter::PrintAsmOperand(const MachineInstr *MI, if (AsmVariant != 0) report_fatal_error("There are no defined alternate asm variants"); + // First try the generic code, which knows about modifiers like 'c' and 'n'. + if (!AsmPrinter::PrintAsmOperand(MI, OpNo, AsmVariant, ExtraCode, OS)) + return false; + if (!ExtraCode) { const MachineOperand &MO = MI->getOperand(OpNo); - if (MO.isImm()) + switch (MO.getType()) { + case MachineOperand::MO_Immediate: OS << MO.getImm(); - else + return false; + case MachineOperand::MO_Register: OS << regToString(MO); - return false; + return false; + case MachineOperand::MO_GlobalAddress: + getSymbol(MO.getGlobal())->print(OS, MAI); + printOffset(MO.getOffset(), OS); + return false; + case MachineOperand::MO_ExternalSymbol: + GetExternalSymbolSymbol(MO.getSymbolName())->print(OS, MAI); + printOffset(MO.getOffset(), OS); + return false; + case MachineOperand::MO_MachineBasicBlock: + MO.getMBB()->getSymbol()->print(OS, MAI); + return false; + default: + break; + } } - return AsmPrinter::PrintAsmOperand(MI, OpNo, AsmVariant, ExtraCode, OS); + return true; } bool WebAssemblyAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, @@ -316,7 +274,9 @@ bool WebAssemblyAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, report_fatal_error("There are no defined alternate asm variants"); if (!ExtraCode) { - OS << regToString(MI->getOperand(OpNo)); + // TODO: For now, we just hard-code 0 as the constant offset; teach + // SelectInlineAsmMemoryOperand how to do address mode matching. + OS << "0(" + regToString(MI->getOperand(OpNo)) + ')'; return false; }