diff options
Diffstat (limited to 'llvm/lib/Target/VE/VEMCInstLower.cpp')
-rw-r--r-- | llvm/lib/Target/VE/VEMCInstLower.cpp | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/llvm/lib/Target/VE/VEMCInstLower.cpp b/llvm/lib/Target/VE/VEMCInstLower.cpp index 6c8fc3536c34..9815610510e1 100644 --- a/llvm/lib/Target/VE/VEMCInstLower.cpp +++ b/llvm/lib/Target/VE/VEMCInstLower.cpp @@ -11,6 +11,7 @@ // //===----------------------------------------------------------------------===// +#include "MCTargetDesc/VEMCExpr.h" #include "VE.h" #include "llvm/CodeGen/AsmPrinter.h" #include "llvm/CodeGen/MachineFunction.h" @@ -27,9 +28,16 @@ using namespace llvm; static MCOperand LowerSymbolOperand(const MachineInstr *MI, const MachineOperand &MO, const MCSymbol *Symbol, AsmPrinter &AP) { + VEMCExpr::VariantKind Kind = (VEMCExpr::VariantKind)MO.getTargetFlags(); - const MCSymbolRefExpr *MCSym = MCSymbolRefExpr::create(Symbol, AP.OutContext); - return MCOperand::createExpr(MCSym); + const MCExpr *Expr = MCSymbolRefExpr::create(Symbol, AP.OutContext); + // Add offset iff MO is not jump table info or machine basic block. + if (!MO.isJTI() && !MO.isMBB() && MO.getOffset()) + Expr = MCBinaryExpr::createAdd( + Expr, MCConstantExpr::create(MO.getOffset(), AP.OutContext), + AP.OutContext); + Expr = VEMCExpr::create(Kind, Expr, AP.OutContext); + return MCOperand::createExpr(Expr); } static MCOperand LowerOperand(const MachineInstr *MI, const MachineOperand &MO, @@ -43,6 +51,11 @@ static MCOperand LowerOperand(const MachineInstr *MI, const MachineOperand &MO, break; return MCOperand::createReg(MO.getReg()); + case MachineOperand::MO_ExternalSymbol: + return LowerSymbolOperand( + MI, MO, AP.GetExternalSymbolSymbol(MO.getSymbolName()), AP); + case MachineOperand::MO_GlobalAddress: + return LowerSymbolOperand(MI, MO, AP.getSymbol(MO.getGlobal()), AP); case MachineOperand::MO_Immediate: return MCOperand::createImm(MO.getImm()); |