llvm-6502/lib/Target/AArch64/AArch64AsmPrinter.h
Tim Northover 72062f5744 Add AArch64 as an experimental target.
This patch adds support for AArch64 (ARM's 64-bit architecture) to
LLVM in the "experimental" category. Currently, it won't be built
unless requested explicitly.

This initial commit should have support for:
    + Assembly of all scalar (i.e. non-NEON, non-Crypto) instructions
      (except the late addition CRC instructions).
    + CodeGen features required for C++03 and C99.
    + Compilation for the "small" memory model: code+static data <
      4GB.
    + Absolute and position-independent code.
    + GNU-style (i.e. "__thread") TLS.
    + Debugging information.

The principal omission, currently, is performance tuning.

This patch excludes the NEON support also reviewed due to an outbreak of
batshit insanity in our legal department. That will be committed soon bringing
the changes to precisely what has been approved.

Further reviews would be gratefully received.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174054 91177308-0d34-0410-b5e6-96231b3b80d8
2013-01-31 12:12:40 +00:00

86 lines
3.0 KiB
C++

// AArch64AsmPrinter.h - Print machine code to an AArch64 .s file -*- C++ -*-=//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// AArch64 Assembly printer class.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_AARCH64ASMPRINTER_H
#define LLVM_AARCH64ASMPRINTER_H
#include "AArch64.h"
#include "AArch64TargetMachine.h"
#include "llvm/CodeGen/AsmPrinter.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/Support/Compiler.h"
namespace llvm {
class MCOperand;
class LLVM_LIBRARY_VISIBILITY AArch64AsmPrinter : public AsmPrinter {
/// Subtarget - Keep a pointer to the AArch64Subtarget around so that we can
/// make the right decision when printing asm code for different targets.
const AArch64Subtarget *Subtarget;
const MachineConstantPool *MCP;
// emitPseudoExpansionLowering - tblgen'erated.
bool emitPseudoExpansionLowering(MCStreamer &OutStreamer,
const MachineInstr *MI);
public:
explicit AArch64AsmPrinter(TargetMachine &TM, MCStreamer &Streamer)
: AsmPrinter(TM, Streamer) {
Subtarget = &TM.getSubtarget<AArch64Subtarget>();
}
bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp) const;
MCOperand lowerSymbolOperand(const MachineOperand &MO,
const MCSymbol *Sym) const;
void EmitInstruction(const MachineInstr *MI);
void EmitEndOfAsmFile(Module &M);
bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,
unsigned AsmVariant, const char *ExtraCode,
raw_ostream &O);
bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
unsigned AsmVariant, const char *ExtraCode,
raw_ostream &O);
void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
/// printSymbolicAddress - Given some kind of reasonably bare symbolic
/// reference, print out the appropriate asm string to represent it. If
/// appropriate, a relocation-specifier will be produced, composed of a
/// general class derived from the MO parameter and an instruction-specific
/// suffix, provided in Suffix. E.g. ":got_lo12:" if a Suffix of "lo12" is
/// given.
bool printSymbolicAddress(const MachineOperand &MO,
bool PrintImmediatePrefix,
StringRef Suffix, raw_ostream &O);
MachineLocation getDebugValueLocation(const MachineInstr *MI) const;
virtual const char *getPassName() const {
return "AArch64 Assembly Printer";
}
/// A no-op on AArch64 because we emit our constant pool entries inline with
/// the function.
virtual void EmitConstantPool() {}
virtual bool runOnMachineFunction(MachineFunction &MF);
};
} // end namespace llvm
#endif