#ifndef ARMASMPRINTER_H
#define ARMASMPRINTER_H
#include "ARM.h"
#include "ARMTargetMachine.h"
#include "llvm/CodeGen/AsmPrinter.h"
#include "llvm/Support/Compiler.h"
namespace llvm {
class MCOperand;
namespace ARM {
enum DW_ISA {
DW_ISA_ARM_thumb = 1,
DW_ISA_ARM_arm = 2
};
}
class LLVM_LIBRARY_VISIBILITY ARMAsmPrinter : public AsmPrinter {
const ARMSubtarget *Subtarget;
ARMFunctionInfo *AFI;
const MachineConstantPool *MCP;
bool InConstantPool;
public:
explicit ARMAsmPrinter(TargetMachine &TM, MCStreamer &Streamer)
: AsmPrinter(TM, Streamer), AFI(NULL), MCP(NULL), InConstantPool(false) {
Subtarget = &TM.getSubtarget<ARMSubtarget>();
}
virtual const char *getPassName() const LLVM_OVERRIDE {
return "ARM Assembly / Object Emitter";
}
void printOperand(const MachineInstr *MI, int OpNum, raw_ostream &O,
const char *Modifier = 0);
virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,
unsigned AsmVariant, const char *ExtraCode,
raw_ostream &O) LLVM_OVERRIDE;
virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
unsigned AsmVariant, const char *ExtraCode,
raw_ostream &O) LLVM_OVERRIDE;
void EmitJumpTable(const MachineInstr *MI);
void EmitJump2Table(const MachineInstr *MI);
virtual void EmitInstruction(const MachineInstr *MI) LLVM_OVERRIDE;
virtual bool runOnMachineFunction(MachineFunction &F) LLVM_OVERRIDE;
virtual void EmitConstantPool() LLVM_OVERRIDE {
}
virtual void EmitFunctionBodyEnd() LLVM_OVERRIDE;
virtual void EmitFunctionEntryLabel() LLVM_OVERRIDE;
virtual void EmitStartOfAsmFile(Module &M) LLVM_OVERRIDE;
virtual void EmitEndOfAsmFile(Module &M) LLVM_OVERRIDE;
virtual void EmitXXStructor(const Constant *CV) LLVM_OVERRIDE;
bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp);
private:
void emitAttributes();
void emitARMAttributeSection();
void EmitPatchedInstruction(const MachineInstr *MI, unsigned TargetOpc);
void EmitUnwindingInstruction(const MachineInstr *MI);
bool emitPseudoExpansionLowering(MCStreamer &OutStreamer,
const MachineInstr *MI);
public:
virtual void EmitDwarfRegOp(const MachineLocation &MLoc, bool Indirect) const
LLVM_OVERRIDE;
virtual unsigned getISAEncoding() LLVM_OVERRIDE {
if (!Subtarget->isTargetMachO())
return 0;
return Subtarget->isThumb() ?
ARM::DW_ISA_ARM_thumb : ARM::DW_ISA_ARM_arm;
}
private:
MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol);
MCSymbol *GetARMJTIPICJumpTableLabel2(unsigned uid, unsigned uid2) const;
MCSymbol *GetARMSJLJEHLabel() const;
MCSymbol *GetARMGVSymbol(const GlobalValue *GV, unsigned char TargetFlags);
public:
virtual void
EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) LLVM_OVERRIDE;
};
}
#endif