| //===-- X86AsmPrinter.h - Convert X86 LLVM code to Intel assembly ---------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file was developed by the LLVM research group and is distributed under |
| // the University of Illinois Open Source License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file the shared super class printer that converts from our internal |
| // representation of machine-dependent LLVM code to Intel and AT&T format |
| // assembly language. This printer is the output mechanism used by `llc'. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef X86ASMPRINTER_H |
| #define X86ASMPRINTER_H |
| |
| #include "X86.h" |
| #include "llvm/CodeGen/AsmPrinter.h" |
| #include "llvm/ADT/Statistic.h" |
| #include <set> |
| |
| |
| namespace llvm { |
| namespace x86 { |
| |
| extern Statistic<> EmittedInsts; |
| |
| struct X86SharedAsmPrinter : public AsmPrinter { |
| X86SharedAsmPrinter(std::ostream &O, TargetMachine &TM) |
| : AsmPrinter(O, TM), forCygwin(false), forDarwin(false) { } |
| |
| bool doInitialization(Module &M); |
| void printConstantPool(MachineConstantPool *MCP); |
| bool doFinalization(Module &M); |
| |
| bool forCygwin; |
| bool forDarwin; |
| |
| // Necessary for Darwin to print out the apprioriate types of linker stubs |
| std::set<std::string> FnStubs, GVStubs, LinkOnceStubs; |
| |
| inline static bool isScale(const MachineOperand &MO) { |
| return MO.isImmediate() && |
| (MO.getImmedValue() == 1 || MO.getImmedValue() == 2 || |
| MO.getImmedValue() == 4 || MO.getImmedValue() == 8); |
| } |
| |
| inline static bool isMem(const MachineInstr *MI, unsigned Op) { |
| if (MI->getOperand(Op).isFrameIndex()) return true; |
| if (MI->getOperand(Op).isConstantPoolIndex()) return true; |
| return Op+4 <= MI->getNumOperands() && |
| MI->getOperand(Op ).isRegister() && isScale(MI->getOperand(Op+1)) && |
| MI->getOperand(Op+2).isRegister() && (MI->getOperand(Op+3).isImmediate()|| |
| MI->getOperand(Op+3).isGlobalAddress()); |
| } |
| |
| // SwitchSection - Switch to the specified section of the executable if we are |
| // not already in it! |
| inline static void SwitchSection(std::ostream &OS, std::string &CurSection, |
| const char *NewSection) { |
| if (CurSection != NewSection) { |
| CurSection = NewSection; |
| if (!CurSection.empty()) |
| OS << "\t" << NewSection << "\n"; |
| } |
| } |
| }; |
| |
| } // end namespace x86 |
| } // end namespace llvm |
| |
| #endif |