blob: 60d7cd3945a76f152916c3fe93a184ea1c6aafe8 [file] [log] [blame]
Devang Patel161b2f42011-04-12 23:21:44 +00001//===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===//
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//
Eric Christopher443c9ed2012-08-14 05:13:29 +000010// This file contains support for constructing a dwarf compile unit.
Devang Patel161b2f42011-04-12 23:21:44 +000011//
12//===----------------------------------------------------------------------===//
13
14#define DEBUG_TYPE "dwarfdebug"
15
16#include "DwarfCompileUnit.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000017#include "DwarfAccelTable.h"
Devang Patel161b2f42011-04-12 23:21:44 +000018#include "DwarfDebug.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000019#include "llvm/ADT/APFloat.h"
Bill Wendling16eeb6f2012-06-29 08:32:07 +000020#include "llvm/DIBuilder.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000021#include "llvm/IR/Constants.h"
22#include "llvm/IR/DataLayout.h"
23#include "llvm/IR/GlobalVariable.h"
24#include "llvm/IR/Instructions.h"
Eric Christopherd61c34b2011-11-11 03:16:32 +000025#include "llvm/Support/Debug.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000026#include "llvm/Support/ErrorHandling.h"
Devang Patel6f9d8ff2011-08-15 17:57:41 +000027#include "llvm/Target/Mangler.h"
Devang Patel161b2f42011-04-12 23:21:44 +000028#include "llvm/Target/TargetFrameLowering.h"
29#include "llvm/Target/TargetMachine.h"
30#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel161b2f42011-04-12 23:21:44 +000031
32using namespace llvm;
33
34/// CompileUnit - Compile unit constructor.
Eli Benderskyd4a05e02012-12-03 18:45:45 +000035CompileUnit::CompileUnit(unsigned UID, unsigned L, DIE *D, AsmPrinter *A,
Eric Christopher2e5d8702012-12-20 21:58:36 +000036 DwarfDebug *DW, DwarfUnits *DWU)
37 : UniqueID(UID), Language(L), CUDie(D), Asm(A), DD(DW), DU(DWU),
38 IndexTyDie(0) {
Devang Patel161b2f42011-04-12 23:21:44 +000039 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
40}
41
42/// ~CompileUnit - Destructor for compile unit.
43CompileUnit::~CompileUnit() {
44 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
45 DIEBlocks[j]->~DIEBlock();
46}
47
48/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
49/// information entry.
50DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
51 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
52 return Value;
53}
54
Bill Wendling6afe4782012-12-06 07:55:19 +000055/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling222c2fd2012-12-06 07:38:10 +000056/// DWARF version doesn't handle the language, return -1.
Bill Wendling6afe4782012-12-06 07:55:19 +000057int64_t CompileUnit::getDefaultLowerBound() const {
Bill Wendling222c2fd2012-12-06 07:38:10 +000058 switch (Language) {
59 default:
60 break;
61
62 case dwarf::DW_LANG_C89:
63 case dwarf::DW_LANG_C99:
64 case dwarf::DW_LANG_C:
65 case dwarf::DW_LANG_C_plus_plus:
66 case dwarf::DW_LANG_ObjC:
67 case dwarf::DW_LANG_ObjC_plus_plus:
68 return 0;
69
70 case dwarf::DW_LANG_Fortran77:
71 case dwarf::DW_LANG_Fortran90:
72 case dwarf::DW_LANG_Fortran95:
73 return 1;
74
75 // The languages below have valid values only if the DWARF version >= 4.
76 case dwarf::DW_LANG_Java:
77 case dwarf::DW_LANG_Python:
78 case dwarf::DW_LANG_UPC:
79 case dwarf::DW_LANG_D:
80 if (dwarf::DWARF_VERSION >= 4)
81 return 0;
82 break;
83
84 case dwarf::DW_LANG_Ada83:
85 case dwarf::DW_LANG_Ada95:
86 case dwarf::DW_LANG_Cobol74:
87 case dwarf::DW_LANG_Cobol85:
88 case dwarf::DW_LANG_Modula2:
89 case dwarf::DW_LANG_Pascal83:
90 case dwarf::DW_LANG_PLI:
91 if (dwarf::DWARF_VERSION >= 4)
92 return 1;
93 break;
94 }
95
96 return -1;
97}
98
Eric Christopher873cf0a2012-08-24 01:14:27 +000099/// addFlag - Add a flag that is true.
100void CompileUnit::addFlag(DIE *Die, unsigned Attribute) {
101 if (!DD->useDarwinGDBCompat())
102 Die->addValue(Attribute, dwarf::DW_FORM_flag_present,
103 DIEIntegerOne);
104 else
105 addUInt(Die, Attribute, dwarf::DW_FORM_flag, 1);
106}
107
Devang Patel161b2f42011-04-12 23:21:44 +0000108/// addUInt - Add an unsigned integer attribute data and value.
109///
110void CompileUnit::addUInt(DIE *Die, unsigned Attribute,
111 unsigned Form, uint64_t Integer) {
112 if (!Form) Form = DIEInteger::BestForm(false, Integer);
113 DIEValue *Value = Integer == 1 ?
114 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
115 Die->addValue(Attribute, Form, Value);
116}
117
118/// addSInt - Add an signed integer attribute data and value.
119///
120void CompileUnit::addSInt(DIE *Die, unsigned Attribute,
121 unsigned Form, int64_t Integer) {
122 if (!Form) Form = DIEInteger::BestForm(true, Integer);
123 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
124 Die->addValue(Attribute, Form, Value);
125}
126
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000127/// addString - Add a string attribute data and value. We always emit a
128/// reference to the string pool instead of immediate strings so that DIEs have
129/// more predictable sizes.
Nick Lewycky390c40d2011-10-27 06:44:11 +0000130void CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) {
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000131 if (!DD->useSplitDwarf()) {
132 MCSymbol *Symb = DU->getStringPoolEntry(String);
133 DIEValue *Value;
134 if (Asm->needsRelocationsForDwarfStringPool())
135 Value = new (DIEValueAllocator) DIELabel(Symb);
136 else {
137 MCSymbol *StringPool = DU->getStringPoolSym();
138 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
139 }
140 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
141 } else {
142 unsigned idx = DU->getStringPoolIndex(String);
143 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
144 Die->addValue(Attribute, dwarf::DW_FORM_GNU_str_index, Value);
145 }
146}
147
148/// addLocalString - Add a string attribute data and value. This is guaranteed
149/// to be in the local string pool instead of indirected.
150void CompileUnit::addLocalString(DIE *Die, unsigned Attribute,
151 StringRef String) {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000152 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000153 DIEValue *Value;
154 if (Asm->needsRelocationsForDwarfStringPool())
155 Value = new (DIEValueAllocator) DIELabel(Symb);
156 else {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000157 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000158 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000159 }
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000160 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000161}
162
163/// addLabel - Add a Dwarf label attribute data and value.
164///
165void CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
166 const MCSymbol *Label) {
167 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
168 Die->addValue(Attribute, Form, Value);
169}
170
171/// addDelta - Add a label delta attribute data and value.
172///
173void CompileUnit::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
174 const MCSymbol *Hi, const MCSymbol *Lo) {
175 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
176 Die->addValue(Attribute, Form, Value);
177}
178
179/// addDIEEntry - Add a DIE attribute data and value.
180///
181void CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
182 DIE *Entry) {
183 Die->addValue(Attribute, Form, createDIEEntry(Entry));
184}
185
Devang Patel161b2f42011-04-12 23:21:44 +0000186/// addBlock - Add block data.
187///
188void CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
189 DIEBlock *Block) {
190 Block->ComputeSize(Asm);
191 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
192 Die->addValue(Attribute, Block->BestForm(), Block);
193}
194
195/// addSourceLine - Add location information to specified debug information
196/// entry.
197void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
198 // Verify variable.
199 if (!V.Verify())
200 return;
Eric Christopher8b4310b2012-11-21 00:34:38 +0000201
Devang Patel161b2f42011-04-12 23:21:44 +0000202 unsigned Line = V.getLineNumber();
203 if (Line == 0)
204 return;
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000205 unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(),
Devang Patel161b2f42011-04-12 23:21:44 +0000206 V.getContext().getDirectory());
207 assert(FileID && "Invalid file id");
208 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
209 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
210}
211
212/// addSourceLine - Add location information to specified debug information
213/// entry.
214void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
215 // Verify global variable.
216 if (!G.Verify())
217 return;
218
219 unsigned Line = G.getLineNumber();
220 if (Line == 0)
221 return;
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000222 unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory());
Devang Patel161b2f42011-04-12 23:21:44 +0000223 assert(FileID && "Invalid file id");
224 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
225 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
226}
227
228/// addSourceLine - Add location information to specified debug information
229/// entry.
230void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
231 // Verify subprogram.
232 if (!SP.Verify())
233 return;
Eric Christopher2125d5a2012-03-15 23:55:40 +0000234
Devang Patel161b2f42011-04-12 23:21:44 +0000235 // If the line number is 0, don't add it.
Eric Christopher2125d5a2012-03-15 23:55:40 +0000236 unsigned Line = SP.getLineNumber();
237 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000238 return;
239
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000240 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(),
Nick Lewycky746cb672011-10-26 22:55:33 +0000241 SP.getDirectory());
Devang Patel161b2f42011-04-12 23:21:44 +0000242 assert(FileID && "Invalid file id");
243 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
244 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
245}
246
247/// addSourceLine - Add location information to specified debug information
248/// entry.
249void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
250 // Verify type.
251 if (!Ty.Verify())
252 return;
253
254 unsigned Line = Ty.getLineNumber();
Eric Christopher2125d5a2012-03-15 23:55:40 +0000255 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000256 return;
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000257 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(),
Nick Lewycky746cb672011-10-26 22:55:33 +0000258 Ty.getDirectory());
Devang Patel161b2f42011-04-12 23:21:44 +0000259 assert(FileID && "Invalid file id");
260 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
261 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
262}
263
264/// addSourceLine - Add location information to specified debug information
265/// entry.
Eric Christopherb8ca9882012-03-29 08:42:56 +0000266void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
267 // Verify type.
268 if (!Ty.Verify())
269 return;
270
271 unsigned Line = Ty.getLineNumber();
272 if (Line == 0)
273 return;
274 DIFile File = Ty.getFile();
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000275 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Eric Christopher4d069bf2012-05-22 18:45:24 +0000276 File.getDirectory());
Eric Christopherb8ca9882012-03-29 08:42:56 +0000277 assert(FileID && "Invalid file id");
278 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
279 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
280}
281
282/// addSourceLine - Add location information to specified debug information
283/// entry.
Devang Patel161b2f42011-04-12 23:21:44 +0000284void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
285 // Verify namespace.
286 if (!NS.Verify())
287 return;
288
289 unsigned Line = NS.getLineNumber();
290 if (Line == 0)
291 return;
292 StringRef FN = NS.getFilename();
293
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000294 unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory());
Devang Patel161b2f42011-04-12 23:21:44 +0000295 assert(FileID && "Invalid file id");
296 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
297 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
298}
299
Eric Christopher8b4310b2012-11-21 00:34:38 +0000300/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patele1cdf842011-04-27 22:45:24 +0000301/// DbgVariable based on provided MachineLocation.
Eric Christopher8b4310b2012-11-21 00:34:38 +0000302void CompileUnit::addVariableAddress(DbgVariable *&DV, DIE *Die,
Devang Patele1cdf842011-04-27 22:45:24 +0000303 MachineLocation Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000304 if (DV->variableHasComplexAddress())
305 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
306 else if (DV->isBlockByrefVariable())
307 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
308 else
309 addAddress(Die, dwarf::DW_AT_location, Location);
310}
311
Devang Patel116da2f2011-04-26 19:06:18 +0000312/// addRegisterOp - Add register operand.
313void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
314 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
315 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
316 if (DWReg < 32)
317 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
318 else {
319 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
320 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
321 }
322}
323
324/// addRegisterOffset - Add register offset.
325void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
326 int64_t Offset) {
327 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
328 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
329 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
330 if (Reg == TRI->getFrameRegister(*Asm->MF))
331 // If variable offset is based in frame register then use fbreg.
332 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
333 else if (DWReg < 32)
334 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
335 else {
336 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
337 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
338 }
339 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
340}
341
342/// addAddress - Add an address attribute to a die based on the location
343/// provided.
344void CompileUnit::addAddress(DIE *Die, unsigned Attribute,
345 const MachineLocation &Location) {
346 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
347
348 if (Location.isReg())
349 addRegisterOp(Block, Location.getReg());
350 else
351 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
352
353 // Now attach the location information to the DIE.
354 addBlock(Die, Attribute, 0, Block);
355}
356
Devang Patel161b2f42011-04-12 23:21:44 +0000357/// addComplexAddress - Start with the address based on the location provided,
358/// and generate the DWARF information necessary to find the actual variable
359/// given the extra address information encoded in the DIVariable, starting from
360/// the starting location. Add the DWARF information to the die.
361///
362void CompileUnit::addComplexAddress(DbgVariable *&DV, DIE *Die,
363 unsigned Attribute,
364 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000365 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patelc26f5442011-04-28 02:22:40 +0000366 unsigned N = DV->getNumAddrElements();
367 unsigned i = 0;
368 if (Location.isReg()) {
369 if (N >= 2 && DV->getAddrElement(0) == DIBuilder::OpPlus) {
370 // If first address element is OpPlus then emit
371 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
372 addRegisterOffset(Block, Location.getReg(), DV->getAddrElement(1));
373 i = 2;
374 } else
375 addRegisterOp(Block, Location.getReg());
376 }
Devang Patel116da2f2011-04-26 19:06:18 +0000377 else
378 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000379
Devang Patelc26f5442011-04-28 02:22:40 +0000380 for (;i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +0000381 uint64_t Element = DV->getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000382 if (Element == DIBuilder::OpPlus) {
383 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
384 addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
385 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher50120762012-05-08 18:56:00 +0000386 if (!Location.isReg())
387 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000388 } else llvm_unreachable("unknown DIBuilder Opcode");
389 }
390
391 // Now attach the location information to the DIE.
392 addBlock(Die, Attribute, 0, Block);
393}
394
395/* Byref variables, in Blocks, are declared by the programmer as "SomeType
396 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
397 gives the variable VarName either the struct, or a pointer to the struct, as
398 its type. This is necessary for various behind-the-scenes things the
399 compiler needs to do with by-reference variables in Blocks.
400
401 However, as far as the original *programmer* is concerned, the variable
402 should still have type 'SomeType', as originally declared.
403
404 The function getBlockByrefType dives into the __Block_byref_x_VarName
405 struct to find the original type of the variable, which is then assigned to
406 the variable's Debug Information Entry as its real type. So far, so good.
407 However now the debugger will expect the variable VarName to have the type
408 SomeType. So we need the location attribute for the variable to be an
409 expression that explains to the debugger how to navigate through the
410 pointers and struct to find the actual variable of type SomeType.
411
412 The following function does just that. We start by getting
413 the "normal" location for the variable. This will be the location
414 of either the struct __Block_byref_x_VarName or the pointer to the
415 struct __Block_byref_x_VarName.
416
417 The struct will look something like:
418
419 struct __Block_byref_x_VarName {
420 ... <various fields>
421 struct __Block_byref_x_VarName *forwarding;
422 ... <various other fields>
423 SomeType VarName;
424 ... <maybe more fields>
425 };
426
427 If we are given the struct directly (as our starting point) we
428 need to tell the debugger to:
429
430 1). Add the offset of the forwarding field.
431
432 2). Follow that pointer to get the real __Block_byref_x_VarName
433 struct to use (the real one may have been copied onto the heap).
434
435 3). Add the offset for the field VarName, to find the actual variable.
436
437 If we started with a pointer to the struct, then we need to
438 dereference that pointer first, before the other steps.
439 Translating this into DWARF ops, we will need to append the following
440 to the current location description for the variable:
441
442 DW_OP_deref -- optional, if we start with a pointer
443 DW_OP_plus_uconst <forward_fld_offset>
444 DW_OP_deref
445 DW_OP_plus_uconst <varName_fld_offset>
446
447 That is what this function does. */
448
449/// addBlockByrefAddress - Start with the address based on the location
450/// provided, and generate the DWARF information necessary to find the
451/// actual Block variable (navigating the Block struct) based on the
452/// starting location. Add the DWARF information to the die. For
453/// more information, read large comment just above here.
454///
455void CompileUnit::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
456 unsigned Attribute,
457 const MachineLocation &Location) {
458 DIType Ty = DV->getType();
459 DIType TmpTy = Ty;
460 unsigned Tag = Ty.getTag();
461 bool isPointer = false;
462
463 StringRef varName = DV->getName();
464
465 if (Tag == dwarf::DW_TAG_pointer_type) {
466 DIDerivedType DTy = DIDerivedType(Ty);
467 TmpTy = DTy.getTypeDerivedFrom();
468 isPointer = true;
469 }
470
471 DICompositeType blockStruct = DICompositeType(TmpTy);
472
473 // Find the __forwarding field and the variable field in the __Block_byref
474 // struct.
475 DIArray Fields = blockStruct.getTypeArray();
476 DIDescriptor varField = DIDescriptor();
477 DIDescriptor forwardingField = DIDescriptor();
478
479 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
480 DIDescriptor Element = Fields.getElement(i);
481 DIDerivedType DT = DIDerivedType(Element);
482 StringRef fieldName = DT.getName();
483 if (fieldName == "__forwarding")
484 forwardingField = Element;
485 else if (fieldName == varName)
486 varField = Element;
487 }
488
489 // Get the offsets for the forwarding field and the variable field.
490 unsigned forwardingFieldOffset =
491 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
492 unsigned varFieldOffset =
493 DIDerivedType(varField).getOffsetInBits() >> 3;
494
495 // Decode the original location, and use that as the start of the byref
496 // variable's location.
Devang Patel161b2f42011-04-12 23:21:44 +0000497 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
498
Eric Christophercaba2632012-07-04 02:02:18 +0000499 if (Location.isReg())
500 addRegisterOp(Block, Location.getReg());
501 else
502 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000503
504 // If we started with a pointer to the __Block_byref... struct, then
505 // the first thing we need to do is dereference the pointer (DW_OP_deref).
506 if (isPointer)
507 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
508
509 // Next add the offset for the '__forwarding' field:
510 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
511 // adding the offset if it's 0.
512 if (forwardingFieldOffset > 0) {
513 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
514 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
515 }
516
517 // Now dereference the __forwarding field to get to the real __Block_byref
518 // struct: DW_OP_deref.
519 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
520
521 // Now that we've got the real __Block_byref... struct, add the offset
522 // for the variable's field to get to the location of the actual variable:
523 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
524 if (varFieldOffset > 0) {
525 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
526 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
527 }
528
529 // Now attach the location information to the DIE.
530 addBlock(Die, Attribute, 0, Block);
531}
532
Devang Patel4ec14b02011-07-20 21:57:04 +0000533/// isTypeSigned - Return true if the type is signed.
534static bool isTypeSigned(DIType Ty, int *SizeInBits) {
535 if (Ty.isDerivedType())
536 return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
537 if (Ty.isBasicType())
538 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
539 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
540 *SizeInBits = Ty.getSizeInBits();
541 return true;
542 }
543 return false;
544}
545
Devang Patel161b2f42011-04-12 23:21:44 +0000546/// addConstantValue - Add constant value entry in variable DIE.
Devang Patelb58128e2011-05-27 16:45:18 +0000547bool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
548 DIType Ty) {
Nick Lewycky746cb672011-10-26 22:55:33 +0000549 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000550 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patel4ec14b02011-07-20 21:57:04 +0000551 int SizeInBits = -1;
552 bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
553 unsigned Form = SignedConstant ? dwarf::DW_FORM_sdata : dwarf::DW_FORM_udata;
554 switch (SizeInBits) {
555 case 8: Form = dwarf::DW_FORM_data1; break;
556 case 16: Form = dwarf::DW_FORM_data2; break;
557 case 32: Form = dwarf::DW_FORM_data4; break;
558 case 64: Form = dwarf::DW_FORM_data8; break;
Devang Patel045c1d42011-05-27 19:13:26 +0000559 default: break;
560 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000561 SignedConstant ? addSInt(Block, 0, Form, MO.getImm())
Devang Patel4ec14b02011-07-20 21:57:04 +0000562 : addUInt(Block, 0, Form, MO.getImm());
Devang Patel72f0d9c2011-05-27 18:15:52 +0000563
Devang Patel161b2f42011-04-12 23:21:44 +0000564 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
565 return true;
566}
567
568/// addConstantFPValue - Add constant value entry in variable DIE.
569bool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Nick Lewycky390c40d2011-10-27 06:44:11 +0000570 assert (MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000571 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
572 APFloat FPImm = MO.getFPImm()->getValueAPF();
573
574 // Get the raw data form of the floating point.
575 const APInt FltVal = FPImm.bitcastToAPInt();
576 const char *FltPtr = (const char*)FltVal.getRawData();
577
578 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000579 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000580 int Incr = (LittleEndian ? 1 : -1);
581 int Start = (LittleEndian ? 0 : NumBytes - 1);
582 int Stop = (LittleEndian ? NumBytes : -1);
583
584 // Output the constant to DWARF one byte at a time.
585 for (; Start != Stop; Start += Incr)
586 addUInt(Block, 0, dwarf::DW_FORM_data1,
587 (unsigned char)0xFF & FltPtr[Start]);
588
589 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
590 return true;
591}
592
593/// addConstantValue - Add constant value entry in variable DIE.
Devang Patel8594d422011-06-24 20:46:11 +0000594bool CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000595 bool Unsigned) {
Devang Pateld6a81362011-05-28 00:39:18 +0000596 unsigned CIBitWidth = CI->getBitWidth();
597 if (CIBitWidth <= 64) {
598 unsigned form = 0;
599 switch (CIBitWidth) {
600 case 8: form = dwarf::DW_FORM_data1; break;
601 case 16: form = dwarf::DW_FORM_data2; break;
602 case 32: form = dwarf::DW_FORM_data4; break;
603 case 64: form = dwarf::DW_FORM_data8; break;
Eric Christopher8b4310b2012-11-21 00:34:38 +0000604 default:
Devang Pateld6a81362011-05-28 00:39:18 +0000605 form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata;
606 }
Devang Patel161b2f42011-04-12 23:21:44 +0000607 if (Unsigned)
Devang Pateld6a81362011-05-28 00:39:18 +0000608 addUInt(Die, dwarf::DW_AT_const_value, form, CI->getZExtValue());
Devang Patel161b2f42011-04-12 23:21:44 +0000609 else
Devang Pateld6a81362011-05-28 00:39:18 +0000610 addSInt(Die, dwarf::DW_AT_const_value, form, CI->getSExtValue());
Devang Patel161b2f42011-04-12 23:21:44 +0000611 return true;
612 }
613
614 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
615
616 // Get the raw data form of the large APInt.
617 const APInt Val = CI->getValue();
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000618 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000619
620 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000621 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000622
623 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000624 for (int i = 0; i < NumBytes; i++) {
625 uint8_t c;
626 if (LittleEndian)
627 c = Ptr64[i / 8] >> (8 * (i & 7));
628 else
629 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
630 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
631 }
Devang Patel161b2f42011-04-12 23:21:44 +0000632
633 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
634 return true;
635}
636
637/// addTemplateParams - Add template parameters in buffer.
638void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
639 // Add template parameters.
640 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
641 DIDescriptor Element = TParams.getElement(i);
642 if (Element.isTemplateTypeParameter())
643 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
644 DITemplateTypeParameter(Element)));
645 else if (Element.isTemplateValueParameter())
646 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
647 DITemplateValueParameter(Element)));
648 }
Devang Patel161b2f42011-04-12 23:21:44 +0000649}
Nick Lewycky746cb672011-10-26 22:55:33 +0000650
Devang Patel161b2f42011-04-12 23:21:44 +0000651/// addToContextOwner - Add Die into the list of its context owner's children.
652void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
653 if (Context.isType()) {
654 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
655 ContextDIE->addChild(Die);
656 } else if (Context.isNameSpace()) {
657 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
658 ContextDIE->addChild(Die);
659 } else if (Context.isSubprogram()) {
Devang Pateldbc64af2011-08-15 17:24:54 +0000660 DIE *ContextDIE = getOrCreateSubprogramDIE(DISubprogram(Context));
Devang Patel161b2f42011-04-12 23:21:44 +0000661 ContextDIE->addChild(Die);
662 } else if (DIE *ContextDIE = getDIE(Context))
663 ContextDIE->addChild(Die);
664 else
665 addDie(Die);
666}
667
668/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
669/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000670DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
671 DIType Ty(TyNode);
672 if (!Ty.Verify())
673 return NULL;
Devang Patel161b2f42011-04-12 23:21:44 +0000674 DIE *TyDIE = getDIE(Ty);
675 if (TyDIE)
676 return TyDIE;
677
678 // Create new type.
679 TyDIE = new DIE(dwarf::DW_TAG_base_type);
680 insertDIE(Ty, TyDIE);
681 if (Ty.isBasicType())
682 constructTypeDIE(*TyDIE, DIBasicType(Ty));
683 else if (Ty.isCompositeType())
684 constructTypeDIE(*TyDIE, DICompositeType(Ty));
685 else {
686 assert(Ty.isDerivedType() && "Unknown kind of DIType");
687 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
688 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000689 // If this is a named finished type then include it in the list of types
690 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000691 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
692 bool IsImplementation = 0;
693 if (Ty.isCompositeType()) {
694 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000695 // A runtime language of 0 actually means C/C++ and that any
696 // non-negative value is some version of Objective-C/C++.
Eric Christopherc36145f2012-01-06 04:35:23 +0000697 IsImplementation = (CT.getRunTimeLang() == 0) ||
Eric Christophere2dc9332012-02-22 08:46:02 +0000698 CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000699 }
Eric Christophere0167892012-01-06 23:03:37 +0000700 unsigned Flags = IsImplementation ?
701 DwarfAccelTable::eTypeFlagClassIsImplementation : 0;
702 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000703 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000704
Devang Patel161b2f42011-04-12 23:21:44 +0000705 addToContextOwner(TyDIE, Ty.getContext());
706 return TyDIE;
707}
708
709/// addType - Add a new type attribute to the specified entity.
Eric Christopher4d069bf2012-05-22 18:45:24 +0000710void CompileUnit::addType(DIE *Entity, DIType Ty, unsigned Attribute) {
Devang Patel161b2f42011-04-12 23:21:44 +0000711 if (!Ty.Verify())
712 return;
713
714 // Check for pre-existence.
715 DIEEntry *Entry = getDIEEntry(Ty);
716 // If it exists then use the existing value.
717 if (Entry) {
Eric Christopher663e0cf2012-03-28 07:34:31 +0000718 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000719 return;
720 }
721
722 // Construct type.
723 DIE *Buffer = getOrCreateTypeDIE(Ty);
724
725 // Set up proxy.
726 Entry = createDIEEntry(Buffer);
727 insertDIEEntry(Ty, Entry);
Eric Christopher663e0cf2012-03-28 07:34:31 +0000728 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000729
730 // If this is a complete composite type then include it in the
731 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000732 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000733}
734
735/// addGlobalType - Add a new global type to the compile unit.
736///
Devang Patelc20bdf12011-06-01 00:23:24 +0000737void CompileUnit::addGlobalType(DIType Ty) {
Devang Patele9ae06c2011-05-31 22:56:51 +0000738 DIDescriptor Context = Ty.getContext();
Eric Christopher8b4310b2012-11-21 00:34:38 +0000739 if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
740 && (!Context || Context.isCompileUnit() || Context.isFile()
Devang Patel94c7ddb2011-08-16 22:09:43 +0000741 || Context.isNameSpace()))
Devang Patelc20bdf12011-06-01 00:23:24 +0000742 if (DIEEntry *Entry = getDIEEntry(Ty))
743 GlobalTypes[Ty.getName()] = Entry->getEntry();
Devang Patel161b2f42011-04-12 23:21:44 +0000744}
745
Devang Patel31c5d052011-05-06 16:57:54 +0000746/// addPubTypes - Add type for pubtypes section.
747void CompileUnit::addPubTypes(DISubprogram SP) {
748 DICompositeType SPTy = SP.getType();
749 unsigned SPTag = SPTy.getTag();
750 if (SPTag != dwarf::DW_TAG_subroutine_type)
751 return;
752
753 DIArray Args = SPTy.getTypeArray();
754 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
755 DIType ATy(Args.getElement(i));
756 if (!ATy.Verify())
757 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +0000758 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +0000759 }
760}
761
Devang Patel161b2f42011-04-12 23:21:44 +0000762/// constructTypeDIE - Construct basic type die from DIBasicType.
763void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
764 // Get core information.
765 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000766 // Add name if not anonymous or intermediate type.
767 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000768 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +0000769
770 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
771 Buffer.setTag(dwarf::DW_TAG_unspecified_type);
772 // Unspecified types has only name, nothing else.
773 return;
774 }
775
776 Buffer.setTag(dwarf::DW_TAG_base_type);
Nick Lewycky746cb672011-10-26 22:55:33 +0000777 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +0000778 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +0000779
Devang Patel161b2f42011-04-12 23:21:44 +0000780 uint64_t Size = BTy.getSizeInBits() >> 3;
781 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
782}
783
784/// constructTypeDIE - Construct derived type die from DIDerivedType.
785void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
786 // Get core information.
787 StringRef Name = DTy.getName();
788 uint64_t Size = DTy.getSizeInBits() >> 3;
789 unsigned Tag = DTy.getTag();
790
791 // FIXME - Workaround for templates.
792 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
793
794 Buffer.setTag(Tag);
795
796 // Map to main type, void will not have a type.
797 DIType FromTy = DTy.getTypeDerivedFrom();
798 addType(&Buffer, FromTy);
799
800 // Add name if not anonymous or intermediate type.
801 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000802 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +0000803
804 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +0000805 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel161b2f42011-04-12 23:21:44 +0000806 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
807
David Blaikie62fdfb52013-01-07 05:51:15 +0000808 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
809 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
810 getOrCreateTypeDIE(DTy.getClassType()));
Devang Patel161b2f42011-04-12 23:21:44 +0000811 // Add source line info if available and TyDesc is not a forward declaration.
812 if (!DTy.isForwardDecl())
813 addSourceLine(&Buffer, DTy);
814}
815
816/// constructTypeDIE - Construct type DIE from DICompositeType.
817void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
818 // Get core information.
819 StringRef Name = CTy.getName();
820
821 uint64_t Size = CTy.getSizeInBits() >> 3;
822 unsigned Tag = CTy.getTag();
823 Buffer.setTag(Tag);
824
825 switch (Tag) {
826 case dwarf::DW_TAG_vector_type:
827 case dwarf::DW_TAG_array_type:
828 constructArrayTypeDIE(Buffer, &CTy);
829 break;
830 case dwarf::DW_TAG_enumeration_type: {
831 DIArray Elements = CTy.getTypeArray();
832
833 // Add enumerators to enumeration type.
834 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
835 DIE *ElemDie = NULL;
836 DIDescriptor Enum(Elements.getElement(i));
837 if (Enum.isEnumerator()) {
838 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
839 Buffer.addChild(ElemDie);
840 }
841 }
Eric Christopherbb0f6ea2012-05-23 00:09:20 +0000842 DIType DTy = CTy.getTypeDerivedFrom();
843 if (DTy.Verify()) {
844 addType(&Buffer, DTy);
845 addUInt(&Buffer, dwarf::DW_AT_enum_class, dwarf::DW_FORM_flag, 1);
846 }
Devang Patel161b2f42011-04-12 23:21:44 +0000847 }
848 break;
849 case dwarf::DW_TAG_subroutine_type: {
850 // Add return type.
851 DIArray Elements = CTy.getTypeArray();
852 DIDescriptor RTy = Elements.getElement(0);
853 addType(&Buffer, DIType(RTy));
854
855 bool isPrototyped = true;
856 // Add arguments.
857 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
858 DIDescriptor Ty = Elements.getElement(i);
859 if (Ty.isUnspecifiedParameter()) {
860 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
861 Buffer.addChild(Arg);
862 isPrototyped = false;
863 } else {
864 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
865 addType(Arg, DIType(Ty));
866 Buffer.addChild(Arg);
867 }
868 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +0000869 // Add prototype flag if we're dealing with a C language and the
870 // function has been prototyped.
871 if (isPrototyped &&
Eric Christopher4d069bf2012-05-22 18:45:24 +0000872 (Language == dwarf::DW_LANG_C89 ||
873 Language == dwarf::DW_LANG_C99 ||
874 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +0000875 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Devang Patel161b2f42011-04-12 23:21:44 +0000876 }
877 break;
878 case dwarf::DW_TAG_structure_type:
879 case dwarf::DW_TAG_union_type:
880 case dwarf::DW_TAG_class_type: {
881 // Add elements to structure type.
882 DIArray Elements = CTy.getTypeArray();
883
884 // A forward struct declared type may not have elements available.
885 unsigned N = Elements.getNumElements();
886 if (N == 0)
887 break;
888
889 // Add elements to structure type.
890 for (unsigned i = 0; i < N; ++i) {
891 DIDescriptor Element = Elements.getElement(i);
892 DIE *ElemDie = NULL;
893 if (Element.isSubprogram()) {
894 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +0000895 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +0000896 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +0000897 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000898 dwarf::DW_ACCESS_protected);
899 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +0000900 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000901 dwarf::DW_ACCESS_private);
Eric Christopher8b4310b2012-11-21 00:34:38 +0000902 else
Nick Lewycky13aaca52011-12-13 05:09:11 +0000903 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000904 dwarf::DW_ACCESS_public);
905 if (SP.isExplicit())
Eric Christopher873cf0a2012-08-24 01:14:27 +0000906 addFlag(ElemDie, dwarf::DW_AT_explicit);
Devang Patel161b2f42011-04-12 23:21:44 +0000907 }
908 else if (Element.isVariable()) {
909 DIVariable DV(Element);
910 ElemDie = new DIE(dwarf::DW_TAG_variable);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000911 addString(ElemDie, dwarf::DW_AT_name, DV.getName());
Devang Patel161b2f42011-04-12 23:21:44 +0000912 addType(ElemDie, DV.getType());
Eric Christopher873cf0a2012-08-24 01:14:27 +0000913 addFlag(ElemDie, dwarf::DW_AT_declaration);
914 addFlag(ElemDie, dwarf::DW_AT_external);
Devang Patel161b2f42011-04-12 23:21:44 +0000915 addSourceLine(ElemDie, DV);
Eric Christopher663e0cf2012-03-28 07:34:31 +0000916 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +0000917 DIDerivedType DDTy(Element);
918 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
919 ElemDie = new DIE(dwarf::DW_TAG_friend);
920 addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend);
921 } else
922 ElemDie = createMemberDIE(DIDerivedType(Element));
Eric Christopher663e0cf2012-03-28 07:34:31 +0000923 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +0000924 DIObjCProperty Property(Element);
925 ElemDie = new DIE(Property.getTag());
926 StringRef PropertyName = Property.getObjCPropertyName();
927 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +0000928 addType(ElemDie, Property.getType());
929 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +0000930 StringRef GetterName = Property.getObjCPropertyGetterName();
931 if (!GetterName.empty())
932 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
933 StringRef SetterName = Property.getObjCPropertySetterName();
934 if (!SetterName.empty())
935 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
936 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +0000937 if (Property.isReadOnlyObjCProperty())
938 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
939 if (Property.isReadWriteObjCProperty())
940 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
941 if (Property.isAssignObjCProperty())
942 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
943 if (Property.isRetainObjCProperty())
944 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
945 if (Property.isCopyObjCProperty())
946 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
947 if (Property.isNonAtomicObjCProperty())
948 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
949 if (PropertyAttributes)
Eric Christopher8b4310b2012-11-21 00:34:38 +0000950 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
Devang Patel9e11eb12012-02-04 01:30:32 +0000951 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +0000952
Devang Patel30d409c2012-02-07 23:33:58 +0000953 DIEEntry *Entry = getDIEEntry(Element);
954 if (!Entry) {
955 Entry = createDIEEntry(ElemDie);
956 insertDIEEntry(Element, Entry);
957 }
Devang Patel9e11eb12012-02-04 01:30:32 +0000958 } else
Devang Patel161b2f42011-04-12 23:21:44 +0000959 continue;
960 Buffer.addChild(ElemDie);
961 }
962
963 if (CTy.isAppleBlockExtension())
Eric Christopher873cf0a2012-08-24 01:14:27 +0000964 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel161b2f42011-04-12 23:21:44 +0000965
Devang Patel161b2f42011-04-12 23:21:44 +0000966 DICompositeType ContainingType = CTy.getContainingType();
967 if (DIDescriptor(ContainingType).isCompositeType())
968 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
969 getOrCreateTypeDIE(DIType(ContainingType)));
970 else {
971 DIDescriptor Context = CTy.getContext();
972 addToContextOwner(&Buffer, Context);
973 }
974
Devang Patel201e6cd2011-05-12 21:29:42 +0000975 if (CTy.isObjcClassComplete())
Eric Christopher873cf0a2012-08-24 01:14:27 +0000976 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patelb11f80e2011-05-12 19:06:16 +0000977
Eric Christopher1a8e8862011-12-16 23:42:42 +0000978 // Add template parameters to a class, structure or union types.
979 // FIXME: The support isn't in the metadata for this yet.
980 if (Tag == dwarf::DW_TAG_class_type ||
981 Tag == dwarf::DW_TAG_structure_type ||
982 Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +0000983 addTemplateParams(Buffer, CTy.getTemplateParams());
984
985 break;
986 }
987 default:
988 break;
989 }
990
991 // Add name if not anonymous or intermediate type.
992 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000993 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +0000994
Eric Christopher4a5d8392012-05-22 18:45:18 +0000995 if (Tag == dwarf::DW_TAG_enumeration_type ||
996 Tag == dwarf::DW_TAG_class_type ||
997 Tag == dwarf::DW_TAG_structure_type ||
998 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +0000999 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +00001000 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +00001001 if (Size)
1002 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001003 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +00001004 // Add zero size if it is not a forward declaration.
Eric Christopherfc4199b2012-06-01 00:22:32 +00001005 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1006
1007 // If we're a forward decl, say so.
1008 if (CTy.isForwardDecl())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001009 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel161b2f42011-04-12 23:21:44 +00001010
1011 // Add source line info if available.
1012 if (!CTy.isForwardDecl())
1013 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +00001014
1015 // No harm in adding the runtime language to the declaration.
1016 unsigned RLang = CTy.getRunTimeLang();
1017 if (RLang)
1018 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1019 dwarf::DW_FORM_data1, RLang);
Devang Patel161b2f42011-04-12 23:21:44 +00001020 }
1021}
1022
Eric Christopher8b4310b2012-11-21 00:34:38 +00001023/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001024/// for the given DITemplateTypeParameter.
1025DIE *
1026CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1027 DIE *ParamDIE = getDIE(TP);
1028 if (ParamDIE)
1029 return ParamDIE;
1030
1031 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
1032 addType(ParamDIE, TP.getType());
Nick Lewycky390c40d2011-10-27 06:44:11 +00001033 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +00001034 return ParamDIE;
1035}
1036
Eric Christopher8b4310b2012-11-21 00:34:38 +00001037/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001038/// for the given DITemplateValueParameter.
1039DIE *
Eric Christopher4d069bf2012-05-22 18:45:24 +00001040CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV){
Devang Patel161b2f42011-04-12 23:21:44 +00001041 DIE *ParamDIE = getDIE(TPV);
1042 if (ParamDIE)
1043 return ParamDIE;
1044
1045 ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
1046 addType(ParamDIE, TPV.getType());
1047 if (!TPV.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001048 addString(ParamDIE, dwarf::DW_AT_name, TPV.getName());
Eric Christopher8b4310b2012-11-21 00:34:38 +00001049 addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
Devang Patel161b2f42011-04-12 23:21:44 +00001050 TPV.getValue());
1051 return ParamDIE;
1052}
1053
Devang Patel31c5d052011-05-06 16:57:54 +00001054/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1055DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
1056 DIE *NDie = getDIE(NS);
1057 if (NDie)
1058 return NDie;
1059 NDie = new DIE(dwarf::DW_TAG_namespace);
1060 insertDIE(NS, NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001061 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001062 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001063 addAccelNamespace(NS.getName(), NDie);
1064 } else
1065 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +00001066 addSourceLine(NDie, NS);
1067 addToContextOwner(NDie, NS.getContext());
1068 return NDie;
1069}
1070
Devang Pateldbc64af2011-08-15 17:24:54 +00001071/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
1072/// printer to not emit usual symbol prefix before the symbol name is used then
1073/// return linkage name after skipping this special LLVM prefix.
1074static StringRef getRealLinkageName(StringRef LinkageName) {
1075 char One = '\1';
1076 if (LinkageName.startswith(StringRef(&One, 1)))
1077 return LinkageName.substr(1);
1078 return LinkageName;
1079}
1080
1081/// getOrCreateSubprogramDIE - Create new DIE using SP.
1082DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
1083 DIE *SPDie = getDIE(SP);
1084 if (SPDie)
1085 return SPDie;
1086
Peter Collingbourne27302f02012-05-27 18:36:44 +00001087 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1088
1089 // DW_TAG_inlined_subroutine may refer to this DIE.
1090 insertDIE(SP, SPDie);
1091
Rafael Espindola01b55b42011-11-10 22:34:29 +00001092 DISubprogram SPDecl = SP.getFunctionDeclaration();
1093 DIE *DeclDie = NULL;
1094 if (SPDecl.isSubprogram()) {
1095 DeclDie = getOrCreateSubprogramDIE(SPDecl);
1096 }
1097
Devang Pateldbc64af2011-08-15 17:24:54 +00001098 // Add to context owner.
1099 addToContextOwner(SPDie, SP.getContext());
1100
1101 // Add function template parameters.
1102 addTemplateParams(*SPDie, SP.getTemplateParams());
1103
Eric Christophere9722e12012-04-16 23:54:23 +00001104 // Unfortunately this code needs to stay here instead of below the
1105 // AT_specification code in order to work around a bug in older
1106 // gdbs that requires the linkage name to resolve multiple template
1107 // functions.
Eric Christophercbbd5b12012-08-23 22:52:55 +00001108 // TODO: Remove this set of code when we get rid of the old gdb
1109 // compatibility.
Eric Christopher8d101c32012-03-15 08:19:33 +00001110 StringRef LinkageName = SP.getLinkageName();
Eric Christophercbbd5b12012-08-23 22:52:55 +00001111 if (!LinkageName.empty() && DD->useDarwinGDBCompat())
Eric Christopher8d101c32012-03-15 08:19:33 +00001112 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
1113 getRealLinkageName(LinkageName));
1114
Devang Pateldbc64af2011-08-15 17:24:54 +00001115 // If this DIE is going to refer declaration info using AT_specification
1116 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001117 if (DeclDie) {
1118 // Refer function declaration directly.
1119 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1120 DeclDie);
1121
Devang Pateldbc64af2011-08-15 17:24:54 +00001122 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001123 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001124
Eric Christophercbbd5b12012-08-23 22:52:55 +00001125 // Add the linkage name if we have one.
1126 if (!LinkageName.empty() && !DD->useDarwinGDBCompat())
1127 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
1128 getRealLinkageName(LinkageName));
1129
Devang Pateldbc64af2011-08-15 17:24:54 +00001130 // Constructors and operators for anonymous aggregates do not have names.
1131 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001132 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001133
1134 addSourceLine(SPDie, SP);
1135
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001136 // Add the prototype if we have a prototype and we have a C like
1137 // language.
1138 if (SP.isPrototyped() &&
1139 (Language == dwarf::DW_LANG_C89 ||
1140 Language == dwarf::DW_LANG_C99 ||
1141 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001142 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Pateldbc64af2011-08-15 17:24:54 +00001143
1144 // Add Return Type.
1145 DICompositeType SPTy = SP.getType();
1146 DIArray Args = SPTy.getTypeArray();
1147 unsigned SPTag = SPTy.getTag();
1148
1149 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1150 addType(SPDie, SPTy);
1151 else
1152 addType(SPDie, DIType(Args.getElement(0)));
1153
1154 unsigned VK = SP.getVirtuality();
1155 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001156 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001157 DIEBlock *Block = getDIEBlock();
1158 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1159 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1160 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1161 ContainingTypeMap.insert(std::make_pair(SPDie,
1162 SP.getContainingType()));
1163 }
1164
1165 if (!SP.isDefinition()) {
Eric Christopher873cf0a2012-08-24 01:14:27 +00001166 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001167
Devang Pateldbc64af2011-08-15 17:24:54 +00001168 // Add arguments. Do not add arguments for subprogram definition. They will
1169 // be handled while processing variables.
1170 DICompositeType SPTy = SP.getType();
1171 DIArray Args = SPTy.getTypeArray();
1172 unsigned SPTag = SPTy.getTag();
1173
1174 if (SPTag == dwarf::DW_TAG_subroutine_type)
1175 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1176 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
Eric Christopher5c38de92012-09-10 23:33:57 +00001177 DIType ATy = DIType(Args.getElement(i));
Devang Pateldbc64af2011-08-15 17:24:54 +00001178 addType(Arg, ATy);
1179 if (ATy.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001180 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001181 SPDie->addChild(Arg);
1182 }
1183 }
1184
1185 if (SP.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001186 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001187
1188 if (!SP.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001189 addFlag(SPDie, dwarf::DW_AT_external);
Devang Pateldbc64af2011-08-15 17:24:54 +00001190
1191 if (SP.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001192 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Pateldbc64af2011-08-15 17:24:54 +00001193
1194 if (unsigned isa = Asm->getISAEncoding()) {
1195 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1196 }
1197
1198 return SPDie;
1199}
1200
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001201// Return const expression if value is a GEP to access merged global
1202// constant. e.g.
1203// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1204static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1205 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1206 if (!CE || CE->getNumOperands() != 3 ||
1207 CE->getOpcode() != Instruction::GetElementPtr)
1208 return NULL;
1209
1210 // First operand points to a global struct.
1211 Value *Ptr = CE->getOperand(0);
1212 if (!isa<GlobalValue>(Ptr) ||
1213 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1214 return NULL;
1215
1216 // Second operand is zero.
1217 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1218 if (!CI || !CI->isZero())
1219 return NULL;
1220
1221 // Third operand is offset.
1222 if (!isa<ConstantInt>(CE->getOperand(2)))
1223 return NULL;
1224
1225 return CE;
1226}
1227
1228/// createGlobalVariableDIE - create global variable DIE.
1229void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001230 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001231 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001232 return;
1233
Devang Patel49e2f032011-08-18 22:21:50 +00001234 DIGlobalVariable GV(N);
Devang Patel28bea082011-08-18 23:17:55 +00001235 if (!GV.Verify())
1236 return;
1237
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001238 DIE *VariableDIE = new DIE(GV.getTag());
Devang Patel49e2f032011-08-18 22:21:50 +00001239 // Add to map.
1240 insertDIE(N, VariableDIE);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001241
1242 // Add name.
Nick Lewycky390c40d2011-10-27 06:44:11 +00001243 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001244 StringRef LinkageName = GV.getLinkageName();
Devang Patel49e2f032011-08-18 22:21:50 +00001245 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001246 if (!LinkageName.empty() && isGlobalVariable)
Nick Lewycky746cb672011-10-26 22:55:33 +00001247 addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Nick Lewycky390c40d2011-10-27 06:44:11 +00001248 getRealLinkageName(LinkageName));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001249 // Add type.
Devang Patel49e2f032011-08-18 22:21:50 +00001250 DIType GTy = GV.getType();
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001251 addType(VariableDIE, GTy);
1252
1253 // Add scoping info.
Eric Christopherdfa30e12011-11-09 05:24:07 +00001254 if (!GV.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001255 addFlag(VariableDIE, dwarf::DW_AT_external);
Eric Christopherdfa30e12011-11-09 05:24:07 +00001256
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001257 // Add line number info.
1258 addSourceLine(VariableDIE, GV);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001259 // Add to context owner.
1260 DIDescriptor GVContext = GV.getContext();
1261 addToContextOwner(VariableDIE, GVContext);
1262 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001263 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001264 DIE *VariableSpecDIE = NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001265 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001266 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001267 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1268 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1269 addLabel(Block, 0, dwarf::DW_FORM_udata,
1270 Asm->Mang->getSymbol(GV.getGlobal()));
1271 // Do not create specification DIE if context is either compile unit
1272 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001273 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001274 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1275 // Create specification DIE.
Eric Christopherd117fbb2011-11-11 01:55:22 +00001276 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001277 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1278 dwarf::DW_FORM_ref4, VariableDIE);
1279 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher873cf0a2012-08-24 01:14:27 +00001280 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001281 addDie(VariableSpecDIE);
1282 } else {
1283 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001284 }
Eric Christopher8b4310b2012-11-21 00:34:38 +00001285 } else if (const ConstantInt *CI =
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001286 dyn_cast_or_null<ConstantInt>(GV.getConstant()))
1287 addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
1288 else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001289 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001290 // GV is a merged global.
1291 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1292 Value *Ptr = CE->getOperand(0);
1293 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1294 addLabel(Block, 0, dwarf::DW_FORM_udata,
1295 Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
1296 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1297 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
Eric Christopher8b4310b2012-11-21 00:34:38 +00001298 addUInt(Block, 0, dwarf::DW_FORM_udata,
Micah Villmow3574eca2012-10-08 16:38:25 +00001299 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001300 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1301 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1302 }
1303
Eric Christopherd117fbb2011-11-11 01:55:22 +00001304 if (addToAccelTable) {
1305 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1306 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001307
Eric Christopherd117fbb2011-11-11 01:55:22 +00001308 // If the linkage name is different than the name, go ahead and output
1309 // that as well into the name table.
1310 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1311 addAccelName(GV.getLinkageName(), AddrDIE);
1312 }
Eric Christopher74d8a872011-11-08 21:56:23 +00001313
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001314 return;
1315}
1316
Devang Patel161b2f42011-04-12 23:21:44 +00001317/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001318void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1319 DIE *IndexTy) {
Devang Patel161b2f42011-04-12 23:21:44 +00001320 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1321 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001322
Bill Wendling222c2fd2012-12-06 07:38:10 +00001323 // The LowerBound value defines the lower bounds which is typically zero for
1324 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1325 // Count == -1 then the array is unbounded and we do not emit
1326 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1327 // Count == 0, then the array has zero elements in which case we do not emit
1328 // an upper bound.
1329 int64_t LowerBound = SR.getLo();
Bill Wendling6afe4782012-12-06 07:55:19 +00001330 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendling9493dae2012-12-04 21:34:03 +00001331 int64_t Count = SR.getCount();
Devang Patel161b2f42011-04-12 23:21:44 +00001332
Bill Wendling6afe4782012-12-06 07:55:19 +00001333 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
Bill Wendling222c2fd2012-12-06 07:38:10 +00001334 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1335
1336 if (Count != -1 && Count != 0)
Bill Wendling9493dae2012-12-04 21:34:03 +00001337 // FIXME: An unbounded array should reference the expression that defines
1338 // the array.
Bill Wendling222c2fd2012-12-06 07:38:10 +00001339 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
Bill Wendling9493dae2012-12-04 21:34:03 +00001340
Devang Patel161b2f42011-04-12 23:21:44 +00001341 Buffer.addChild(DW_Subrange);
1342}
1343
1344/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1345void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1346 DICompositeType *CTy) {
1347 Buffer.setTag(dwarf::DW_TAG_array_type);
1348 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
Eric Christopher873cf0a2012-08-24 01:14:27 +00001349 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel161b2f42011-04-12 23:21:44 +00001350
1351 // Emit derived type.
1352 addType(&Buffer, CTy->getTypeDerivedFrom());
1353 DIArray Elements = CTy->getTypeArray();
1354
1355 // Get an anonymous type for index type.
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001356 // FIXME: This type should be passed down from the front end
1357 // as different languages may have different sizes for indexes.
Devang Patel161b2f42011-04-12 23:21:44 +00001358 DIE *IdxTy = getIndexTyDie();
1359 if (!IdxTy) {
1360 // Construct an anonymous type for index type.
1361 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001362 addString(IdxTy, dwarf::DW_AT_name, "int");
Devang Patel161b2f42011-04-12 23:21:44 +00001363 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1364 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1365 dwarf::DW_ATE_signed);
1366 addDie(IdxTy);
1367 setIndexTyDie(IdxTy);
1368 }
1369
1370 // Add subranges to array type.
1371 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1372 DIDescriptor Element = Elements.getElement(i);
1373 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1374 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1375 }
1376}
1377
1378/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1379DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1380 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1381 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001382 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001383 int64_t Value = ETy.getEnumValue();
1384 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1385 return Enumerator;
1386}
1387
Devang Pateldbc64af2011-08-15 17:24:54 +00001388/// constructContainingTypeDIEs - Construct DIEs for types that contain
1389/// vtables.
1390void CompileUnit::constructContainingTypeDIEs() {
1391 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1392 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1393 DIE *SPDie = CI->first;
1394 const MDNode *N = CI->second;
1395 if (!N) continue;
1396 DIE *NDie = getDIE(N);
1397 if (!NDie) continue;
1398 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1399 }
1400}
1401
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001402/// constructVariableDIE - Construct a DIE for the given DbgVariable.
1403DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
1404 StringRef Name = DV->getName();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001405
1406 // Translate tag to proper Dwarf tag.
1407 unsigned Tag = DV->getTag();
1408
1409 // Define variable debug information entry.
1410 DIE *VariableDie = new DIE(Tag);
1411 DbgVariable *AbsVar = DV->getAbstractVariable();
1412 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
1413 if (AbsDIE)
1414 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1415 dwarf::DW_FORM_ref4, AbsDIE);
1416 else {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001417 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001418 addSourceLine(VariableDie, DV->getVariable());
1419 addType(VariableDie, DV->getType());
1420 }
1421
1422 if (DV->isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001423 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001424
1425 if (isScopeAbstract) {
1426 DV->setDIE(VariableDie);
1427 return VariableDie;
1428 }
1429
1430 // Add variable address.
1431
1432 unsigned Offset = DV->getDotDebugLocOffset();
1433 if (Offset != ~0U) {
1434 addLabel(VariableDie, dwarf::DW_AT_location,
1435 dwarf::DW_FORM_data4,
1436 Asm->GetTempSymbol("debug_loc", Offset));
1437 DV->setDIE(VariableDie);
1438 return VariableDie;
1439 }
1440
Eric Christopher8cf5e742011-10-03 15:49:20 +00001441 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001442 if (const MachineInstr *DVInsn = DV->getMInsn()) {
1443 bool updated = false;
1444 if (DVInsn->getNumOperands() == 3) {
1445 if (DVInsn->getOperand(0).isReg()) {
1446 const MachineOperand RegOp = DVInsn->getOperand(0);
1447 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1448 if (DVInsn->getOperand(1).isImm() &&
1449 TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
1450 unsigned FrameReg = 0;
1451 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher8b4310b2012-11-21 00:34:38 +00001452 int Offset =
1453 TFI->getFrameIndexReference(*Asm->MF,
1454 DVInsn->getOperand(1).getImm(),
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001455 FrameReg);
1456 MachineLocation Location(FrameReg, Offset);
1457 addVariableAddress(DV, VariableDie, Location);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001458
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001459 } else if (RegOp.getReg())
Eric Christopher8b4310b2012-11-21 00:34:38 +00001460 addVariableAddress(DV, VariableDie,
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001461 MachineLocation(RegOp.getReg()));
1462 updated = true;
1463 }
1464 else if (DVInsn->getOperand(0).isImm())
Eric Christopher8b4310b2012-11-21 00:34:38 +00001465 updated =
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001466 addConstantValue(VariableDie, DVInsn->getOperand(0),
1467 DV->getType());
1468 else if (DVInsn->getOperand(0).isFPImm())
1469 updated =
1470 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
1471 else if (DVInsn->getOperand(0).isCImm())
1472 updated =
Eric Christopher8b4310b2012-11-21 00:34:38 +00001473 addConstantValue(VariableDie,
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001474 DVInsn->getOperand(0).getCImm(),
1475 DV->getType().isUnsignedDIType());
1476 } else {
Eric Christopher8b4310b2012-11-21 00:34:38 +00001477 addVariableAddress(DV, VariableDie,
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001478 Asm->getDebugValueLocation(DVInsn));
1479 updated = true;
1480 }
1481 if (!updated) {
1482 // If variableDie is not updated then DBG_VALUE instruction does not
1483 // have valid variable info.
1484 delete VariableDie;
1485 return NULL;
1486 }
1487 DV->setDIE(VariableDie);
1488 return VariableDie;
1489 } else {
1490 // .. else use frame index.
1491 int FI = DV->getFrameIndex();
1492 if (FI != ~0) {
1493 unsigned FrameReg = 0;
1494 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher8b4310b2012-11-21 00:34:38 +00001495 int Offset =
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001496 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1497 MachineLocation Location(FrameReg, Offset);
1498 addVariableAddress(DV, VariableDie, Location);
1499 }
1500 }
1501
1502 DV->setDIE(VariableDie);
1503 return VariableDie;
1504}
1505
Devang Patel161b2f42011-04-12 23:21:44 +00001506/// createMemberDIE - Create new member DIE.
1507DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1508 DIE *MemberDie = new DIE(DT.getTag());
1509 StringRef Name = DT.getName();
1510 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001511 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001512
1513 addType(MemberDie, DT.getTypeDerivedFrom());
1514
1515 addSourceLine(MemberDie, DT);
1516
1517 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1518 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1519
1520 uint64_t Size = DT.getSizeInBits();
1521 uint64_t FieldSize = DT.getOriginalTypeSize();
1522
1523 if (Size != FieldSize) {
1524 // Handle bitfield.
1525 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1526 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1527
1528 uint64_t Offset = DT.getOffsetInBits();
1529 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1530 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1531 uint64_t FieldOffset = (HiMark - FieldSize);
1532 Offset -= FieldOffset;
1533
1534 // Maybe we need to work from the other end.
Micah Villmow3574eca2012-10-08 16:38:25 +00001535 if (Asm->getDataLayout().isLittleEndian())
Devang Patel161b2f42011-04-12 23:21:44 +00001536 Offset = FieldSize - (Offset + Size);
1537 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1538
1539 // Here WD_AT_data_member_location points to the anonymous
1540 // field that includes this bit field.
1541 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1542
1543 } else
1544 // This is not a bitfield.
1545 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1546
1547 if (DT.getTag() == dwarf::DW_TAG_inheritance
1548 && DT.isVirtual()) {
1549
1550 // For C++, virtual base classes are not at fixed offset. Use following
1551 // expression to extract appropriate offset from vtable.
1552 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1553
1554 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1555 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1556 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1557 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1558 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1559 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1560 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1561 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1562
1563 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1564 VBaseLocationDie);
1565 } else
1566 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1567
1568 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001569 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001570 dwarf::DW_ACCESS_protected);
1571 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001572 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001573 dwarf::DW_ACCESS_private);
1574 // Otherwise C++ member and base classes are considered public.
Eric Christopher8b4310b2012-11-21 00:34:38 +00001575 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001576 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001577 dwarf::DW_ACCESS_public);
1578 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001579 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001580 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001581
1582 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001583 if (MDNode *PNode = DT.getObjCProperty())
1584 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher8b4310b2012-11-21 00:34:38 +00001585 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel6588abf2012-02-06 17:49:43 +00001586 PropertyDie);
1587
David Blaikie01bc2b32012-12-13 22:43:07 +00001588 if (DT.isArtificial())
1589 addFlag(MemberDie, dwarf::DW_AT_artificial);
1590
Devang Patel9e11eb12012-02-04 01:30:32 +00001591 // This is only for backward compatibility.
Devang Patele9db5e22011-04-16 00:11:51 +00001592 StringRef PropertyName = DT.getObjCPropertyName();
1593 if (!PropertyName.empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001594 addString(MemberDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Devang Patele9db5e22011-04-16 00:11:51 +00001595 StringRef GetterName = DT.getObjCPropertyGetterName();
1596 if (!GetterName.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001597 addString(MemberDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
Devang Patele9db5e22011-04-16 00:11:51 +00001598 StringRef SetterName = DT.getObjCPropertySetterName();
1599 if (!SetterName.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001600 addString(MemberDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
Devang Patele9db5e22011-04-16 00:11:51 +00001601 unsigned PropertyAttributes = 0;
1602 if (DT.isReadOnlyObjCProperty())
1603 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1604 if (DT.isReadWriteObjCProperty())
1605 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1606 if (DT.isAssignObjCProperty())
1607 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1608 if (DT.isRetainObjCProperty())
1609 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1610 if (DT.isCopyObjCProperty())
1611 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1612 if (DT.isNonAtomicObjCProperty())
1613 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1614 if (PropertyAttributes)
Eric Christopher8b4310b2012-11-21 00:34:38 +00001615 addUInt(MemberDie, dwarf::DW_AT_APPLE_property_attribute, 0,
Devang Patele9db5e22011-04-16 00:11:51 +00001616 PropertyAttributes);
1617 }
Devang Patel161b2f42011-04-12 23:21:44 +00001618 return MemberDie;
1619}