blob: 7a3eb329007e2f984eca3d1e603bb22dfcbb5313 [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
Eric Christopherc36145f2012-01-06 04:35:23 +000016#include "DwarfAccelTable.h"
Devang Patel161b2f42011-04-12 23:21:44 +000017#include "DwarfCompileUnit.h"
18#include "DwarfDebug.h"
19#include "llvm/Constants.h"
Bill Wendling16eeb6f2012-06-29 08:32:07 +000020#include "llvm/DIBuilder.h"
Devang Patel6f9d8ff2011-08-15 17:57:41 +000021#include "llvm/GlobalVariable.h"
22#include "llvm/Instructions.h"
Eric Christopherd61c34b2011-11-11 03:16:32 +000023#include "llvm/Support/Debug.h"
Devang Patel6f9d8ff2011-08-15 17:57:41 +000024#include "llvm/Target/Mangler.h"
Devang Patel161b2f42011-04-12 23:21:44 +000025#include "llvm/Target/TargetData.h"
26#include "llvm/Target/TargetFrameLowering.h"
27#include "llvm/Target/TargetMachine.h"
28#include "llvm/Target/TargetRegisterInfo.h"
29#include "llvm/ADT/APFloat.h"
30#include "llvm/Support/ErrorHandling.h"
31
32using namespace llvm;
33
34/// CompileUnit - Compile unit constructor.
Eric Christopher438b0922012-02-22 08:46:13 +000035CompileUnit::CompileUnit(unsigned I, unsigned L, DIE *D, AsmPrinter *A,
Eric Christopher4d069bf2012-05-22 18:45:24 +000036 DwarfDebug *DW)
Eric Christopher438b0922012-02-22 08:46:13 +000037 : ID(I), Language(L), CUDie(D), Asm(A), DD(DW), IndexTyDie(0) {
Devang Patel161b2f42011-04-12 23:21:44 +000038 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
39}
40
41/// ~CompileUnit - Destructor for compile unit.
42CompileUnit::~CompileUnit() {
43 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
44 DIEBlocks[j]->~DIEBlock();
45}
46
47/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
48/// information entry.
49DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
50 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
51 return Value;
52}
53
54/// addUInt - Add an unsigned integer attribute data and value.
55///
56void CompileUnit::addUInt(DIE *Die, unsigned Attribute,
57 unsigned Form, uint64_t Integer) {
58 if (!Form) Form = DIEInteger::BestForm(false, Integer);
59 DIEValue *Value = Integer == 1 ?
60 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
61 Die->addValue(Attribute, Form, Value);
62}
63
64/// addSInt - Add an signed integer attribute data and value.
65///
66void CompileUnit::addSInt(DIE *Die, unsigned Attribute,
67 unsigned Form, int64_t Integer) {
68 if (!Form) Form = DIEInteger::BestForm(true, Integer);
69 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
70 Die->addValue(Attribute, Form, Value);
71}
72
Nick Lewycky6a7efcf2011-10-28 05:29:47 +000073/// addString - Add a string attribute data and value. We always emit a
74/// reference to the string pool instead of immediate strings so that DIEs have
75/// more predictable sizes.
Nick Lewycky390c40d2011-10-27 06:44:11 +000076void CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) {
Nick Lewycky6a7efcf2011-10-28 05:29:47 +000077 MCSymbol *Symb = DD->getStringPoolEntry(String);
78 DIEValue *Value;
79 if (Asm->needsRelocationsForDwarfStringPool())
80 Value = new (DIEValueAllocator) DIELabel(Symb);
81 else {
82 MCSymbol *StringPool = DD->getStringPool();
83 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewycky390c40d2011-10-27 06:44:11 +000084 }
Nick Lewycky6a7efcf2011-10-28 05:29:47 +000085 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel161b2f42011-04-12 23:21:44 +000086}
87
88/// addLabel - Add a Dwarf label attribute data and value.
89///
90void CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
91 const MCSymbol *Label) {
92 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
93 Die->addValue(Attribute, Form, Value);
94}
95
96/// addDelta - Add a label delta attribute data and value.
97///
98void CompileUnit::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
99 const MCSymbol *Hi, const MCSymbol *Lo) {
100 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
101 Die->addValue(Attribute, Form, Value);
102}
103
104/// addDIEEntry - Add a DIE attribute data and value.
105///
106void CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
107 DIE *Entry) {
108 Die->addValue(Attribute, Form, createDIEEntry(Entry));
109}
110
Devang Patel161b2f42011-04-12 23:21:44 +0000111/// addBlock - Add block data.
112///
113void CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
114 DIEBlock *Block) {
115 Block->ComputeSize(Asm);
116 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
117 Die->addValue(Attribute, Block->BestForm(), Block);
118}
119
120/// addSourceLine - Add location information to specified debug information
121/// entry.
122void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
123 // Verify variable.
124 if (!V.Verify())
125 return;
126
127 unsigned Line = V.getLineNumber();
128 if (Line == 0)
129 return;
130 unsigned FileID = DD->GetOrCreateSourceID(V.getContext().getFilename(),
131 V.getContext().getDirectory());
132 assert(FileID && "Invalid file id");
133 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
134 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
135}
136
137/// addSourceLine - Add location information to specified debug information
138/// entry.
139void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
140 // Verify global variable.
141 if (!G.Verify())
142 return;
143
144 unsigned Line = G.getLineNumber();
145 if (Line == 0)
146 return;
Nick Lewycky746cb672011-10-26 22:55:33 +0000147 unsigned FileID = DD->GetOrCreateSourceID(G.getFilename(), G.getDirectory());
Devang Patel161b2f42011-04-12 23:21:44 +0000148 assert(FileID && "Invalid file id");
149 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
150 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
151}
152
153/// addSourceLine - Add location information to specified debug information
154/// entry.
155void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
156 // Verify subprogram.
157 if (!SP.Verify())
158 return;
Eric Christopher2125d5a2012-03-15 23:55:40 +0000159
Devang Patel161b2f42011-04-12 23:21:44 +0000160 // If the line number is 0, don't add it.
Eric Christopher2125d5a2012-03-15 23:55:40 +0000161 unsigned Line = SP.getLineNumber();
162 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000163 return;
164
Nick Lewycky746cb672011-10-26 22:55:33 +0000165 unsigned FileID = DD->GetOrCreateSourceID(SP.getFilename(),
166 SP.getDirectory());
Devang Patel161b2f42011-04-12 23:21:44 +0000167 assert(FileID && "Invalid file id");
168 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
169 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
170}
171
172/// addSourceLine - Add location information to specified debug information
173/// entry.
174void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
175 // Verify type.
176 if (!Ty.Verify())
177 return;
178
179 unsigned Line = Ty.getLineNumber();
Eric Christopher2125d5a2012-03-15 23:55:40 +0000180 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000181 return;
Nick Lewycky746cb672011-10-26 22:55:33 +0000182 unsigned FileID = DD->GetOrCreateSourceID(Ty.getFilename(),
183 Ty.getDirectory());
Devang Patel161b2f42011-04-12 23:21:44 +0000184 assert(FileID && "Invalid file id");
185 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
186 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
187}
188
189/// addSourceLine - Add location information to specified debug information
190/// entry.
Eric Christopherb8ca9882012-03-29 08:42:56 +0000191void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
192 // Verify type.
193 if (!Ty.Verify())
194 return;
195
196 unsigned Line = Ty.getLineNumber();
197 if (Line == 0)
198 return;
199 DIFile File = Ty.getFile();
200 unsigned FileID = DD->GetOrCreateSourceID(File.getFilename(),
Eric Christopher4d069bf2012-05-22 18:45:24 +0000201 File.getDirectory());
Eric Christopherb8ca9882012-03-29 08:42:56 +0000202 assert(FileID && "Invalid file id");
203 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
204 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
205}
206
207/// addSourceLine - Add location information to specified debug information
208/// entry.
Devang Patel161b2f42011-04-12 23:21:44 +0000209void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
210 // Verify namespace.
211 if (!NS.Verify())
212 return;
213
214 unsigned Line = NS.getLineNumber();
215 if (Line == 0)
216 return;
217 StringRef FN = NS.getFilename();
218
219 unsigned FileID = DD->GetOrCreateSourceID(FN, NS.getDirectory());
220 assert(FileID && "Invalid file id");
221 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
222 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
223}
224
Devang Patele1cdf842011-04-27 22:45:24 +0000225/// addVariableAddress - Add DW_AT_location attribute for a
226/// DbgVariable based on provided MachineLocation.
227void CompileUnit::addVariableAddress(DbgVariable *&DV, DIE *Die,
228 MachineLocation Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000229 if (DV->variableHasComplexAddress())
230 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
231 else if (DV->isBlockByrefVariable())
232 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
233 else
234 addAddress(Die, dwarf::DW_AT_location, Location);
235}
236
Devang Patel116da2f2011-04-26 19:06:18 +0000237/// addRegisterOp - Add register operand.
238void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
239 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
240 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
241 if (DWReg < 32)
242 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
243 else {
244 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
245 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
246 }
247}
248
249/// addRegisterOffset - Add register offset.
250void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
251 int64_t Offset) {
252 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
253 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
254 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
255 if (Reg == TRI->getFrameRegister(*Asm->MF))
256 // If variable offset is based in frame register then use fbreg.
257 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
258 else if (DWReg < 32)
259 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
260 else {
261 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
262 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
263 }
264 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
265}
266
267/// addAddress - Add an address attribute to a die based on the location
268/// provided.
269void CompileUnit::addAddress(DIE *Die, unsigned Attribute,
270 const MachineLocation &Location) {
271 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
272
273 if (Location.isReg())
274 addRegisterOp(Block, Location.getReg());
275 else
276 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
277
278 // Now attach the location information to the DIE.
279 addBlock(Die, Attribute, 0, Block);
280}
281
Devang Patel161b2f42011-04-12 23:21:44 +0000282/// addComplexAddress - Start with the address based on the location provided,
283/// and generate the DWARF information necessary to find the actual variable
284/// given the extra address information encoded in the DIVariable, starting from
285/// the starting location. Add the DWARF information to the die.
286///
287void CompileUnit::addComplexAddress(DbgVariable *&DV, DIE *Die,
288 unsigned Attribute,
289 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000290 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patelc26f5442011-04-28 02:22:40 +0000291 unsigned N = DV->getNumAddrElements();
292 unsigned i = 0;
293 if (Location.isReg()) {
294 if (N >= 2 && DV->getAddrElement(0) == DIBuilder::OpPlus) {
295 // If first address element is OpPlus then emit
296 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
297 addRegisterOffset(Block, Location.getReg(), DV->getAddrElement(1));
298 i = 2;
299 } else
300 addRegisterOp(Block, Location.getReg());
301 }
Devang Patel116da2f2011-04-26 19:06:18 +0000302 else
303 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000304
Devang Patelc26f5442011-04-28 02:22:40 +0000305 for (;i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +0000306 uint64_t Element = DV->getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000307 if (Element == DIBuilder::OpPlus) {
308 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
309 addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
310 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher50120762012-05-08 18:56:00 +0000311 if (!Location.isReg())
312 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000313 } else llvm_unreachable("unknown DIBuilder Opcode");
314 }
315
316 // Now attach the location information to the DIE.
317 addBlock(Die, Attribute, 0, Block);
318}
319
320/* Byref variables, in Blocks, are declared by the programmer as "SomeType
321 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
322 gives the variable VarName either the struct, or a pointer to the struct, as
323 its type. This is necessary for various behind-the-scenes things the
324 compiler needs to do with by-reference variables in Blocks.
325
326 However, as far as the original *programmer* is concerned, the variable
327 should still have type 'SomeType', as originally declared.
328
329 The function getBlockByrefType dives into the __Block_byref_x_VarName
330 struct to find the original type of the variable, which is then assigned to
331 the variable's Debug Information Entry as its real type. So far, so good.
332 However now the debugger will expect the variable VarName to have the type
333 SomeType. So we need the location attribute for the variable to be an
334 expression that explains to the debugger how to navigate through the
335 pointers and struct to find the actual variable of type SomeType.
336
337 The following function does just that. We start by getting
338 the "normal" location for the variable. This will be the location
339 of either the struct __Block_byref_x_VarName or the pointer to the
340 struct __Block_byref_x_VarName.
341
342 The struct will look something like:
343
344 struct __Block_byref_x_VarName {
345 ... <various fields>
346 struct __Block_byref_x_VarName *forwarding;
347 ... <various other fields>
348 SomeType VarName;
349 ... <maybe more fields>
350 };
351
352 If we are given the struct directly (as our starting point) we
353 need to tell the debugger to:
354
355 1). Add the offset of the forwarding field.
356
357 2). Follow that pointer to get the real __Block_byref_x_VarName
358 struct to use (the real one may have been copied onto the heap).
359
360 3). Add the offset for the field VarName, to find the actual variable.
361
362 If we started with a pointer to the struct, then we need to
363 dereference that pointer first, before the other steps.
364 Translating this into DWARF ops, we will need to append the following
365 to the current location description for the variable:
366
367 DW_OP_deref -- optional, if we start with a pointer
368 DW_OP_plus_uconst <forward_fld_offset>
369 DW_OP_deref
370 DW_OP_plus_uconst <varName_fld_offset>
371
372 That is what this function does. */
373
374/// addBlockByrefAddress - Start with the address based on the location
375/// provided, and generate the DWARF information necessary to find the
376/// actual Block variable (navigating the Block struct) based on the
377/// starting location. Add the DWARF information to the die. For
378/// more information, read large comment just above here.
379///
380void CompileUnit::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
381 unsigned Attribute,
382 const MachineLocation &Location) {
383 DIType Ty = DV->getType();
384 DIType TmpTy = Ty;
385 unsigned Tag = Ty.getTag();
386 bool isPointer = false;
387
388 StringRef varName = DV->getName();
389
390 if (Tag == dwarf::DW_TAG_pointer_type) {
391 DIDerivedType DTy = DIDerivedType(Ty);
392 TmpTy = DTy.getTypeDerivedFrom();
393 isPointer = true;
394 }
395
396 DICompositeType blockStruct = DICompositeType(TmpTy);
397
398 // Find the __forwarding field and the variable field in the __Block_byref
399 // struct.
400 DIArray Fields = blockStruct.getTypeArray();
401 DIDescriptor varField = DIDescriptor();
402 DIDescriptor forwardingField = DIDescriptor();
403
404 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
405 DIDescriptor Element = Fields.getElement(i);
406 DIDerivedType DT = DIDerivedType(Element);
407 StringRef fieldName = DT.getName();
408 if (fieldName == "__forwarding")
409 forwardingField = Element;
410 else if (fieldName == varName)
411 varField = Element;
412 }
413
414 // Get the offsets for the forwarding field and the variable field.
415 unsigned forwardingFieldOffset =
416 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
417 unsigned varFieldOffset =
418 DIDerivedType(varField).getOffsetInBits() >> 3;
419
420 // Decode the original location, and use that as the start of the byref
421 // variable's location.
Devang Patel161b2f42011-04-12 23:21:44 +0000422 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
423
Eric Christophercaba2632012-07-04 02:02:18 +0000424 if (Location.isReg())
425 addRegisterOp(Block, Location.getReg());
426 else
427 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000428
429 // If we started with a pointer to the __Block_byref... struct, then
430 // the first thing we need to do is dereference the pointer (DW_OP_deref).
431 if (isPointer)
432 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
433
434 // Next add the offset for the '__forwarding' field:
435 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
436 // adding the offset if it's 0.
437 if (forwardingFieldOffset > 0) {
438 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
439 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
440 }
441
442 // Now dereference the __forwarding field to get to the real __Block_byref
443 // struct: DW_OP_deref.
444 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
445
446 // Now that we've got the real __Block_byref... struct, add the offset
447 // for the variable's field to get to the location of the actual variable:
448 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
449 if (varFieldOffset > 0) {
450 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
451 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
452 }
453
454 // Now attach the location information to the DIE.
455 addBlock(Die, Attribute, 0, Block);
456}
457
Devang Patel4ec14b02011-07-20 21:57:04 +0000458/// isTypeSigned - Return true if the type is signed.
459static bool isTypeSigned(DIType Ty, int *SizeInBits) {
460 if (Ty.isDerivedType())
461 return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
462 if (Ty.isBasicType())
463 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
464 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
465 *SizeInBits = Ty.getSizeInBits();
466 return true;
467 }
468 return false;
469}
470
Devang Patel161b2f42011-04-12 23:21:44 +0000471/// addConstantValue - Add constant value entry in variable DIE.
Devang Patelb58128e2011-05-27 16:45:18 +0000472bool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
473 DIType Ty) {
Nick Lewycky746cb672011-10-26 22:55:33 +0000474 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000475 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patel4ec14b02011-07-20 21:57:04 +0000476 int SizeInBits = -1;
477 bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
478 unsigned Form = SignedConstant ? dwarf::DW_FORM_sdata : dwarf::DW_FORM_udata;
479 switch (SizeInBits) {
480 case 8: Form = dwarf::DW_FORM_data1; break;
481 case 16: Form = dwarf::DW_FORM_data2; break;
482 case 32: Form = dwarf::DW_FORM_data4; break;
483 case 64: Form = dwarf::DW_FORM_data8; break;
Devang Patel045c1d42011-05-27 19:13:26 +0000484 default: break;
485 }
Devang Patel4ec14b02011-07-20 21:57:04 +0000486 SignedConstant ? addSInt(Block, 0, Form, MO.getImm())
487 : addUInt(Block, 0, Form, MO.getImm());
Devang Patel72f0d9c2011-05-27 18:15:52 +0000488
Devang Patel161b2f42011-04-12 23:21:44 +0000489 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
490 return true;
491}
492
493/// addConstantFPValue - Add constant value entry in variable DIE.
494bool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Nick Lewycky390c40d2011-10-27 06:44:11 +0000495 assert (MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000496 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
497 APFloat FPImm = MO.getFPImm()->getValueAPF();
498
499 // Get the raw data form of the floating point.
500 const APInt FltVal = FPImm.bitcastToAPInt();
501 const char *FltPtr = (const char*)FltVal.getRawData();
502
503 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
504 bool LittleEndian = Asm->getTargetData().isLittleEndian();
505 int Incr = (LittleEndian ? 1 : -1);
506 int Start = (LittleEndian ? 0 : NumBytes - 1);
507 int Stop = (LittleEndian ? NumBytes : -1);
508
509 // Output the constant to DWARF one byte at a time.
510 for (; Start != Stop; Start += Incr)
511 addUInt(Block, 0, dwarf::DW_FORM_data1,
512 (unsigned char)0xFF & FltPtr[Start]);
513
514 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
515 return true;
516}
517
518/// addConstantValue - Add constant value entry in variable DIE.
Devang Patel8594d422011-06-24 20:46:11 +0000519bool CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000520 bool Unsigned) {
Devang Pateld6a81362011-05-28 00:39:18 +0000521 unsigned CIBitWidth = CI->getBitWidth();
522 if (CIBitWidth <= 64) {
523 unsigned form = 0;
524 switch (CIBitWidth) {
525 case 8: form = dwarf::DW_FORM_data1; break;
526 case 16: form = dwarf::DW_FORM_data2; break;
527 case 32: form = dwarf::DW_FORM_data4; break;
528 case 64: form = dwarf::DW_FORM_data8; break;
529 default:
530 form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata;
531 }
Devang Patel161b2f42011-04-12 23:21:44 +0000532 if (Unsigned)
Devang Pateld6a81362011-05-28 00:39:18 +0000533 addUInt(Die, dwarf::DW_AT_const_value, form, CI->getZExtValue());
Devang Patel161b2f42011-04-12 23:21:44 +0000534 else
Devang Pateld6a81362011-05-28 00:39:18 +0000535 addSInt(Die, dwarf::DW_AT_const_value, form, CI->getSExtValue());
Devang Patel161b2f42011-04-12 23:21:44 +0000536 return true;
537 }
538
539 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
540
541 // Get the raw data form of the large APInt.
542 const APInt Val = CI->getValue();
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000543 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000544
545 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
546 bool LittleEndian = Asm->getTargetData().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000547
548 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000549 for (int i = 0; i < NumBytes; i++) {
550 uint8_t c;
551 if (LittleEndian)
552 c = Ptr64[i / 8] >> (8 * (i & 7));
553 else
554 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
555 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
556 }
Devang Patel161b2f42011-04-12 23:21:44 +0000557
558 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
559 return true;
560}
561
562/// addTemplateParams - Add template parameters in buffer.
563void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
564 // Add template parameters.
565 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
566 DIDescriptor Element = TParams.getElement(i);
567 if (Element.isTemplateTypeParameter())
568 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
569 DITemplateTypeParameter(Element)));
570 else if (Element.isTemplateValueParameter())
571 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
572 DITemplateValueParameter(Element)));
573 }
Devang Patel161b2f42011-04-12 23:21:44 +0000574}
Nick Lewycky746cb672011-10-26 22:55:33 +0000575
Devang Patel161b2f42011-04-12 23:21:44 +0000576/// addToContextOwner - Add Die into the list of its context owner's children.
577void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
578 if (Context.isType()) {
579 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
580 ContextDIE->addChild(Die);
581 } else if (Context.isNameSpace()) {
582 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
583 ContextDIE->addChild(Die);
584 } else if (Context.isSubprogram()) {
Devang Pateldbc64af2011-08-15 17:24:54 +0000585 DIE *ContextDIE = getOrCreateSubprogramDIE(DISubprogram(Context));
Devang Patel161b2f42011-04-12 23:21:44 +0000586 ContextDIE->addChild(Die);
587 } else if (DIE *ContextDIE = getDIE(Context))
588 ContextDIE->addChild(Die);
589 else
590 addDie(Die);
591}
592
593/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
594/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000595DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
596 DIType Ty(TyNode);
597 if (!Ty.Verify())
598 return NULL;
Devang Patel161b2f42011-04-12 23:21:44 +0000599 DIE *TyDIE = getDIE(Ty);
600 if (TyDIE)
601 return TyDIE;
602
603 // Create new type.
604 TyDIE = new DIE(dwarf::DW_TAG_base_type);
605 insertDIE(Ty, TyDIE);
606 if (Ty.isBasicType())
607 constructTypeDIE(*TyDIE, DIBasicType(Ty));
608 else if (Ty.isCompositeType())
609 constructTypeDIE(*TyDIE, DICompositeType(Ty));
610 else {
611 assert(Ty.isDerivedType() && "Unknown kind of DIType");
612 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
613 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000614 // If this is a named finished type then include it in the list of types
615 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000616 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
617 bool IsImplementation = 0;
618 if (Ty.isCompositeType()) {
619 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000620 // A runtime language of 0 actually means C/C++ and that any
621 // non-negative value is some version of Objective-C/C++.
Eric Christopherc36145f2012-01-06 04:35:23 +0000622 IsImplementation = (CT.getRunTimeLang() == 0) ||
Eric Christophere2dc9332012-02-22 08:46:02 +0000623 CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000624 }
Eric Christophere0167892012-01-06 23:03:37 +0000625 unsigned Flags = IsImplementation ?
626 DwarfAccelTable::eTypeFlagClassIsImplementation : 0;
627 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000628 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000629
Devang Patel161b2f42011-04-12 23:21:44 +0000630 addToContextOwner(TyDIE, Ty.getContext());
631 return TyDIE;
632}
633
634/// addType - Add a new type attribute to the specified entity.
Eric Christopher4d069bf2012-05-22 18:45:24 +0000635void CompileUnit::addType(DIE *Entity, DIType Ty, unsigned Attribute) {
Devang Patel161b2f42011-04-12 23:21:44 +0000636 if (!Ty.Verify())
637 return;
638
639 // Check for pre-existence.
640 DIEEntry *Entry = getDIEEntry(Ty);
641 // If it exists then use the existing value.
642 if (Entry) {
Eric Christopher663e0cf2012-03-28 07:34:31 +0000643 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000644 return;
645 }
646
647 // Construct type.
648 DIE *Buffer = getOrCreateTypeDIE(Ty);
649
650 // Set up proxy.
651 Entry = createDIEEntry(Buffer);
652 insertDIEEntry(Ty, Entry);
Eric Christopher663e0cf2012-03-28 07:34:31 +0000653 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000654
655 // If this is a complete composite type then include it in the
656 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000657 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000658}
659
660/// addGlobalType - Add a new global type to the compile unit.
661///
Devang Patelc20bdf12011-06-01 00:23:24 +0000662void CompileUnit::addGlobalType(DIType Ty) {
Devang Patele9ae06c2011-05-31 22:56:51 +0000663 DIDescriptor Context = Ty.getContext();
664 if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
Devang Patel94c7ddb2011-08-16 22:09:43 +0000665 && (!Context || Context.isCompileUnit() || Context.isFile()
666 || Context.isNameSpace()))
Devang Patelc20bdf12011-06-01 00:23:24 +0000667 if (DIEEntry *Entry = getDIEEntry(Ty))
668 GlobalTypes[Ty.getName()] = Entry->getEntry();
Devang Patel161b2f42011-04-12 23:21:44 +0000669}
670
Devang Patel31c5d052011-05-06 16:57:54 +0000671/// addPubTypes - Add type for pubtypes section.
672void CompileUnit::addPubTypes(DISubprogram SP) {
673 DICompositeType SPTy = SP.getType();
674 unsigned SPTag = SPTy.getTag();
675 if (SPTag != dwarf::DW_TAG_subroutine_type)
676 return;
677
678 DIArray Args = SPTy.getTypeArray();
679 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
680 DIType ATy(Args.getElement(i));
681 if (!ATy.Verify())
682 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +0000683 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +0000684 }
685}
686
Devang Patel161b2f42011-04-12 23:21:44 +0000687/// constructTypeDIE - Construct basic type die from DIBasicType.
688void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
689 // Get core information.
690 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000691 // Add name if not anonymous or intermediate type.
692 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000693 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +0000694
695 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
696 Buffer.setTag(dwarf::DW_TAG_unspecified_type);
697 // Unspecified types has only name, nothing else.
698 return;
699 }
700
701 Buffer.setTag(dwarf::DW_TAG_base_type);
Nick Lewycky746cb672011-10-26 22:55:33 +0000702 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +0000703 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +0000704
Devang Patel161b2f42011-04-12 23:21:44 +0000705 uint64_t Size = BTy.getSizeInBits() >> 3;
706 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
707}
708
709/// constructTypeDIE - Construct derived type die from DIDerivedType.
710void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
711 // Get core information.
712 StringRef Name = DTy.getName();
713 uint64_t Size = DTy.getSizeInBits() >> 3;
714 unsigned Tag = DTy.getTag();
715
716 // FIXME - Workaround for templates.
717 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
718
719 Buffer.setTag(Tag);
720
721 // Map to main type, void will not have a type.
722 DIType FromTy = DTy.getTypeDerivedFrom();
723 addType(&Buffer, FromTy);
724
725 // Add name if not anonymous or intermediate type.
726 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000727 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +0000728
729 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +0000730 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel161b2f42011-04-12 23:21:44 +0000731 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
732
733 // Add source line info if available and TyDesc is not a forward declaration.
734 if (!DTy.isForwardDecl())
735 addSourceLine(&Buffer, DTy);
736}
737
738/// constructTypeDIE - Construct type DIE from DICompositeType.
739void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
740 // Get core information.
741 StringRef Name = CTy.getName();
742
743 uint64_t Size = CTy.getSizeInBits() >> 3;
744 unsigned Tag = CTy.getTag();
745 Buffer.setTag(Tag);
746
747 switch (Tag) {
748 case dwarf::DW_TAG_vector_type:
749 case dwarf::DW_TAG_array_type:
750 constructArrayTypeDIE(Buffer, &CTy);
751 break;
752 case dwarf::DW_TAG_enumeration_type: {
753 DIArray Elements = CTy.getTypeArray();
754
755 // Add enumerators to enumeration type.
756 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
757 DIE *ElemDie = NULL;
758 DIDescriptor Enum(Elements.getElement(i));
759 if (Enum.isEnumerator()) {
760 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
761 Buffer.addChild(ElemDie);
762 }
763 }
Eric Christopherbb0f6ea2012-05-23 00:09:20 +0000764 DIType DTy = CTy.getTypeDerivedFrom();
765 if (DTy.Verify()) {
766 addType(&Buffer, DTy);
767 addUInt(&Buffer, dwarf::DW_AT_enum_class, dwarf::DW_FORM_flag, 1);
768 }
Devang Patel161b2f42011-04-12 23:21:44 +0000769 }
770 break;
771 case dwarf::DW_TAG_subroutine_type: {
772 // Add return type.
773 DIArray Elements = CTy.getTypeArray();
774 DIDescriptor RTy = Elements.getElement(0);
775 addType(&Buffer, DIType(RTy));
776
777 bool isPrototyped = true;
778 // Add arguments.
779 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
780 DIDescriptor Ty = Elements.getElement(i);
781 if (Ty.isUnspecifiedParameter()) {
782 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
783 Buffer.addChild(Arg);
784 isPrototyped = false;
785 } else {
786 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
787 addType(Arg, DIType(Ty));
788 Buffer.addChild(Arg);
789 }
790 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +0000791 // Add prototype flag if we're dealing with a C language and the
792 // function has been prototyped.
793 if (isPrototyped &&
Eric Christopher4d069bf2012-05-22 18:45:24 +0000794 (Language == dwarf::DW_LANG_C89 ||
795 Language == dwarf::DW_LANG_C99 ||
796 Language == dwarf::DW_LANG_ObjC))
Devang Patel161b2f42011-04-12 23:21:44 +0000797 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
798 }
799 break;
800 case dwarf::DW_TAG_structure_type:
801 case dwarf::DW_TAG_union_type:
802 case dwarf::DW_TAG_class_type: {
803 // Add elements to structure type.
804 DIArray Elements = CTy.getTypeArray();
805
806 // A forward struct declared type may not have elements available.
807 unsigned N = Elements.getNumElements();
808 if (N == 0)
809 break;
810
811 // Add elements to structure type.
812 for (unsigned i = 0; i < N; ++i) {
813 DIDescriptor Element = Elements.getElement(i);
814 DIE *ElemDie = NULL;
815 if (Element.isSubprogram()) {
816 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +0000817 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +0000818 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +0000819 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000820 dwarf::DW_ACCESS_protected);
821 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +0000822 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000823 dwarf::DW_ACCESS_private);
824 else
Nick Lewycky13aaca52011-12-13 05:09:11 +0000825 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000826 dwarf::DW_ACCESS_public);
827 if (SP.isExplicit())
828 addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
829 }
830 else if (Element.isVariable()) {
831 DIVariable DV(Element);
832 ElemDie = new DIE(dwarf::DW_TAG_variable);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000833 addString(ElemDie, dwarf::DW_AT_name, DV.getName());
Devang Patel161b2f42011-04-12 23:21:44 +0000834 addType(ElemDie, DV.getType());
835 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
836 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
837 addSourceLine(ElemDie, DV);
Eric Christopher663e0cf2012-03-28 07:34:31 +0000838 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +0000839 DIDerivedType DDTy(Element);
840 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
841 ElemDie = new DIE(dwarf::DW_TAG_friend);
842 addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend);
843 } else
844 ElemDie = createMemberDIE(DIDerivedType(Element));
Eric Christopher663e0cf2012-03-28 07:34:31 +0000845 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +0000846 DIObjCProperty Property(Element);
847 ElemDie = new DIE(Property.getTag());
848 StringRef PropertyName = Property.getObjCPropertyName();
849 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +0000850 addType(ElemDie, Property.getType());
851 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +0000852 StringRef GetterName = Property.getObjCPropertyGetterName();
853 if (!GetterName.empty())
854 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
855 StringRef SetterName = Property.getObjCPropertySetterName();
856 if (!SetterName.empty())
857 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
858 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +0000859 if (Property.isReadOnlyObjCProperty())
860 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
861 if (Property.isReadWriteObjCProperty())
862 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
863 if (Property.isAssignObjCProperty())
864 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
865 if (Property.isRetainObjCProperty())
866 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
867 if (Property.isCopyObjCProperty())
868 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
869 if (Property.isNonAtomicObjCProperty())
870 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
871 if (PropertyAttributes)
872 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
873 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +0000874
Devang Patel30d409c2012-02-07 23:33:58 +0000875 DIEEntry *Entry = getDIEEntry(Element);
876 if (!Entry) {
877 Entry = createDIEEntry(ElemDie);
878 insertDIEEntry(Element, Entry);
879 }
Devang Patel9e11eb12012-02-04 01:30:32 +0000880 } else
Devang Patel161b2f42011-04-12 23:21:44 +0000881 continue;
882 Buffer.addChild(ElemDie);
883 }
884
885 if (CTy.isAppleBlockExtension())
886 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
887
Devang Patel161b2f42011-04-12 23:21:44 +0000888 DICompositeType ContainingType = CTy.getContainingType();
889 if (DIDescriptor(ContainingType).isCompositeType())
890 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
891 getOrCreateTypeDIE(DIType(ContainingType)));
892 else {
893 DIDescriptor Context = CTy.getContext();
894 addToContextOwner(&Buffer, Context);
895 }
896
Devang Patel201e6cd2011-05-12 21:29:42 +0000897 if (CTy.isObjcClassComplete())
898 addUInt(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type,
Devang Patelb11f80e2011-05-12 19:06:16 +0000899 dwarf::DW_FORM_flag, 1);
900
Eric Christopher1a8e8862011-12-16 23:42:42 +0000901 // Add template parameters to a class, structure or union types.
902 // FIXME: The support isn't in the metadata for this yet.
903 if (Tag == dwarf::DW_TAG_class_type ||
904 Tag == dwarf::DW_TAG_structure_type ||
905 Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +0000906 addTemplateParams(Buffer, CTy.getTemplateParams());
907
908 break;
909 }
910 default:
911 break;
912 }
913
914 // Add name if not anonymous or intermediate type.
915 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000916 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +0000917
Eric Christopher4a5d8392012-05-22 18:45:18 +0000918 if (Tag == dwarf::DW_TAG_enumeration_type ||
919 Tag == dwarf::DW_TAG_class_type ||
920 Tag == dwarf::DW_TAG_structure_type ||
921 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +0000922 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +0000923 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +0000924 if (Size)
925 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +0000926 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +0000927 // Add zero size if it is not a forward declaration.
Eric Christopherfc4199b2012-06-01 00:22:32 +0000928 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
929
930 // If we're a forward decl, say so.
931 if (CTy.isForwardDecl())
932 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Devang Patel161b2f42011-04-12 23:21:44 +0000933
934 // Add source line info if available.
935 if (!CTy.isForwardDecl())
936 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +0000937
938 // No harm in adding the runtime language to the declaration.
939 unsigned RLang = CTy.getRunTimeLang();
940 if (RLang)
941 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
942 dwarf::DW_FORM_data1, RLang);
Devang Patel161b2f42011-04-12 23:21:44 +0000943 }
944}
945
946/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
947/// for the given DITemplateTypeParameter.
948DIE *
949CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
950 DIE *ParamDIE = getDIE(TP);
951 if (ParamDIE)
952 return ParamDIE;
953
954 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
955 addType(ParamDIE, TP.getType());
Nick Lewycky390c40d2011-10-27 06:44:11 +0000956 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +0000957 return ParamDIE;
958}
959
960/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
961/// for the given DITemplateValueParameter.
962DIE *
Eric Christopher4d069bf2012-05-22 18:45:24 +0000963CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV){
Devang Patel161b2f42011-04-12 23:21:44 +0000964 DIE *ParamDIE = getDIE(TPV);
965 if (ParamDIE)
966 return ParamDIE;
967
968 ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
969 addType(ParamDIE, TPV.getType());
970 if (!TPV.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000971 addString(ParamDIE, dwarf::DW_AT_name, TPV.getName());
Devang Patel161b2f42011-04-12 23:21:44 +0000972 addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
973 TPV.getValue());
974 return ParamDIE;
975}
976
Devang Patel31c5d052011-05-06 16:57:54 +0000977/// getOrCreateNameSpace - Create a DIE for DINameSpace.
978DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
979 DIE *NDie = getDIE(NS);
980 if (NDie)
981 return NDie;
982 NDie = new DIE(dwarf::DW_TAG_namespace);
983 insertDIE(NS, NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +0000984 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +0000985 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +0000986 addAccelNamespace(NS.getName(), NDie);
987 } else
988 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +0000989 addSourceLine(NDie, NS);
990 addToContextOwner(NDie, NS.getContext());
991 return NDie;
992}
993
Devang Pateldbc64af2011-08-15 17:24:54 +0000994/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
995/// printer to not emit usual symbol prefix before the symbol name is used then
996/// return linkage name after skipping this special LLVM prefix.
997static StringRef getRealLinkageName(StringRef LinkageName) {
998 char One = '\1';
999 if (LinkageName.startswith(StringRef(&One, 1)))
1000 return LinkageName.substr(1);
1001 return LinkageName;
1002}
1003
1004/// getOrCreateSubprogramDIE - Create new DIE using SP.
1005DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
1006 DIE *SPDie = getDIE(SP);
1007 if (SPDie)
1008 return SPDie;
1009
Peter Collingbourne27302f02012-05-27 18:36:44 +00001010 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1011
1012 // DW_TAG_inlined_subroutine may refer to this DIE.
1013 insertDIE(SP, SPDie);
1014
Rafael Espindola01b55b42011-11-10 22:34:29 +00001015 DISubprogram SPDecl = SP.getFunctionDeclaration();
1016 DIE *DeclDie = NULL;
1017 if (SPDecl.isSubprogram()) {
1018 DeclDie = getOrCreateSubprogramDIE(SPDecl);
1019 }
1020
Devang Pateldbc64af2011-08-15 17:24:54 +00001021 // Add to context owner.
1022 addToContextOwner(SPDie, SP.getContext());
1023
1024 // Add function template parameters.
1025 addTemplateParams(*SPDie, SP.getTemplateParams());
1026
Eric Christophere9722e12012-04-16 23:54:23 +00001027 // Unfortunately this code needs to stay here instead of below the
1028 // AT_specification code in order to work around a bug in older
1029 // gdbs that requires the linkage name to resolve multiple template
1030 // functions.
Eric Christophercbbd5b12012-08-23 22:52:55 +00001031 // TODO: Remove this set of code when we get rid of the old gdb
1032 // compatibility.
Eric Christopher8d101c32012-03-15 08:19:33 +00001033 StringRef LinkageName = SP.getLinkageName();
Eric Christophercbbd5b12012-08-23 22:52:55 +00001034 if (!LinkageName.empty() && DD->useDarwinGDBCompat())
Eric Christopher8d101c32012-03-15 08:19:33 +00001035 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
1036 getRealLinkageName(LinkageName));
1037
Devang Pateldbc64af2011-08-15 17:24:54 +00001038 // If this DIE is going to refer declaration info using AT_specification
1039 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001040 if (DeclDie) {
1041 // Refer function declaration directly.
1042 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1043 DeclDie);
1044
Devang Pateldbc64af2011-08-15 17:24:54 +00001045 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001046 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001047
Eric Christophercbbd5b12012-08-23 22:52:55 +00001048 // Add the linkage name if we have one.
1049 if (!LinkageName.empty() && !DD->useDarwinGDBCompat())
1050 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
1051 getRealLinkageName(LinkageName));
1052
Devang Pateldbc64af2011-08-15 17:24:54 +00001053 // Constructors and operators for anonymous aggregates do not have names.
1054 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001055 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001056
1057 addSourceLine(SPDie, SP);
1058
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001059 // Add the prototype if we have a prototype and we have a C like
1060 // language.
1061 if (SP.isPrototyped() &&
1062 (Language == dwarf::DW_LANG_C89 ||
1063 Language == dwarf::DW_LANG_C99 ||
1064 Language == dwarf::DW_LANG_ObjC))
Devang Pateldbc64af2011-08-15 17:24:54 +00001065 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1066
1067 // Add Return Type.
1068 DICompositeType SPTy = SP.getType();
1069 DIArray Args = SPTy.getTypeArray();
1070 unsigned SPTag = SPTy.getTag();
1071
1072 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1073 addType(SPDie, SPTy);
1074 else
1075 addType(SPDie, DIType(Args.getElement(0)));
1076
1077 unsigned VK = SP.getVirtuality();
1078 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001079 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001080 DIEBlock *Block = getDIEBlock();
1081 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1082 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1083 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1084 ContainingTypeMap.insert(std::make_pair(SPDie,
1085 SP.getContainingType()));
1086 }
1087
1088 if (!SP.isDefinition()) {
1089 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1090
1091 // Add arguments. Do not add arguments for subprogram definition. They will
1092 // be handled while processing variables.
1093 DICompositeType SPTy = SP.getType();
1094 DIArray Args = SPTy.getTypeArray();
1095 unsigned SPTag = SPTy.getTag();
1096
1097 if (SPTag == dwarf::DW_TAG_subroutine_type)
1098 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1099 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1100 DIType ATy = DIType(DIType(Args.getElement(i)));
1101 addType(Arg, ATy);
1102 if (ATy.isArtificial())
1103 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1104 SPDie->addChild(Arg);
1105 }
1106 }
1107
1108 if (SP.isArtificial())
1109 addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1110
1111 if (!SP.isLocalToUnit())
1112 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1113
1114 if (SP.isOptimized())
1115 addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1116
1117 if (unsigned isa = Asm->getISAEncoding()) {
1118 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1119 }
1120
1121 return SPDie;
1122}
1123
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001124// Return const expression if value is a GEP to access merged global
1125// constant. e.g.
1126// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1127static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1128 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1129 if (!CE || CE->getNumOperands() != 3 ||
1130 CE->getOpcode() != Instruction::GetElementPtr)
1131 return NULL;
1132
1133 // First operand points to a global struct.
1134 Value *Ptr = CE->getOperand(0);
1135 if (!isa<GlobalValue>(Ptr) ||
1136 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1137 return NULL;
1138
1139 // Second operand is zero.
1140 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1141 if (!CI || !CI->isZero())
1142 return NULL;
1143
1144 // Third operand is offset.
1145 if (!isa<ConstantInt>(CE->getOperand(2)))
1146 return NULL;
1147
1148 return CE;
1149}
1150
1151/// createGlobalVariableDIE - create global variable DIE.
1152void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001153 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001154 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001155 return;
1156
Devang Patel49e2f032011-08-18 22:21:50 +00001157 DIGlobalVariable GV(N);
Devang Patel28bea082011-08-18 23:17:55 +00001158 if (!GV.Verify())
1159 return;
1160
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001161 DIE *VariableDIE = new DIE(GV.getTag());
Devang Patel49e2f032011-08-18 22:21:50 +00001162 // Add to map.
1163 insertDIE(N, VariableDIE);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001164
1165 // Add name.
Nick Lewycky390c40d2011-10-27 06:44:11 +00001166 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001167 StringRef LinkageName = GV.getLinkageName();
Devang Patel49e2f032011-08-18 22:21:50 +00001168 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001169 if (!LinkageName.empty() && isGlobalVariable)
Nick Lewycky746cb672011-10-26 22:55:33 +00001170 addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Nick Lewycky390c40d2011-10-27 06:44:11 +00001171 getRealLinkageName(LinkageName));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001172 // Add type.
Devang Patel49e2f032011-08-18 22:21:50 +00001173 DIType GTy = GV.getType();
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001174 addType(VariableDIE, GTy);
1175
1176 // Add scoping info.
Eric Christopherdfa30e12011-11-09 05:24:07 +00001177 if (!GV.isLocalToUnit())
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001178 addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Eric Christopherdfa30e12011-11-09 05:24:07 +00001179
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001180 // Add line number info.
1181 addSourceLine(VariableDIE, GV);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001182 // Add to context owner.
1183 DIDescriptor GVContext = GV.getContext();
1184 addToContextOwner(VariableDIE, GVContext);
1185 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001186 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001187 DIE *VariableSpecDIE = NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001188 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001189 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001190 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1191 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1192 addLabel(Block, 0, dwarf::DW_FORM_udata,
1193 Asm->Mang->getSymbol(GV.getGlobal()));
1194 // Do not create specification DIE if context is either compile unit
1195 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001196 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001197 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1198 // Create specification DIE.
Eric Christopherd117fbb2011-11-11 01:55:22 +00001199 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001200 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1201 dwarf::DW_FORM_ref4, VariableDIE);
1202 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1203 addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag,
1204 1);
1205 addDie(VariableSpecDIE);
1206 } else {
1207 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001208 }
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001209 } else if (const ConstantInt *CI =
1210 dyn_cast_or_null<ConstantInt>(GV.getConstant()))
1211 addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
1212 else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001213 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001214 // GV is a merged global.
1215 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1216 Value *Ptr = CE->getOperand(0);
1217 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1218 addLabel(Block, 0, dwarf::DW_FORM_udata,
1219 Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
1220 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1221 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
1222 addUInt(Block, 0, dwarf::DW_FORM_udata,
1223 Asm->getTargetData().getIndexedOffset(Ptr->getType(), Idx));
1224 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1225 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1226 }
1227
Eric Christopherd117fbb2011-11-11 01:55:22 +00001228 if (addToAccelTable) {
1229 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1230 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001231
Eric Christopherd117fbb2011-11-11 01:55:22 +00001232 // If the linkage name is different than the name, go ahead and output
1233 // that as well into the name table.
1234 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1235 addAccelName(GV.getLinkageName(), AddrDIE);
1236 }
Eric Christopher74d8a872011-11-08 21:56:23 +00001237
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001238 return;
1239}
1240
Devang Patel161b2f42011-04-12 23:21:44 +00001241/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001242void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1243 DIE *IndexTy) {
Devang Patel161b2f42011-04-12 23:21:44 +00001244 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1245 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patelce35d8b2011-11-17 23:43:15 +00001246 uint64_t L = SR.getLo();
1247 uint64_t H = SR.getHi();
Devang Patel161b2f42011-04-12 23:21:44 +00001248
1249 // The L value defines the lower bounds which is typically zero for C/C++. The
1250 // H value is the upper bounds. Values are 64 bit. H - L + 1 is the size
1251 // of the array. If L > H then do not emit DW_AT_lower_bound and
1252 // DW_AT_upper_bound attributes. If L is zero and H is also zero then the
1253 // array has one element and in such case do not emit lower bound.
1254
1255 if (L > H) {
1256 Buffer.addChild(DW_Subrange);
1257 return;
1258 }
1259 if (L)
Devang Patelce35d8b2011-11-17 23:43:15 +00001260 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1261 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
Devang Patel161b2f42011-04-12 23:21:44 +00001262 Buffer.addChild(DW_Subrange);
1263}
1264
1265/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1266void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1267 DICompositeType *CTy) {
1268 Buffer.setTag(dwarf::DW_TAG_array_type);
1269 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1270 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1271
1272 // Emit derived type.
1273 addType(&Buffer, CTy->getTypeDerivedFrom());
1274 DIArray Elements = CTy->getTypeArray();
1275
1276 // Get an anonymous type for index type.
1277 DIE *IdxTy = getIndexTyDie();
1278 if (!IdxTy) {
1279 // Construct an anonymous type for index type.
1280 IdxTy = new DIE(dwarf::DW_TAG_base_type);
1281 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1282 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1283 dwarf::DW_ATE_signed);
1284 addDie(IdxTy);
1285 setIndexTyDie(IdxTy);
1286 }
1287
1288 // Add subranges to array type.
1289 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1290 DIDescriptor Element = Elements.getElement(i);
1291 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1292 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1293 }
1294}
1295
1296/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1297DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1298 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1299 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001300 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001301 int64_t Value = ETy.getEnumValue();
1302 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1303 return Enumerator;
1304}
1305
Devang Pateldbc64af2011-08-15 17:24:54 +00001306/// constructContainingTypeDIEs - Construct DIEs for types that contain
1307/// vtables.
1308void CompileUnit::constructContainingTypeDIEs() {
1309 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1310 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1311 DIE *SPDie = CI->first;
1312 const MDNode *N = CI->second;
1313 if (!N) continue;
1314 DIE *NDie = getDIE(N);
1315 if (!NDie) continue;
1316 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1317 }
1318}
1319
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001320/// constructVariableDIE - Construct a DIE for the given DbgVariable.
1321DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
1322 StringRef Name = DV->getName();
1323 if (Name.empty())
1324 return NULL;
1325
1326 // Translate tag to proper Dwarf tag.
1327 unsigned Tag = DV->getTag();
1328
1329 // Define variable debug information entry.
1330 DIE *VariableDie = new DIE(Tag);
1331 DbgVariable *AbsVar = DV->getAbstractVariable();
1332 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
1333 if (AbsDIE)
1334 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1335 dwarf::DW_FORM_ref4, AbsDIE);
1336 else {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001337 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001338 addSourceLine(VariableDie, DV->getVariable());
1339 addType(VariableDie, DV->getType());
1340 }
1341
1342 if (DV->isArtificial())
1343 addUInt(VariableDie, dwarf::DW_AT_artificial,
1344 dwarf::DW_FORM_flag, 1);
1345
1346 if (isScopeAbstract) {
1347 DV->setDIE(VariableDie);
1348 return VariableDie;
1349 }
1350
1351 // Add variable address.
1352
1353 unsigned Offset = DV->getDotDebugLocOffset();
1354 if (Offset != ~0U) {
1355 addLabel(VariableDie, dwarf::DW_AT_location,
1356 dwarf::DW_FORM_data4,
1357 Asm->GetTempSymbol("debug_loc", Offset));
1358 DV->setDIE(VariableDie);
1359 return VariableDie;
1360 }
1361
Eric Christopher8cf5e742011-10-03 15:49:20 +00001362 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001363 if (const MachineInstr *DVInsn = DV->getMInsn()) {
1364 bool updated = false;
1365 if (DVInsn->getNumOperands() == 3) {
1366 if (DVInsn->getOperand(0).isReg()) {
1367 const MachineOperand RegOp = DVInsn->getOperand(0);
1368 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1369 if (DVInsn->getOperand(1).isImm() &&
1370 TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
1371 unsigned FrameReg = 0;
1372 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
1373 int Offset =
1374 TFI->getFrameIndexReference(*Asm->MF,
1375 DVInsn->getOperand(1).getImm(),
1376 FrameReg);
1377 MachineLocation Location(FrameReg, Offset);
1378 addVariableAddress(DV, VariableDie, Location);
1379
1380 } else if (RegOp.getReg())
1381 addVariableAddress(DV, VariableDie,
1382 MachineLocation(RegOp.getReg()));
1383 updated = true;
1384 }
1385 else if (DVInsn->getOperand(0).isImm())
1386 updated =
1387 addConstantValue(VariableDie, DVInsn->getOperand(0),
1388 DV->getType());
1389 else if (DVInsn->getOperand(0).isFPImm())
1390 updated =
1391 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
1392 else if (DVInsn->getOperand(0).isCImm())
1393 updated =
1394 addConstantValue(VariableDie,
1395 DVInsn->getOperand(0).getCImm(),
1396 DV->getType().isUnsignedDIType());
1397 } else {
1398 addVariableAddress(DV, VariableDie,
1399 Asm->getDebugValueLocation(DVInsn));
1400 updated = true;
1401 }
1402 if (!updated) {
1403 // If variableDie is not updated then DBG_VALUE instruction does not
1404 // have valid variable info.
1405 delete VariableDie;
1406 return NULL;
1407 }
1408 DV->setDIE(VariableDie);
1409 return VariableDie;
1410 } else {
1411 // .. else use frame index.
1412 int FI = DV->getFrameIndex();
1413 if (FI != ~0) {
1414 unsigned FrameReg = 0;
1415 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
1416 int Offset =
1417 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1418 MachineLocation Location(FrameReg, Offset);
1419 addVariableAddress(DV, VariableDie, Location);
1420 }
1421 }
1422
1423 DV->setDIE(VariableDie);
1424 return VariableDie;
1425}
1426
Devang Patel161b2f42011-04-12 23:21:44 +00001427/// createMemberDIE - Create new member DIE.
1428DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1429 DIE *MemberDie = new DIE(DT.getTag());
1430 StringRef Name = DT.getName();
1431 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001432 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001433
1434 addType(MemberDie, DT.getTypeDerivedFrom());
1435
1436 addSourceLine(MemberDie, DT);
1437
1438 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1439 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1440
1441 uint64_t Size = DT.getSizeInBits();
1442 uint64_t FieldSize = DT.getOriginalTypeSize();
1443
1444 if (Size != FieldSize) {
1445 // Handle bitfield.
1446 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1447 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1448
1449 uint64_t Offset = DT.getOffsetInBits();
1450 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1451 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1452 uint64_t FieldOffset = (HiMark - FieldSize);
1453 Offset -= FieldOffset;
1454
1455 // Maybe we need to work from the other end.
1456 if (Asm->getTargetData().isLittleEndian())
1457 Offset = FieldSize - (Offset + Size);
1458 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1459
1460 // Here WD_AT_data_member_location points to the anonymous
1461 // field that includes this bit field.
1462 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1463
1464 } else
1465 // This is not a bitfield.
1466 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1467
1468 if (DT.getTag() == dwarf::DW_TAG_inheritance
1469 && DT.isVirtual()) {
1470
1471 // For C++, virtual base classes are not at fixed offset. Use following
1472 // expression to extract appropriate offset from vtable.
1473 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1474
1475 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1476 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1477 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1478 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1479 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1480 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1481 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1482 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1483
1484 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1485 VBaseLocationDie);
1486 } else
1487 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1488
1489 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001490 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001491 dwarf::DW_ACCESS_protected);
1492 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001493 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001494 dwarf::DW_ACCESS_private);
1495 // Otherwise C++ member and base classes are considered public.
Devang Patel94c7ddb2011-08-16 22:09:43 +00001496 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001497 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001498 dwarf::DW_ACCESS_public);
1499 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001500 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001501 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001502
1503 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001504 if (MDNode *PNode = DT.getObjCProperty())
1505 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
1506 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
1507 PropertyDie);
1508
Devang Patel9e11eb12012-02-04 01:30:32 +00001509 // This is only for backward compatibility.
Devang Patele9db5e22011-04-16 00:11:51 +00001510 StringRef PropertyName = DT.getObjCPropertyName();
1511 if (!PropertyName.empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001512 addString(MemberDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Devang Patele9db5e22011-04-16 00:11:51 +00001513 StringRef GetterName = DT.getObjCPropertyGetterName();
1514 if (!GetterName.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001515 addString(MemberDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
Devang Patele9db5e22011-04-16 00:11:51 +00001516 StringRef SetterName = DT.getObjCPropertySetterName();
1517 if (!SetterName.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001518 addString(MemberDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
Devang Patele9db5e22011-04-16 00:11:51 +00001519 unsigned PropertyAttributes = 0;
1520 if (DT.isReadOnlyObjCProperty())
1521 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1522 if (DT.isReadWriteObjCProperty())
1523 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1524 if (DT.isAssignObjCProperty())
1525 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1526 if (DT.isRetainObjCProperty())
1527 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1528 if (DT.isCopyObjCProperty())
1529 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1530 if (DT.isNonAtomicObjCProperty())
1531 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1532 if (PropertyAttributes)
1533 addUInt(MemberDie, dwarf::DW_AT_APPLE_property_attribute, 0,
1534 PropertyAttributes);
1535 }
Devang Patel161b2f42011-04-12 23:21:44 +00001536 return MemberDie;
1537}