forked from llvm-mirror/llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[WebAssembly] Add WebAssemblyMCInstLower.cpp.
This isn't used yet; it's just a start towards eventually using MC to do instruction printing, and eventually binary encoding. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252194 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
Dan Gohman
committed
Nov 5, 2015
1 parent
268709a
commit 251dff3
Showing
5 changed files
with
168 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
// WebAssemblyMCInstLower.cpp - Convert WebAssembly MachineInstr to an MCInst // | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
/// | ||
/// \file | ||
/// \brief This file contains code to lower WebAssembly MachineInstrs to their | ||
/// corresponding MCInst records. | ||
/// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "WebAssemblyMCInstLower.h" | ||
#include "llvm/ADT/SmallString.h" | ||
#include "llvm/IR/Constants.h" | ||
#include "llvm/CodeGen/AsmPrinter.h" | ||
#include "llvm/CodeGen/MachineBasicBlock.h" | ||
#include "llvm/CodeGen/MachineInstr.h" | ||
#include "llvm/MC/MCAsmInfo.h" | ||
#include "llvm/MC/MCContext.h" | ||
#include "llvm/MC/MCExpr.h" | ||
#include "llvm/MC/MCInst.h" | ||
#include "llvm/Support/ErrorHandling.h" | ||
#include "llvm/Support/raw_ostream.h" | ||
using namespace llvm; | ||
|
||
MCSymbol * | ||
WebAssemblyMCInstLower::GetGlobalAddressSymbol(const MachineOperand &MO) const { | ||
return Printer.getSymbol(MO.getGlobal()); | ||
} | ||
|
||
MCOperand WebAssemblyMCInstLower::LowerSymbolOperand(const MachineOperand &MO, | ||
MCSymbol *Sym) const { | ||
|
||
const MCExpr *Expr = MCSymbolRefExpr::create(Sym, Ctx); | ||
|
||
if (!MO.isJTI() && MO.getOffset()) | ||
llvm_unreachable("unknown symbol op"); | ||
|
||
return MCOperand::createExpr(Expr); | ||
} | ||
|
||
void WebAssemblyMCInstLower::Lower(const MachineInstr *MI, | ||
MCInst &OutMI) const { | ||
OutMI.setOpcode(MI->getOpcode()); | ||
|
||
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { | ||
const MachineOperand &MO = MI->getOperand(i); | ||
|
||
MCOperand MCOp; | ||
switch (MO.getType()) { | ||
default: | ||
MI->dump(); | ||
llvm_unreachable("unknown operand type"); | ||
case MachineOperand::MO_Register: | ||
// Ignore all implicit register operands. | ||
if (MO.isImplicit()) | ||
continue; | ||
MCOp = MCOperand::createReg(MO.getReg()); | ||
break; | ||
case MachineOperand::MO_Immediate: | ||
MCOp = MCOperand::createImm(MO.getImm()); | ||
break; | ||
case MachineOperand::MO_FPImmediate: | ||
MCOp = MCOperand::createFPImm( | ||
MO.getFPImm()->getValueAPF().convertToDouble()); | ||
break; | ||
case MachineOperand::MO_MachineBasicBlock: | ||
MCOp = MCOperand::createExpr( | ||
MCSymbolRefExpr::create(MO.getMBB()->getSymbol(), Ctx)); | ||
break; | ||
case MachineOperand::MO_RegisterMask: | ||
continue; | ||
case MachineOperand::MO_GlobalAddress: | ||
MCOp = LowerSymbolOperand(MO, GetGlobalAddressSymbol(MO)); | ||
break; | ||
} | ||
|
||
OutMI.addOperand(MCOp); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
//===-- WebAssemblyMCInstLower.h - Lower MachineInstr to MCInst -*- C++ -*-===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
/// | ||
/// \file | ||
/// \brief This file declares the class to lower WebAssembly MachineInstrs to | ||
/// their corresponding MCInst records. | ||
/// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYMCINSTLOWER_H | ||
#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYMCINSTLOWER_H | ||
|
||
#include "llvm/Support/Compiler.h" | ||
|
||
namespace llvm { | ||
class AsmPrinter; | ||
class MCContext; | ||
class MCInst; | ||
class MCOperand; | ||
class MCSymbol; | ||
class MachineInstr; | ||
class MachineModuleInfoMachO; | ||
class MachineOperand; | ||
class Mangler; | ||
|
||
// WebAssemblyMCInstLower - This class is used to lower an MachineInstr into an | ||
// MCInst. | ||
class LLVM_LIBRARY_VISIBILITY WebAssemblyMCInstLower { | ||
MCContext &Ctx; | ||
|
||
AsmPrinter &Printer; | ||
|
||
public: | ||
WebAssemblyMCInstLower(MCContext &ctx, AsmPrinter &printer) | ||
: Ctx(ctx), Printer(printer) {} | ||
void Lower(const MachineInstr *MI, MCInst &OutMI) const; | ||
|
||
MCOperand LowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym) const; | ||
|
||
MCSymbol *GetGlobalAddressSymbol(const MachineOperand &MO) const; | ||
}; | ||
} | ||
|
||
#endif |