1a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner//===-- llvm/CodeGen/AsmPrinter.h - AsmPrinter Framework --------*- C++ -*-===//
2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
3a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner//                     The LLVM Compiler Infrastructure
4a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
8a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner//===----------------------------------------------------------------------===//
9a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner//
10563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey// This file contains a class to be used as the base class for target specific
11563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey// asm writers.  This class primarily handles common functionality used by
12563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey// all asm writers.
13a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner//
14a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner//===----------------------------------------------------------------------===//
15a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner
16a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#ifndef LLVM_CODEGEN_ASMPRINTER_H
17a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#define LLVM_CODEGEN_ASMPRINTER_H
18a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner
194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/ADT/MapVector.h"
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/Twine.h"
21a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#include "llvm/CodeGen/MachineFunctionPass.h"
226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/CodeGen/DwarfStringPoolEntry.h"
230b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/InlineAsm.h"
241f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h"
2550bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper#include "llvm/Support/ErrorHandling.h"
26a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner
27a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattnernamespace llvm {
28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass AsmPrinterHandler;
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass BlockAddress;
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass ByteStreamer;
31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass GCStrategy;
32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass Constant;
33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass ConstantArray;
344c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarclass DIE;
354c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarclass DIEAbbrev;
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass GCMetadataPrinter;
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass GlobalValue;
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass GlobalVariable;
39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MachineBasicBlock;
40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MachineFunction;
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MachineInstr;
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MachineLocation;
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MachineLoopInfo;
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MachineLoop;
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MachineConstantPoolValue;
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MachineJumpTableInfo;
47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MachineModuleInfo;
48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCAsmInfo;
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCCFIInstruction;
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCContext;
51ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesclass MCExpr;
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCInst;
53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCSection;
54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCStreamer;
55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCSubtargetInfo;
56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCSymbol;
576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass MCTargetOptions;
58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MDNode;
59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass DwarfDebug;
60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass Mangler;
61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass TargetLoweringObjectFile;
62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass DataLayout;
63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass TargetMachine;
64dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// This class is intended to be used as a driving class for all asm writers.
66dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass AsmPrinter : public MachineFunctionPass {
67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinespublic:
68dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Target machine description.
69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ///
70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  TargetMachine &TM;
71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
72dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Target Asm Printer information.
73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ///
74dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCAsmInfo *MAI;
75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// This is the context for the output file that we are streaming. This owns
77dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// all of the global MC-related objects for the generated translation unit.
78dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCContext &OutContext;
79dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// This is the MCStreamer object for the file we are generating. This
81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// contains the transient state for the current translation unit that we are
82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// generating (such as the current section etc).
836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  std::unique_ptr<MCStreamer> OutStreamer;
84dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// The current machine function.
86dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MachineFunction *MF;
87dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// This is a pointer to the current MachineModuleInfo.
89dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MachineModuleInfo *MMI;
90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
91dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Name-mangler for global names.
92dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ///
93dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Mangler *Mang;
94dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// The symbol for the current function. This is recalculated at the beginning
96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// of each call to runOnMachineFunction().
97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ///
98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCSymbol *CurrentFnSym;
99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// The symbol used to represent the start of the current function for the
101dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// purpose of calculating its size (e.g. using the .size directive). By
102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// default, this is equal to CurrentFnSym.
103dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCSymbol *CurrentFnSymForSize;
104dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
105ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// Map global GOT equivalent MCSymbols to GlobalVariables and keep track of
106ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// its number of uses by other globals.
107ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  typedef std::pair<const GlobalVariable *, unsigned> GOTEquivUsePair;
1084c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  MapVector<const MCSymbol *, GOTEquivUsePair> GlobalGOTEquivs;
109ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
110dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesprivate:
1114c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  MCSymbol *CurrentFnBegin;
1124c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  MCSymbol *CurrentFnEnd;
1134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  MCSymbol *CurExceptionSym;
1144c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
115dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // The garbage collection metadata printer table.
116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void *GCMetadataPrinters; // Really a DenseMap.
117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
118dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Emit comments in assembly output if this is true.
119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ///
120dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool VerboseAsm;
121dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  static char ID;
122dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// If VerboseAsm is set, a pointer to the loop info for this function.
124dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MachineLoopInfo *LI;
125dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  struct HandlerInfo {
127dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    AsmPrinterHandler *Handler;
128dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    const char *TimerName, *TimerGroupName;
129dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    HandlerInfo(AsmPrinterHandler *Handler, const char *TimerName,
130dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                const char *TimerGroupName)
131dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        : Handler(Handler), TimerName(TimerName),
132dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          TimerGroupName(TimerGroupName) {}
133dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  };
134dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// A vector of all debug/EH info emitters we should use. This vector
135dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// maintains ownership of the emitters.
136dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SmallVector<HandlerInfo, 1> Handlers;
137a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner
138dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// If the target supports dwarf debug info, this pointer is non-null.
139dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  DwarfDebug *DD;
140dd2ad8432f104282ff43c94457f474ea0a264175Mikhail Glushenkov
141dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesprotected:
142ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  explicit AsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer);
143dd2ad8432f104282ff43c94457f474ea0a264175Mikhail Glushenkov
144dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinespublic:
1450c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  ~AsmPrinter() override;
146dd2ad8432f104282ff43c94457f474ea0a264175Mikhail Glushenkov
147dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  DwarfDebug *getDwarfDebug() { return DD; }
148ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  DwarfDebug *getDwarfDebug() const { return DD; }
149b11caedd6f36afc6518cf0ea9bbff6500fd77334Chris Lattner
150dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Return true if assembly output should contain comments.
151dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ///
152dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool isVerbose() const { return VerboseAsm; }
153a432997745f668e85e45826106430f69238b1d1eRafael Espindola
154dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Return a unique ID for the current function.
155dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ///
156dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned getFunctionNumber() const;
157f46337004ab08076774932785679460ec3d3bb9aCharles Davis
1584c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  MCSymbol *getFunctionBegin() const { return CurrentFnBegin; }
1594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  MCSymbol *getFunctionEnd() const { return CurrentFnEnd; }
1604c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  MCSymbol *getCurExceptionSym();
1614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
162dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Return information about object file lowering.
163dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const TargetLoweringObjectFile &getObjFileLowering() const;
164dd2ad8432f104282ff43c94457f474ea0a264175Mikhail Glushenkov
165dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Return information about data layout.
166dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const DataLayout &getDataLayout() const;
167dd2ad8432f104282ff43c94457f474ea0a264175Mikhail Glushenkov
168cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  /// Return the pointer size from the TargetMachine
169cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  unsigned getPointerSize() const;
170cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
171dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Return information about subtarget.
172dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCSubtargetInfo &getSubtargetInfo() const;
173dd2ad8432f104282ff43c94457f474ea0a264175Mikhail Glushenkov
174dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitToStreamer(MCStreamer &S, const MCInst &Inst);
17587370b8301fa39ee54bdcaae0618fd565e808466Devang Patel
176dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Return the target triple string.
177dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  StringRef getTargetTriple() const;
178dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
179dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Return the current section we are emitting to.
180dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCSection *getCurrentSection() const;
181dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
182dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void getNameWithPrefix(SmallVectorImpl<char> &Name,
183dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                         const GlobalValue *GV) const;
184dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
185dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCSymbol *getSymbol(const GlobalValue *GV) const;
186dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
187dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  //===------------------------------------------------------------------===//
188dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // MachineFunctionPass Implementation.
189dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  //===------------------------------------------------------------------===//
190dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
191dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Record analysis usage.
192dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ///
193dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void getAnalysisUsage(AnalysisUsage &AU) const override;
194dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
195dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Set up the AsmPrinter when we are working on a new module. If your pass
196dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// overrides this, it must make sure to explicitly call this implementation.
197dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool doInitialization(Module &M) override;
198dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
199dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Shut down the asmprinter. If you override this in your pass, you must make
200dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// sure to call it explicitly.
201dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool doFinalization(Module &M) override;
202dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
203dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Emit the specified function out to the OutStreamer.
204dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool runOnMachineFunction(MachineFunction &MF) override {
205dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SetupMachineFunction(MF);
206dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    EmitFunctionBody();
207dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return false;
208dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
209dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
210dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  //===------------------------------------------------------------------===//
211dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Coarse grained IR lowering routines.
212dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  //===------------------------------------------------------------------===//
213dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
214dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// This should be called when a new MachineFunction is being processed from
215dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// runOnMachineFunction.
216dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void SetupMachineFunction(MachineFunction &MF);
217dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
218dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// This method emits the body and trailer for a function.
219dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitFunctionBody();
220dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
221dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void emitCFIInstruction(const MachineInstr &MI);
222dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
223ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  void emitFrameAlloc(const MachineInstr &MI);
224ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
225dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  enum CFIMoveType { CFI_M_None, CFI_M_EH, CFI_M_Debug };
226dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  CFIMoveType needsCFIMoves();
227dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
228dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool needsSEHMoves();
229dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
230dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Print to the current output stream assembly representations of the
231dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// constants in the constant pool MCP. This is used to print out constants
232dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// which have been "spilled to memory" by the code generator.
233dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ///
234dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual void EmitConstantPool();
235dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
236dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Print assembly representations of the jump tables used by the current
237dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// function to the current output stream.
238dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ///
239cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  virtual void EmitJumpTableInfo();
240dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
241dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Emit the specified global variable to the .s file.
242dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual void EmitGlobalVariable(const GlobalVariable *GV);
243dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
244dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Check to see if the specified global is a special global used by LLVM. If
245dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// so, emit it and return true, otherwise do nothing and return false.
246dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool EmitSpecialLLVMGlobal(const GlobalVariable *GV);
247dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
248dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Emit an alignment directive to the specified power of two boundary. For
249dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// example, if you pass in 3 here, you will get an 8 byte alignment. If a
250dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// global value is specified, and if that global has an explicit alignment
251dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// requested, it will override the alignment request if required for
252dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// correctness.
253dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ///
254dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitAlignment(unsigned NumBits, const GlobalObject *GO = nullptr) const;
255dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
256ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// Lower the specified LLVM Constant to an MCExpr.
257ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  const MCExpr *lowerConstant(const Constant *CV);
258dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
259dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \brief Print a general LLVM constant to the .s file.
260cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  void EmitGlobalConstant(const DataLayout &DL, const Constant *CV);
261dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
262ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// \brief Unnamed constant global variables solely contaning a pointer to
263ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// another globals variable act like a global variable "proxy", or GOT
264ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// equivalents, i.e., it's only used to hold the address of the latter. One
265ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// optimization is to replace accesses to these proxies by using the GOT
266ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// entry for the final global instead. Hence, we select GOT equivalent
267ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// candidates among all the module global variables, avoid emitting them
268ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// unnecessarily and finally replace references to them by pc relative
269ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// accesses to GOT entries.
270ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  void computeGlobalGOTEquivs(Module &M);
271ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
272ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// \brief Constant expressions using GOT equivalent globals may not be
273ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// eligible for PC relative GOT entry conversion, in such cases we need to
274ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// emit the proxies we previously omitted in EmitGlobalVariable.
275ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  void emitGlobalGOTEquivs();
276ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
277dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  //===------------------------------------------------------------------===//
278dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Overridable Hooks
279dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  //===------------------------------------------------------------------===//
280dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
281dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Targets can, or in the case of EmitInstruction, must implement these to
282dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // customize output.
283dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
284dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// This virtual method can be overridden by targets that want to emit
285dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// something at the start of their file.
286dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual void EmitStartOfAsmFile(Module &) {}
287dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
288dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// This virtual method can be overridden by targets that want to emit
289dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// something at the end of their file.
290dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual void EmitEndOfAsmFile(Module &) {}
291dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
292dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Targets can override this to emit stuff before the first basic block in
293dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// the function.
294dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual void EmitFunctionBodyStart() {}
295dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
296dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Targets can override this to emit stuff after the last basic block in the
297dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// function.
298dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual void EmitFunctionBodyEnd() {}
299dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
300ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// Targets can override this to emit stuff at the start of a basic block.
301ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// By default, this method prints the label for the specified
302ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// MachineBasicBlock, an alignment (if present) and a comment describing it
303ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// if appropriate.
304ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  virtual void EmitBasicBlockStart(const MachineBasicBlock &MBB) const;
305ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
30637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// Targets can override this to emit stuff at the end of a basic block.
30737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  virtual void EmitBasicBlockEnd(const MachineBasicBlock &MBB) {}
30837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
309dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Targets should implement this to emit instructions.
310dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual void EmitInstruction(const MachineInstr *) {
311dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    llvm_unreachable("EmitInstruction not implemented");
312dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
313dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
314dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Return the symbol for the specified constant pool entry.
315dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual MCSymbol *GetCPISymbol(unsigned CPID) const;
316dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
317dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual void EmitFunctionEntryLabel();
318dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
319dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV);
320dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
321dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Targets can override this to change how global constants that are part of
322dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// a C++ static/global constructor list are emitted.
323cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  virtual void EmitXXStructor(const DataLayout &DL, const Constant *CV) {
324cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    EmitGlobalConstant(DL, CV);
325cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  }
326dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
327dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Return true if the basic block has exactly one predecessor and the control
328dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// transfer mechanism between the predecessor and this block is a
329dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// fall-through.
330dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual bool
331dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const;
332dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
333dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Targets can override this to customize the output of IMPLICIT_DEF
334dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// instructions in verbose mode.
335dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual void emitImplicitDef(const MachineInstr *MI) const;
336dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
337dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  //===------------------------------------------------------------------===//
338dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Symbol Lowering Routines.
339dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  //===------------------------------------------------------------------===//
340dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinespublic:
3414c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  MCSymbol *createTempSymbol(const Twine &Name) const;
342dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
343dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Return the MCSymbol for a private symbol with global value name as its
344dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// base, with the specified suffix.
345dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCSymbol *getSymbolWithGlobalValueBase(const GlobalValue *GV,
346dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                         StringRef Suffix) const;
347dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
348dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Return the MCSymbol for the specified ExternalSymbol.
349dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCSymbol *GetExternalSymbolSymbol(StringRef Sym) const;
350dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
351dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Return the symbol for the specified jump table entry.
352dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCSymbol *GetJTISymbol(unsigned JTID, bool isLinkerPrivate = false) const;
353dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
354dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Return the symbol for the specified jump table .set
355dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// FIXME: privatize to AsmPrinter.
356dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCSymbol *GetJTSetSymbol(unsigned UID, unsigned MBBID) const;
357dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
358dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Return the MCSymbol used to satisfy BlockAddress uses of the specified
359dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// basic block.
360dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCSymbol *GetBlockAddressSymbol(const BlockAddress *BA) const;
361dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCSymbol *GetBlockAddressSymbol(const BasicBlock *BB) const;
362dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
363dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  //===------------------------------------------------------------------===//
364dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Emission Helper Routines.
365dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  //===------------------------------------------------------------------===//
366dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinespublic:
367dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// This is just convenient handler for printing offsets.
368dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void printOffset(int64_t Offset, raw_ostream &OS) const;
369dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
370dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Emit a byte directive and value.
371dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ///
372dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitInt8(int Value) const;
373dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
374dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Emit a short directive and value.
375dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ///
376dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitInt16(int Value) const;
377dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
378dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Emit a long directive and value.
379dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ///
380dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitInt32(int Value) const;
381dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
382dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Emit something like ".long Hi-Lo" where the size in bytes of the directive
383dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// is specified by Size and Hi/Lo specify the labels.  This implicitly uses
384dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// .set if it is available.
385dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo,
386dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                           unsigned Size) const;
387dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
388dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Emit something like ".long Label+Offset" where the size in bytes of the
389dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// directive is specified by Size and Label specifies the label.  This
390dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// implicitly uses .set if it is available.
391dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitLabelPlusOffset(const MCSymbol *Label, uint64_t Offset,
392dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                           unsigned Size, bool IsSectionRelative = false) const;
393dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
394dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Emit something like ".long Label" where the size in bytes of the directive
395dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// is specified by Size and Label specifies the label.
396dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitLabelReference(const MCSymbol *Label, unsigned Size,
397dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                          bool IsSectionRelative = false) const {
398dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    EmitLabelPlusOffset(Label, 0, Size, IsSectionRelative);
399dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
400dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
401dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  //===------------------------------------------------------------------===//
402dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Dwarf Emission Helper Routines
403dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  //===------------------------------------------------------------------===//
404dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
405dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Emit the specified signed leb128 value.
406dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitSLEB128(int64_t Value, const char *Desc = nullptr) const;
407dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
408dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Emit the specified unsigned leb128 value.
409dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitULEB128(uint64_t Value, const char *Desc = nullptr,
410dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                   unsigned PadTo = 0) const;
411dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
412dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Emit a .byte 42 directive that corresponds to an encoding.  If verbose
413dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// assembly output is enabled, we output comments describing the encoding.
414dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Desc is a string saying what the encoding is specifying (e.g. "LSDA").
415dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitEncodingByte(unsigned Val, const char *Desc = nullptr) const;
416dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
417dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Return the size of the encoding in bytes.
418dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned GetSizeOfEncodedValue(unsigned Encoding) const;
419dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
420dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Emit reference to a ttype global with a specified encoding.
421dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitTTypeReference(const GlobalValue *GV, unsigned Encoding) const;
422dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
423cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  /// Emit a reference to a symbol for use in dwarf. Different object formats
424cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  /// represent this in different ways. Some use a relocation others encode
425cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  /// the label offset in its section.
426cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  void emitDwarfSymbolReference(const MCSymbol *Label,
427cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar                                bool ForceOffset = false) const;
428dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
4296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Emit the 4-byte offset of a string from the start of its section.
4306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ///
4316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// When possible, emit a DwarfStringPool section offset without any
4326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// relocations, and without using the symbol.  Otherwise, defers to \a
433cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  /// emitDwarfSymbolReference().
4346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void emitDwarfStringOffset(DwarfStringPoolEntryRef S) const;
4356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
436dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Get the value for DW_AT_APPLE_isa. Zero if no isa encoding specified.
4374c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  virtual unsigned getISAEncoding() { return 0; }
438dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
43937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// EmitDwarfRegOp - Emit a dwarf register operation.
440ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  virtual void EmitDwarfRegOp(ByteStreamer &BS,
441ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                              const MachineLocation &MLoc) const;
442dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
443dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  //===------------------------------------------------------------------===//
444dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Dwarf Lowering Routines
445dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  //===------------------------------------------------------------------===//
446dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
447dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \brief Emit frame instruction to describe the layout of the frame.
448dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void emitCFIInstruction(const MCCFIInstruction &Inst) const;
449dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
4504c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// \brief Emit Dwarf abbreviation table.
451cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  template <typename T> void emitDwarfAbbrevs(const T &Abbrevs) const {
452cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    // For each abbreviation.
453cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    for (const auto &Abbrev : Abbrevs)
454cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar      emitDwarfAbbrev(*Abbrev);
455cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
456cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    // Mark end of abbreviations.
457cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    EmitULEB128(0, "EOM(3)");
458cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  }
459cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
460cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  void emitDwarfAbbrev(const DIEAbbrev &Abbrev) const;
4614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
4624c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// \brief Recursively emit Dwarf DIE tree.
4634c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void emitDwarfDIE(const DIE &Die) const;
4644c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
465dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  //===------------------------------------------------------------------===//
466dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Inline Asm Support
467dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  //===------------------------------------------------------------------===//
468dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinespublic:
469dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // These are hooks that targets can override to implement inline asm
470dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // support.  These should probably be moved out of AsmPrinter someday.
471dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
472dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Print information related to the specified machine instr that is
473dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// independent of the operand, and may be independent of the instr itself.
474dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// This can be useful for portably encoding the comment character or other
475dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// bits of target-specific knowledge into the asmstrings.  The syntax used is
476dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// ${:comment}.  Targets can override this to add support for their own
477dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// strange codes.
478dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual void PrintSpecial(const MachineInstr *MI, raw_ostream &OS,
479dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                            const char *Code) const;
480dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
481dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Print the specified operand of MI, an INLINEASM instruction, using the
482dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// specified assembler variant.  Targets should override this to format as
483dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// appropriate.  This method can return true if the operand is erroneous.
484dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
485dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                               unsigned AsmVariant, const char *ExtraCode,
486dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                               raw_ostream &OS);
487dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
488dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Print the specified operand of MI, an INLINEASM instruction, using the
489dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// specified assembler variant as an address. Targets should override this to
490dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// format as appropriate.  This method can return true if the operand is
491dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// erroneous.
492dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
493dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                     unsigned AsmVariant, const char *ExtraCode,
494dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                     raw_ostream &OS);
495dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
496ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// Let the target do anything it needs to do before emitting inlineasm.
497ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// \p StartInfo - the subtarget info before parsing inline asm
498ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  virtual void emitInlineAsmStart() const;
499ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
500dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Let the target do anything it needs to do after emitting inlineasm.
501dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// This callback can be used restore the original mode in case the
502dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// inlineasm contains directives to switch modes.
503dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \p StartInfo - the original subtarget info before inline asm
504dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \p EndInfo   - the final subtarget info after parsing the inline asm,
505dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ///                or NULL if the value is unknown.
506dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual void emitInlineAsmEnd(const MCSubtargetInfo &StartInfo,
507dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                const MCSubtargetInfo *EndInfo) const;
508dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
509dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesprivate:
510dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Private state for PrintSpecial()
511dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Assign a unique ID to this machine instruction.
512dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  mutable const MachineInstr *LastMI;
513dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  mutable unsigned LastFn;
514dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  mutable unsigned Counter;
5154c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
5164c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// This method emits the header for the current function.
5176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  virtual void EmitFunctionHeader();
518dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
519dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Emit a blob of inline asm to the output streamer.
520dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void
5214c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  EmitInlineAsm(StringRef Str, const MCSubtargetInfo &STI,
5226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                const MCTargetOptions &MCOptions,
5234c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                const MDNode *LocMDNode = nullptr,
524dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                InlineAsm::AsmDialect AsmDialect = InlineAsm::AD_ATT) const;
525dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
526dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// This method formats and emits the specified machine instruction that is an
527dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// inline asm.
528dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitInlineAsm(const MachineInstr *MI) const;
529dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
530dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  //===------------------------------------------------------------------===//
531dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Internal Implementation Details
532dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  //===------------------------------------------------------------------===//
533dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
534dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// This emits visibility information about symbol, if this is suported by the
535dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// target.
536dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitVisibility(MCSymbol *Sym, unsigned Visibility,
537dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                      bool IsDefinition = true) const;
538dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
539dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const;
540dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
541dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitJumpTableEntry(const MachineJumpTableInfo *MJTI,
542dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                          const MachineBasicBlock *MBB, unsigned uid) const;
543dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitLLVMUsedList(const ConstantArray *InitList);
544dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Emit llvm.ident metadata in an '.ident' directive.
545dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitModuleIdents(Module &M);
546cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  void EmitXXStructorList(const DataLayout &DL, const Constant *List,
547cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar                          bool isCtor);
548dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  GCMetadataPrinter *GetOrCreateGCPrinter(GCStrategy &C);
549dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines};
550a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner}
551a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner
552a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#endif
553