2013-02-19 16:38:32 +00:00
|
|
|
//===-- X86AsmPrinter.h - X86 implementation of AsmPrinter ------*- C++ -*-===//
|
2005-07-01 22:44:09 +00:00
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
2007-12-29 20:36:04 +00:00
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
2005-07-01 22:44:09 +00:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2009-09-20 07:41:30 +00:00
|
|
|
#ifndef X86ASMPRINTER_H
|
|
|
|
#define X86ASMPRINTER_H
|
2005-07-01 22:44:09 +00:00
|
|
|
|
2010-07-19 23:41:57 +00:00
|
|
|
#include "X86.h"
|
|
|
|
#include "X86MachineFunctionInfo.h"
|
|
|
|
#include "X86TargetMachine.h"
|
2008-06-28 11:08:27 +00:00
|
|
|
#include "llvm/CodeGen/AsmPrinter.h"
|
|
|
|
#include "llvm/CodeGen/MachineModuleInfo.h"
|
2005-07-01 22:44:09 +00:00
|
|
|
#include "llvm/CodeGen/ValueTypes.h"
|
2013-10-31 22:11:56 +00:00
|
|
|
#include "llvm/CodeGen/StackMaps.h"
|
2008-06-28 11:08:27 +00:00
|
|
|
#include "llvm/Support/Compiler.h"
|
2005-07-01 22:44:09 +00:00
|
|
|
|
|
|
|
namespace llvm {
|
|
|
|
|
2009-06-24 05:46:28 +00:00
|
|
|
class MCStreamer;
|
2008-06-28 11:08:27 +00:00
|
|
|
|
2010-05-11 20:16:09 +00:00
|
|
|
class LLVM_LIBRARY_VISIBILITY X86AsmPrinter : public AsmPrinter {
|
2008-06-28 11:08:27 +00:00
|
|
|
const X86Subtarget *Subtarget;
|
2013-10-31 22:11:56 +00:00
|
|
|
StackMaps SM;
|
|
|
|
|
|
|
|
// Parses operands of PATCHPOINT and STACKMAP to produce stack map Location
|
|
|
|
// structures. Returns a result location and an iterator to the operand
|
|
|
|
// immediately following the operands consumed.
|
|
|
|
//
|
|
|
|
// This method is implemented in X86MCInstLower.cpp.
|
|
|
|
static std::pair<StackMaps::Location, MachineInstr::const_mop_iterator>
|
|
|
|
stackmapOperandParser(MachineInstr::const_mop_iterator MOI,
|
|
|
|
MachineInstr::const_mop_iterator MOE);
|
|
|
|
|
2009-02-24 08:30:20 +00:00
|
|
|
public:
|
2010-04-04 08:18:47 +00:00
|
|
|
explicit X86AsmPrinter(TargetMachine &TM, MCStreamer &Streamer)
|
2013-10-31 22:11:56 +00:00
|
|
|
: AsmPrinter(TM, Streamer), SM(*this, stackmapOperandParser) {
|
2008-06-28 11:08:27 +00:00
|
|
|
Subtarget = &TM.getSubtarget<X86Subtarget>();
|
|
|
|
}
|
2005-07-01 22:44:09 +00:00
|
|
|
|
2012-10-09 03:50:37 +00:00
|
|
|
virtual const char *getPassName() const LLVM_OVERRIDE {
|
2013-02-19 16:38:32 +00:00
|
|
|
return "X86 Assembly / Object Emitter";
|
2005-07-01 22:44:09 +00:00
|
|
|
}
|
2012-08-01 18:39:17 +00:00
|
|
|
|
2009-09-12 20:34:57 +00:00
|
|
|
const X86Subtarget &getSubtarget() const { return *Subtarget; }
|
2005-07-01 22:44:09 +00:00
|
|
|
|
2012-10-09 03:50:37 +00:00
|
|
|
virtual void EmitStartOfAsmFile(Module &M) LLVM_OVERRIDE;
|
2010-03-13 02:10:00 +00:00
|
|
|
|
2012-10-09 03:50:37 +00:00
|
|
|
virtual void EmitEndOfAsmFile(Module &M) LLVM_OVERRIDE;
|
2012-08-01 18:39:17 +00:00
|
|
|
|
2012-10-09 03:50:37 +00:00
|
|
|
virtual void EmitInstruction(const MachineInstr *MI) LLVM_OVERRIDE;
|
2012-08-01 18:39:17 +00:00
|
|
|
|
2010-04-04 05:19:20 +00:00
|
|
|
void printSymbolOperand(const MachineOperand &MO, raw_ostream &O);
|
2005-07-01 22:44:09 +00:00
|
|
|
|
2006-02-06 23:41:19 +00:00
|
|
|
// These methods are used by the tablegen'erated instruction printer.
|
2010-04-04 05:19:20 +00:00
|
|
|
void printOperand(const MachineInstr *MI, unsigned OpNo, raw_ostream &O,
|
2012-09-10 21:10:49 +00:00
|
|
|
const char *Modifier = 0, unsigned AsmVariant = 0);
|
2012-09-10 22:50:57 +00:00
|
|
|
void printPCRelImm(const MachineInstr *MI, unsigned OpNo, raw_ostream &O);
|
2009-09-03 00:04:47 +00:00
|
|
|
|
2010-04-04 05:19:20 +00:00
|
|
|
bool printAsmMRegister(const MachineOperand &MO, char Mode, raw_ostream &O);
|
2012-10-09 03:50:37 +00:00
|
|
|
virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
|
|
|
|
unsigned AsmVariant, const char *ExtraCode,
|
|
|
|
raw_ostream &OS) LLVM_OVERRIDE;
|
|
|
|
virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
|
|
|
|
unsigned AsmVariant, const char *ExtraCode,
|
|
|
|
raw_ostream &OS) LLVM_OVERRIDE;
|
|
|
|
|
2010-04-04 05:19:20 +00:00
|
|
|
void printMemReference(const MachineInstr *MI, unsigned Op, raw_ostream &O,
|
Reimplement rip-relative addressing in the X86-64 backend. The new
implementation primarily differs from the former in that the asmprinter
doesn't make a zillion decisions about whether or not something will be
RIP relative or not. Instead, those decisions are made by isel lowering
and propagated through to the asm printer. To achieve this, we:
1. Represent RIP relative addresses by setting the base of the X86 addr
mode to X86::RIP.
2. When ISel Lowering decides that it is safe to use RIP, it lowers to
X86ISD::WrapperRIP. When it is unsafe to use RIP, it lowers to
X86ISD::Wrapper as before.
3. This removes isRIPRel from X86ISelAddressMode, representing it with
a basereg of RIP instead.
4. The addressing mode matching logic in isel is greatly simplified.
5. The asmprinter is greatly simplified, notably the "NotRIPRel" predicate
passed through various printoperand routines is gone now.
6. The various symbol printing routines in asmprinter now no longer infer
when to emit (%rip), they just print the symbol.
I think this is a big improvement over the previous situation. It does have
two small caveats though: 1. I implemented a horrible "no-rip" modifier for
the inline asm "P" constraint modifier. This is a short term hack, there is
a much better, but more involved, solution. 2. I had to xfail an
-aggressive-remat testcase because it isn't handling the use of RIP in the
constant-pool reading instruction. This specific test is easy to fix without
-aggressive-remat, which I intend to do next.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74372 91177308-0d34-0410-b5e6-96231b3b80d8
2009-06-27 04:16:01 +00:00
|
|
|
const char *Modifier=NULL);
|
2010-04-04 05:19:20 +00:00
|
|
|
void printLeaMemReference(const MachineInstr *MI, unsigned Op, raw_ostream &O,
|
Reimplement rip-relative addressing in the X86-64 backend. The new
implementation primarily differs from the former in that the asmprinter
doesn't make a zillion decisions about whether or not something will be
RIP relative or not. Instead, those decisions are made by isel lowering
and propagated through to the asm printer. To achieve this, we:
1. Represent RIP relative addresses by setting the base of the X86 addr
mode to X86::RIP.
2. When ISel Lowering decides that it is safe to use RIP, it lowers to
X86ISD::WrapperRIP. When it is unsafe to use RIP, it lowers to
X86ISD::Wrapper as before.
3. This removes isRIPRel from X86ISelAddressMode, representing it with
a basereg of RIP instead.
4. The addressing mode matching logic in isel is greatly simplified.
5. The asmprinter is greatly simplified, notably the "NotRIPRel" predicate
passed through various printoperand routines is gone now.
6. The various symbol printing routines in asmprinter now no longer infer
when to emit (%rip), they just print the symbol.
I think this is a big improvement over the previous situation. It does have
two small caveats though: 1. I implemented a horrible "no-rip" modifier for
the inline asm "P" constraint modifier. This is a short term hack, there is
a much better, but more involved, solution. 2. I had to xfail an
-aggressive-remat testcase because it isn't handling the use of RIP in the
constant-pool reading instruction. This specific test is easy to fix without
-aggressive-remat, which I intend to do next.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74372 91177308-0d34-0410-b5e6-96231b3b80d8
2009-06-27 04:16:01 +00:00
|
|
|
const char *Modifier=NULL);
|
2008-06-28 11:08:27 +00:00
|
|
|
|
2012-10-03 22:06:44 +00:00
|
|
|
void printIntelMemReference(const MachineInstr *MI, unsigned Op,
|
|
|
|
raw_ostream &O, const char *Modifier=NULL,
|
2012-10-09 03:50:37 +00:00
|
|
|
unsigned AsmVariant = 1);
|
2012-10-03 22:06:44 +00:00
|
|
|
|
2012-10-09 03:50:37 +00:00
|
|
|
virtual bool runOnMachineFunction(MachineFunction &F) LLVM_OVERRIDE;
|
2005-07-01 22:44:09 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
} // end namespace llvm
|
|
|
|
|
|
|
|
#endif
|