1 //===-- X86AsmPrinter.h - Convert X86 LLVM code to Intel assembly ---------===//
3 // The LLVM Compiler Infrastructure
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file the shared super class printer that converts from our internal
11 // representation of machine-dependent LLVM code to Intel and AT&T format
12 // assembly language. This printer is the output mechanism used by `llc'.
14 //===----------------------------------------------------------------------===//
16 #ifndef X86ASMPRINTER_H
17 #define X86ASMPRINTER_H
20 #include "X86TargetMachine.h"
21 #include "llvm/CodeGen/AsmPrinter.h"
22 #include "llvm/CodeGen/DwarfWriter.h"
23 #include "llvm/CodeGen/MachineDebugInfo.h"
24 #include "llvm/ADT/Statistic.h"
30 extern Statistic
<> EmittedInsts
;
32 /// X86DwarfWriter - Dwarf debug info writer customized for Darwin/Mac OS X
34 struct X86DwarfWriter
: public DwarfWriter
{
36 X86DwarfWriter(std::ostream
&o
, AsmPrinter
*ap
)
40 DwarfAbbrevSection
= ".section __DWARFA,__debug_abbrev";
41 DwarfInfoSection
= ".section __DWARFA,__debug_info";
42 DwarfLineSection
= ".section __DWARFA,__debug_line";
43 DwarfFrameSection
= ".section __DWARFA,__debug_frame";
44 DwarfPubNamesSection
= ".section __DWARFA,__debug_pubnames";
45 DwarfPubTypesSection
= ".section __DWARFA,__debug_pubtypes";
46 DwarfStrSection
= ".section __DWARFA,__debug_str";
47 DwarfLocSection
= ".section __DWARFA,__debug_loc";
48 DwarfARangesSection
= ".section __DWARFA,__debug_aranges";
49 DwarfRangesSection
= ".section __DWARFA,__debug_ranges";
50 DwarfMacInfoSection
= ".section __DWARFA,__debug_macinfo";
51 TextSection
= ".text";
52 DataSection
= ".data";
56 struct X86SharedAsmPrinter
: public AsmPrinter
{
59 X86SharedAsmPrinter(std::ostream
&O
, X86TargetMachine
&TM
)
60 : AsmPrinter(O
, TM
), DW(O
, this), forDarwin(false) { }
62 bool doInitialization(Module
&M
);
63 bool doFinalization(Module
&M
);
65 void getAnalysisUsage(AnalysisUsage
&AU
) const {
67 AU
.addRequired
<MachineDebugInfo
>();
68 MachineFunctionPass::getAnalysisUsage(AU
);
71 bool forDarwin
; // FIXME: eliminate.
73 // Necessary for Darwin to print out the apprioriate types of linker stubs
74 std::set
<std::string
> FnStubs
, GVStubs
, LinkOnceStubs
;
76 inline static bool isScale(const MachineOperand
&MO
) {
77 return MO
.isImmediate() &&
78 (MO
.getImmedValue() == 1 || MO
.getImmedValue() == 2 ||
79 MO
.getImmedValue() == 4 || MO
.getImmedValue() == 8);
82 inline static bool isMem(const MachineInstr
*MI
, unsigned Op
) {
83 if (MI
->getOperand(Op
).isFrameIndex()) return true;
84 return Op
+4 <= MI
->getNumOperands() &&
85 MI
->getOperand(Op
).isRegister() && isScale(MI
->getOperand(Op
+1)) &&
86 MI
->getOperand(Op
+2).isRegister() &&
87 (MI
->getOperand(Op
+3).isImmediate() ||
88 MI
->getOperand(Op
+3).isGlobalAddress() ||
89 MI
->getOperand(Op
+3).isConstantPoolIndex());
93 } // end namespace llvm