diff options
Diffstat (limited to 'llvm/lib/Target/AVR/AVRAsmPrinter.cpp')
| -rw-r--r-- | llvm/lib/Target/AVR/AVRAsmPrinter.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/llvm/lib/Target/AVR/AVRAsmPrinter.cpp b/llvm/lib/Target/AVR/AVRAsmPrinter.cpp index 722eecdc16a1..e8a13c712210 100644 --- a/llvm/lib/Target/AVR/AVRAsmPrinter.cpp +++ b/llvm/lib/Target/AVR/AVRAsmPrinter.cpp @@ -15,6 +15,7 @@ #include "AVRMCInstLower.h" #include "AVRSubtarget.h" #include "MCTargetDesc/AVRInstPrinter.h" +#include "MCTargetDesc/AVRMCExpr.h" #include "TargetInfo/AVRTargetInfo.h" #include "llvm/CodeGen/AsmPrinter.h" @@ -53,6 +54,8 @@ public: void emitInstruction(const MachineInstr *MI) override; + const MCExpr *lowerConstant(const Constant *CV) override; + private: const MCRegisterInfo &MRI; }; @@ -176,6 +179,20 @@ void AVRAsmPrinter::emitInstruction(const MachineInstr *MI) { EmitToStreamer(*OutStreamer, I); } +const MCExpr *AVRAsmPrinter::lowerConstant(const Constant *CV) { + MCContext &Ctx = OutContext; + + if (const GlobalValue *GV = dyn_cast<GlobalValue>(CV)) { + bool IsProgMem = GV->getAddressSpace() == AVR::ProgramMemory; + if (IsProgMem) { + const MCExpr *Expr = MCSymbolRefExpr::create(getSymbol(GV), Ctx); + return AVRMCExpr::create(AVRMCExpr::VK_AVR_PM, Expr, false, Ctx); + } + } + + return AsmPrinter::lowerConstant(CV); +} + } // end of namespace llvm extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAVRAsmPrinter() { |
