blob: d602660b3bd8cf7c80231e3ac24cf786787401a1 [file] [log] [blame]
Chris Lattner9efd1182010-04-04 19:09:29 +00001//===-- AsmPrinterDwarf.cpp - AsmPrinter Dwarf Support --------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the Dwarf emissions parts of AsmPrinter.
11//
12//===----------------------------------------------------------------------===//
13
Eric Christopher29e874d2014-03-07 22:40:37 +000014#include "ByteStreamer.h"
Adrian Prantl92da14b2015-03-02 22:02:33 +000015#include "DwarfDebug.h"
Adrian Prantlb16d9eb2015-01-12 22:19:22 +000016#include "DwarfExpression.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000017#include "llvm/ADT/Twine.h"
Chandler Carruthd9903882015-01-14 11:23:27 +000018#include "llvm/CodeGen/AsmPrinter.h"
Eric Christopher73302642015-02-19 23:29:42 +000019#include "llvm/CodeGen/MachineModuleInfo.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000020#include "llvm/IR/DataLayout.h"
Chris Lattner9efd1182010-04-04 19:09:29 +000021#include "llvm/MC/MCAsmInfo.h"
Eric Christopher73302642015-02-19 23:29:42 +000022#include "llvm/MC/MCRegisterInfo.h"
Chris Lattner70a4fce2010-04-04 23:25:33 +000023#include "llvm/MC/MCSection.h"
Chris Lattner9efd1182010-04-04 19:09:29 +000024#include "llvm/MC/MCStreamer.h"
Chris Lattner70a4fce2010-04-04 23:25:33 +000025#include "llvm/MC/MCSymbol.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000026#include "llvm/MC/MachineLocation.h"
27#include "llvm/Support/Dwarf.h"
28#include "llvm/Support/ErrorHandling.h"
Chris Lattnere619c0d2010-04-04 20:20:50 +000029#include "llvm/Target/TargetLoweringObjectFile.h"
30#include "llvm/Target/TargetMachine.h"
Adrian Prantl92da14b2015-03-02 22:02:33 +000031#include "llvm/Target/TargetSubtargetInfo.h"
Chris Lattner9efd1182010-04-04 19:09:29 +000032using namespace llvm;
33
Chandler Carruth1b9dde02014-04-22 02:02:50 +000034#define DEBUG_TYPE "asm-printer"
35
Chris Lattneraabc6042010-04-04 23:41:46 +000036//===----------------------------------------------------------------------===//
37// Dwarf Emission Helper Routines
38//===----------------------------------------------------------------------===//
39
Chris Lattner9efd1182010-04-04 19:09:29 +000040/// EmitSLEB128 - emit the specified signed leb128 value.
David Blaikie5acff7e2013-06-23 18:31:11 +000041void AsmPrinter::EmitSLEB128(int64_t Value, const char *Desc) const {
Chris Lattner9efd1182010-04-04 19:09:29 +000042 if (isVerbose() && Desc)
43 OutStreamer.AddComment(Desc);
Chris Lattner9efd1182010-04-04 19:09:29 +000044
Benjamin Kramerc74798d2011-11-05 11:52:44 +000045 OutStreamer.EmitSLEB128IntValue(Value);
Chris Lattner9efd1182010-04-04 19:09:29 +000046}
47
48/// EmitULEB128 - emit the specified signed leb128 value.
David Blaikie5acff7e2013-06-23 18:31:11 +000049void AsmPrinter::EmitULEB128(uint64_t Value, const char *Desc,
Chris Lattner9efd1182010-04-04 19:09:29 +000050 unsigned PadTo) const {
51 if (isVerbose() && Desc)
52 OutStreamer.AddComment(Desc);
Rafael Espindola38d07562010-11-04 18:17:08 +000053
Eric Christopherbf7bc492013-01-09 03:52:05 +000054 OutStreamer.EmitULEB128IntValue(Value, PadTo);
Chris Lattner9efd1182010-04-04 19:09:29 +000055}
56
Chris Lattnerbaf2be02010-04-04 20:01:25 +000057/// EmitCFAByte - Emit a .byte 42 directive for a DW_CFA_xxx value.
58void AsmPrinter::EmitCFAByte(unsigned Val) const {
59 if (isVerbose()) {
Eric Christopher596077b2013-12-04 22:26:43 +000060 if (Val >= dwarf::DW_CFA_offset && Val < dwarf::DW_CFA_offset + 64)
Eric Christopher1d6bd412012-11-20 20:34:47 +000061 OutStreamer.AddComment("DW_CFA_offset + Reg (" +
Eric Christopher596077b2013-12-04 22:26:43 +000062 Twine(Val - dwarf::DW_CFA_offset) + ")");
Chris Lattnerbaf2be02010-04-04 20:01:25 +000063 else
64 OutStreamer.AddComment(dwarf::CallFrameString(Val));
65 }
Eric Christopherce0cfce2013-01-09 01:35:34 +000066 OutStreamer.EmitIntValue(Val, 1);
Chris Lattnerbaf2be02010-04-04 20:01:25 +000067}
68
Chris Lattnerb75af3c2010-04-04 20:04:21 +000069static const char *DecodeDWARFEncoding(unsigned Encoding) {
70 switch (Encoding) {
Eric Christopher596077b2013-12-04 22:26:43 +000071 case dwarf::DW_EH_PE_absptr:
72 return "absptr";
73 case dwarf::DW_EH_PE_omit:
74 return "omit";
75 case dwarf::DW_EH_PE_pcrel:
76 return "pcrel";
77 case dwarf::DW_EH_PE_udata4:
78 return "udata4";
79 case dwarf::DW_EH_PE_udata8:
80 return "udata8";
81 case dwarf::DW_EH_PE_sdata4:
82 return "sdata4";
83 case dwarf::DW_EH_PE_sdata8:
84 return "sdata8";
85 case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata4:
86 return "pcrel udata4";
87 case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4:
88 return "pcrel sdata4";
89 case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8:
90 return "pcrel udata8";
91 case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata8:
92 return "pcrel sdata8";
93 case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata4
94 :
Chris Lattnerb75af3c2010-04-04 20:04:21 +000095 return "indirect pcrel udata4";
Eric Christopher596077b2013-12-04 22:26:43 +000096 case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
97 :
Chris Lattnerb75af3c2010-04-04 20:04:21 +000098 return "indirect pcrel sdata4";
Eric Christopher596077b2013-12-04 22:26:43 +000099 case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8
100 :
Chris Lattnerb75af3c2010-04-04 20:04:21 +0000101 return "indirect pcrel udata8";
Eric Christopher596077b2013-12-04 22:26:43 +0000102 case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata8
103 :
Chris Lattnerb75af3c2010-04-04 20:04:21 +0000104 return "indirect pcrel sdata8";
105 }
Eric Christopher1d6bd412012-11-20 20:34:47 +0000106
Chris Lattnerb75af3c2010-04-04 20:04:21 +0000107 return "<unknown encoding>";
108}
109
Chris Lattnerb75af3c2010-04-04 20:04:21 +0000110/// EmitEncodingByte - Emit a .byte 42 directive that corresponds to an
111/// encoding. If verbose assembly output is enabled, we output comments
112/// describing the encoding. Desc is an optional string saying what the
113/// encoding is specifying (e.g. "LSDA").
Chris Lattneraabc6042010-04-04 23:41:46 +0000114void AsmPrinter::EmitEncodingByte(unsigned Val, const char *Desc) const {
Chris Lattnerb75af3c2010-04-04 20:04:21 +0000115 if (isVerbose()) {
Eric Christophercb7119e2013-12-04 22:29:02 +0000116 if (Desc)
Eric Christopher596077b2013-12-04 22:26:43 +0000117 OutStreamer.AddComment(Twine(Desc) + " Encoding = " +
Chris Lattnerb75af3c2010-04-04 20:04:21 +0000118 Twine(DecodeDWARFEncoding(Val)));
119 else
Eric Christopher596077b2013-12-04 22:26:43 +0000120 OutStreamer.AddComment(Twine("Encoding = ") + DecodeDWARFEncoding(Val));
Chris Lattnerb75af3c2010-04-04 20:04:21 +0000121 }
Eric Christopher1d6bd412012-11-20 20:34:47 +0000122
Eric Christopherce0cfce2013-01-09 01:35:34 +0000123 OutStreamer.EmitIntValue(Val, 1);
Chris Lattnerb75af3c2010-04-04 20:04:21 +0000124}
125
Chris Lattnere619c0d2010-04-04 20:20:50 +0000126/// GetSizeOfEncodedValue - Return the size of the encoding in bytes.
127unsigned AsmPrinter::GetSizeOfEncodedValue(unsigned Encoding) const {
128 if (Encoding == dwarf::DW_EH_PE_omit)
129 return 0;
Eric Christopher1d6bd412012-11-20 20:34:47 +0000130
Chris Lattnere619c0d2010-04-04 20:20:50 +0000131 switch (Encoding & 0x07) {
Eric Christopher596077b2013-12-04 22:26:43 +0000132 default:
133 llvm_unreachable("Invalid encoded value.");
134 case dwarf::DW_EH_PE_absptr:
Eric Christopher8b770652015-01-26 19:03:15 +0000135 return TM.getDataLayout()->getPointerSize();
Eric Christopher596077b2013-12-04 22:26:43 +0000136 case dwarf::DW_EH_PE_udata2:
137 return 2;
138 case dwarf::DW_EH_PE_udata4:
139 return 4;
140 case dwarf::DW_EH_PE_udata8:
141 return 8;
Chris Lattnere619c0d2010-04-04 20:20:50 +0000142 }
143}
144
Eric Christopher1d6bd412012-11-20 20:34:47 +0000145void AsmPrinter::EmitTTypeReference(const GlobalValue *GV,
146 unsigned Encoding) const {
Anton Korobeynikov097b0e92012-11-19 21:17:20 +0000147 if (GV) {
148 const TargetLoweringObjectFile &TLOF = getObjFileLowering();
Eric Christopher1d6bd412012-11-20 20:34:47 +0000149
Anton Korobeynikov097b0e92012-11-19 21:17:20 +0000150 const MCExpr *Exp =
Rafael Espindoladaeafb42014-02-19 17:23:20 +0000151 TLOF.getTTypeGlobalReference(GV, Encoding, *Mang, TM, MMI, OutStreamer);
Eric Christopherce0cfce2013-01-09 01:35:34 +0000152 OutStreamer.EmitValue(Exp, GetSizeOfEncodedValue(Encoding));
Anton Korobeynikov097b0e92012-11-19 21:17:20 +0000153 } else
Eric Christopherce0cfce2013-01-09 01:35:34 +0000154 OutStreamer.EmitIntValue(0, GetSizeOfEncodedValue(Encoding));
Chris Lattnere619c0d2010-04-04 20:20:50 +0000155}
Chris Lattner70a4fce2010-04-04 23:25:33 +0000156
157/// EmitSectionOffset - Emit the 4-byte offset of Label from the start of its
158/// section. This can be done with a special directive if the target supports
159/// it (e.g. cygwin) or by emitting it as an offset from a label at the start
160/// of the section.
161///
162/// SectionLabel is a temporary label emitted at the start of the section that
163/// Label lives in.
164void AsmPrinter::EmitSectionOffset(const MCSymbol *Label,
165 const MCSymbol *SectionLabel) const {
166 // On COFF targets, we have to emit the special .secrel32 directive.
Matt Arsenault034ca0f2013-04-22 22:49:11 +0000167 if (MAI->needsDwarfSectionOffsetDirective()) {
Rafael Espindolad3df3d32011-12-17 01:14:52 +0000168 OutStreamer.EmitCOFFSecRel32(Label);
Chris Lattner70a4fce2010-04-04 23:25:33 +0000169 return;
170 }
Eric Christopher1d6bd412012-11-20 20:34:47 +0000171
Chris Lattner70a4fce2010-04-04 23:25:33 +0000172 // Get the section that we're referring to, based on SectionLabel.
173 const MCSection &Section = SectionLabel->getSection();
Eric Christopher1d6bd412012-11-20 20:34:47 +0000174
Chris Lattner70a4fce2010-04-04 23:25:33 +0000175 // If Label has already been emitted, verify that it is in the same section as
176 // section label for sanity.
177 assert((!Label->isInSection() || &Label->getSection() == &Section) &&
178 "Section offset using wrong section base for label");
Eric Christopher1d6bd412012-11-20 20:34:47 +0000179
Duncan Sandsb847bf52011-03-12 13:07:37 +0000180 // If the section in question will end up with an address of 0 anyway, we can
181 // just emit an absolute reference to save a relocation.
182 if (Section.isBaseAddressKnownZero()) {
Eric Christopherce0cfce2013-01-09 01:35:34 +0000183 OutStreamer.EmitSymbolValue(Label, 4);
Duncan Sandsb847bf52011-03-12 13:07:37 +0000184 return;
185 }
Eric Christopher1d6bd412012-11-20 20:34:47 +0000186
Chris Lattner70a4fce2010-04-04 23:25:33 +0000187 // Otherwise, emit it as a label difference from the start of the section.
188 EmitLabelDifference(Label, SectionLabel, 4);
189}
190
Eric Christopher698a8ab2014-03-07 01:44:14 +0000191/// EmitDwarfRegOp - Emit dwarf register operation.
Eric Christopher29e874d2014-03-07 22:40:37 +0000192void AsmPrinter::EmitDwarfRegOp(ByteStreamer &Streamer,
Adrian Prantl5883af32015-01-19 17:57:29 +0000193 const MachineLocation &MLoc) const {
Adrian Prantl92da14b2015-03-02 22:02:33 +0000194 DebugLocDwarfExpression Expr(*TM.getSubtargetImpl()->getRegisterInfo(),
195 getDwarfDebug()->getDwarfVersion(), Streamer);
Eric Christopher73302642015-02-19 23:29:42 +0000196 const MCRegisterInfo *MRI = MMI->getContext().getRegisterInfo();
197 int Reg = MRI->getDwarfRegNum(MLoc.getReg(), false);
Eric Christopher698a8ab2014-03-07 01:44:14 +0000198 if (Reg < 0) {
199 // We assume that pointers are always in an addressable register.
Adrian Prantl5883af32015-01-19 17:57:29 +0000200 if (MLoc.isIndirect())
Eric Christopher698a8ab2014-03-07 01:44:14 +0000201 // FIXME: We have no reasonable way of handling errors in here. The
202 // caller might be in the middle of a dwarf expression. We should
203 // probably assert that Reg >= 0 once debug info generation is more
204 // mature.
Adrian Prantl337e3602015-01-12 23:03:23 +0000205 return Expr.EmitOp(dwarf::DW_OP_nop,
206 "nop (could not find a dwarf register number)");
Eric Christopher698a8ab2014-03-07 01:44:14 +0000207
208 // Attempt to find a valid super- or sub-register.
Adrian Prantlad768c32015-01-14 01:01:28 +0000209 if (!Expr.AddMachineRegPiece(MLoc.getReg()))
210 Expr.EmitOp(dwarf::DW_OP_nop,
211 "nop (could not find a dwarf register number)");
212 return;
Eric Christopher698a8ab2014-03-07 01:44:14 +0000213 }
214
215 if (MLoc.isIndirect())
Adrian Prantl5883af32015-01-19 17:57:29 +0000216 Expr.AddRegIndirect(Reg, MLoc.getOffset());
Eric Christopher698a8ab2014-03-07 01:44:14 +0000217 else
Adrian Prantlb16d9eb2015-01-12 22:19:22 +0000218 Expr.AddReg(Reg);
Eric Christopher698a8ab2014-03-07 01:44:14 +0000219}
220
Chris Lattneraabc6042010-04-04 23:41:46 +0000221//===----------------------------------------------------------------------===//
222// Dwarf Lowering Routines
223//===----------------------------------------------------------------------===//
Chris Lattner70a4fce2010-04-04 23:25:33 +0000224
Rafael Espindola227144c2013-05-13 01:16:13 +0000225void AsmPrinter::emitCFIInstruction(const MCCFIInstruction &Inst) const {
226 switch (Inst.getOperation()) {
227 default:
228 llvm_unreachable("Unexpected instruction");
229 case MCCFIInstruction::OpDefCfaOffset:
230 OutStreamer.EmitCFIDefCfaOffset(Inst.getOffset());
231 break;
232 case MCCFIInstruction::OpDefCfa:
233 OutStreamer.EmitCFIDefCfa(Inst.getRegister(), Inst.getOffset());
234 break;
235 case MCCFIInstruction::OpDefCfaRegister:
236 OutStreamer.EmitCFIDefCfaRegister(Inst.getRegister());
237 break;
238 case MCCFIInstruction::OpOffset:
239 OutStreamer.EmitCFIOffset(Inst.getRegister(), Inst.getOffset());
240 break;
Venkatraman Govindaraju4c0cdd72013-09-26 15:11:00 +0000241 case MCCFIInstruction::OpRegister:
242 OutStreamer.EmitCFIRegister(Inst.getRegister(), Inst.getRegister2());
243 break;
Venkatraman Govindaraju3816d432013-09-26 14:49:40 +0000244 case MCCFIInstruction::OpWindowSave:
245 OutStreamer.EmitCFIWindowSave();
246 break;
Oliver Stannardb14c6252014-04-02 16:10:33 +0000247 case MCCFIInstruction::OpSameValue:
248 OutStreamer.EmitCFISameValue(Inst.getRegister());
249 break;
Rafael Espindolabeb74c32011-04-15 20:32:03 +0000250 }
251}