blob: cc5b6424d73c59eaa8a7ab7ec08350b843a892fa [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//
10// This file contains support for writing dwarf compile unit.
11//
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"
Devang Patel6f9d8ff2011-08-15 17:57:41 +000020#include "llvm/GlobalVariable.h"
21#include "llvm/Instructions.h"
Devang Patel161b2f42011-04-12 23:21:44 +000022#include "llvm/Analysis/DIBuilder.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,
36 DwarfDebug *DW)
37 : 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(),
201 File.getDirectory());
202 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) {
311 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
312 } else llvm_unreachable("unknown DIBuilder Opcode");
313 }
314
315 // Now attach the location information to the DIE.
316 addBlock(Die, Attribute, 0, Block);
317}
318
319/* Byref variables, in Blocks, are declared by the programmer as "SomeType
320 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
321 gives the variable VarName either the struct, or a pointer to the struct, as
322 its type. This is necessary for various behind-the-scenes things the
323 compiler needs to do with by-reference variables in Blocks.
324
325 However, as far as the original *programmer* is concerned, the variable
326 should still have type 'SomeType', as originally declared.
327
328 The function getBlockByrefType dives into the __Block_byref_x_VarName
329 struct to find the original type of the variable, which is then assigned to
330 the variable's Debug Information Entry as its real type. So far, so good.
331 However now the debugger will expect the variable VarName to have the type
332 SomeType. So we need the location attribute for the variable to be an
333 expression that explains to the debugger how to navigate through the
334 pointers and struct to find the actual variable of type SomeType.
335
336 The following function does just that. We start by getting
337 the "normal" location for the variable. This will be the location
338 of either the struct __Block_byref_x_VarName or the pointer to the
339 struct __Block_byref_x_VarName.
340
341 The struct will look something like:
342
343 struct __Block_byref_x_VarName {
344 ... <various fields>
345 struct __Block_byref_x_VarName *forwarding;
346 ... <various other fields>
347 SomeType VarName;
348 ... <maybe more fields>
349 };
350
351 If we are given the struct directly (as our starting point) we
352 need to tell the debugger to:
353
354 1). Add the offset of the forwarding field.
355
356 2). Follow that pointer to get the real __Block_byref_x_VarName
357 struct to use (the real one may have been copied onto the heap).
358
359 3). Add the offset for the field VarName, to find the actual variable.
360
361 If we started with a pointer to the struct, then we need to
362 dereference that pointer first, before the other steps.
363 Translating this into DWARF ops, we will need to append the following
364 to the current location description for the variable:
365
366 DW_OP_deref -- optional, if we start with a pointer
367 DW_OP_plus_uconst <forward_fld_offset>
368 DW_OP_deref
369 DW_OP_plus_uconst <varName_fld_offset>
370
371 That is what this function does. */
372
373/// addBlockByrefAddress - Start with the address based on the location
374/// provided, and generate the DWARF information necessary to find the
375/// actual Block variable (navigating the Block struct) based on the
376/// starting location. Add the DWARF information to the die. For
377/// more information, read large comment just above here.
378///
379void CompileUnit::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
380 unsigned Attribute,
381 const MachineLocation &Location) {
382 DIType Ty = DV->getType();
383 DIType TmpTy = Ty;
384 unsigned Tag = Ty.getTag();
385 bool isPointer = false;
386
387 StringRef varName = DV->getName();
388
389 if (Tag == dwarf::DW_TAG_pointer_type) {
390 DIDerivedType DTy = DIDerivedType(Ty);
391 TmpTy = DTy.getTypeDerivedFrom();
392 isPointer = true;
393 }
394
395 DICompositeType blockStruct = DICompositeType(TmpTy);
396
397 // Find the __forwarding field and the variable field in the __Block_byref
398 // struct.
399 DIArray Fields = blockStruct.getTypeArray();
400 DIDescriptor varField = DIDescriptor();
401 DIDescriptor forwardingField = DIDescriptor();
402
403 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
404 DIDescriptor Element = Fields.getElement(i);
405 DIDerivedType DT = DIDerivedType(Element);
406 StringRef fieldName = DT.getName();
407 if (fieldName == "__forwarding")
408 forwardingField = Element;
409 else if (fieldName == varName)
410 varField = Element;
411 }
412
413 // Get the offsets for the forwarding field and the variable field.
414 unsigned forwardingFieldOffset =
415 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
416 unsigned varFieldOffset =
417 DIDerivedType(varField).getOffsetInBits() >> 3;
418
419 // Decode the original location, and use that as the start of the byref
420 // variable's location.
421 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
422 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
423 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
424
425 if (Location.isReg()) {
426 if (Reg < 32)
427 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
428 else {
429 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
430 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
431 }
432 } else {
433 if (Reg < 32)
434 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
435 else {
436 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
437 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
438 }
439
440 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
441 }
442
443 // If we started with a pointer to the __Block_byref... struct, then
444 // the first thing we need to do is dereference the pointer (DW_OP_deref).
445 if (isPointer)
446 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
447
448 // Next add the offset for the '__forwarding' field:
449 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
450 // adding the offset if it's 0.
451 if (forwardingFieldOffset > 0) {
452 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
453 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
454 }
455
456 // Now dereference the __forwarding field to get to the real __Block_byref
457 // struct: DW_OP_deref.
458 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
459
460 // Now that we've got the real __Block_byref... struct, add the offset
461 // for the variable's field to get to the location of the actual variable:
462 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
463 if (varFieldOffset > 0) {
464 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
465 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
466 }
467
468 // Now attach the location information to the DIE.
469 addBlock(Die, Attribute, 0, Block);
470}
471
Devang Patel4ec14b02011-07-20 21:57:04 +0000472/// isTypeSigned - Return true if the type is signed.
473static bool isTypeSigned(DIType Ty, int *SizeInBits) {
474 if (Ty.isDerivedType())
475 return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
476 if (Ty.isBasicType())
477 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
478 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
479 *SizeInBits = Ty.getSizeInBits();
480 return true;
481 }
482 return false;
483}
484
Devang Patel161b2f42011-04-12 23:21:44 +0000485/// addConstantValue - Add constant value entry in variable DIE.
Devang Patelb58128e2011-05-27 16:45:18 +0000486bool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
487 DIType Ty) {
Nick Lewycky746cb672011-10-26 22:55:33 +0000488 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000489 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patel4ec14b02011-07-20 21:57:04 +0000490 int SizeInBits = -1;
491 bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
492 unsigned Form = SignedConstant ? dwarf::DW_FORM_sdata : dwarf::DW_FORM_udata;
493 switch (SizeInBits) {
494 case 8: Form = dwarf::DW_FORM_data1; break;
495 case 16: Form = dwarf::DW_FORM_data2; break;
496 case 32: Form = dwarf::DW_FORM_data4; break;
497 case 64: Form = dwarf::DW_FORM_data8; break;
Devang Patel045c1d42011-05-27 19:13:26 +0000498 default: break;
499 }
Devang Patel4ec14b02011-07-20 21:57:04 +0000500 SignedConstant ? addSInt(Block, 0, Form, MO.getImm())
501 : addUInt(Block, 0, Form, MO.getImm());
Devang Patel72f0d9c2011-05-27 18:15:52 +0000502
Devang Patel161b2f42011-04-12 23:21:44 +0000503 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
504 return true;
505}
506
507/// addConstantFPValue - Add constant value entry in variable DIE.
508bool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Nick Lewycky390c40d2011-10-27 06:44:11 +0000509 assert (MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000510 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
511 APFloat FPImm = MO.getFPImm()->getValueAPF();
512
513 // Get the raw data form of the floating point.
514 const APInt FltVal = FPImm.bitcastToAPInt();
515 const char *FltPtr = (const char*)FltVal.getRawData();
516
517 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
518 bool LittleEndian = Asm->getTargetData().isLittleEndian();
519 int Incr = (LittleEndian ? 1 : -1);
520 int Start = (LittleEndian ? 0 : NumBytes - 1);
521 int Stop = (LittleEndian ? NumBytes : -1);
522
523 // Output the constant to DWARF one byte at a time.
524 for (; Start != Stop; Start += Incr)
525 addUInt(Block, 0, dwarf::DW_FORM_data1,
526 (unsigned char)0xFF & FltPtr[Start]);
527
528 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
529 return true;
530}
531
532/// addConstantValue - Add constant value entry in variable DIE.
Devang Patel8594d422011-06-24 20:46:11 +0000533bool CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000534 bool Unsigned) {
Devang Pateld6a81362011-05-28 00:39:18 +0000535 unsigned CIBitWidth = CI->getBitWidth();
536 if (CIBitWidth <= 64) {
537 unsigned form = 0;
538 switch (CIBitWidth) {
539 case 8: form = dwarf::DW_FORM_data1; break;
540 case 16: form = dwarf::DW_FORM_data2; break;
541 case 32: form = dwarf::DW_FORM_data4; break;
542 case 64: form = dwarf::DW_FORM_data8; break;
543 default:
544 form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata;
545 }
Devang Patel161b2f42011-04-12 23:21:44 +0000546 if (Unsigned)
Devang Pateld6a81362011-05-28 00:39:18 +0000547 addUInt(Die, dwarf::DW_AT_const_value, form, CI->getZExtValue());
Devang Patel161b2f42011-04-12 23:21:44 +0000548 else
Devang Pateld6a81362011-05-28 00:39:18 +0000549 addSInt(Die, dwarf::DW_AT_const_value, form, CI->getSExtValue());
Devang Patel161b2f42011-04-12 23:21:44 +0000550 return true;
551 }
552
553 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
554
555 // Get the raw data form of the large APInt.
556 const APInt Val = CI->getValue();
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000557 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000558
559 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
560 bool LittleEndian = Asm->getTargetData().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000561
562 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000563 for (int i = 0; i < NumBytes; i++) {
564 uint8_t c;
565 if (LittleEndian)
566 c = Ptr64[i / 8] >> (8 * (i & 7));
567 else
568 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
569 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
570 }
Devang Patel161b2f42011-04-12 23:21:44 +0000571
572 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
573 return true;
574}
575
576/// addTemplateParams - Add template parameters in buffer.
577void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
578 // Add template parameters.
579 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
580 DIDescriptor Element = TParams.getElement(i);
581 if (Element.isTemplateTypeParameter())
582 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
583 DITemplateTypeParameter(Element)));
584 else if (Element.isTemplateValueParameter())
585 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
586 DITemplateValueParameter(Element)));
587 }
Devang Patel161b2f42011-04-12 23:21:44 +0000588}
Nick Lewycky746cb672011-10-26 22:55:33 +0000589
Devang Patel161b2f42011-04-12 23:21:44 +0000590/// addToContextOwner - Add Die into the list of its context owner's children.
591void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
592 if (Context.isType()) {
593 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
594 ContextDIE->addChild(Die);
595 } else if (Context.isNameSpace()) {
596 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
597 ContextDIE->addChild(Die);
598 } else if (Context.isSubprogram()) {
Devang Pateldbc64af2011-08-15 17:24:54 +0000599 DIE *ContextDIE = getOrCreateSubprogramDIE(DISubprogram(Context));
Devang Patel161b2f42011-04-12 23:21:44 +0000600 ContextDIE->addChild(Die);
601 } else if (DIE *ContextDIE = getDIE(Context))
602 ContextDIE->addChild(Die);
603 else
604 addDie(Die);
605}
606
607/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
608/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000609DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
610 DIType Ty(TyNode);
611 if (!Ty.Verify())
612 return NULL;
Devang Patel161b2f42011-04-12 23:21:44 +0000613 DIE *TyDIE = getDIE(Ty);
614 if (TyDIE)
615 return TyDIE;
616
617 // Create new type.
618 TyDIE = new DIE(dwarf::DW_TAG_base_type);
619 insertDIE(Ty, TyDIE);
620 if (Ty.isBasicType())
621 constructTypeDIE(*TyDIE, DIBasicType(Ty));
622 else if (Ty.isCompositeType())
623 constructTypeDIE(*TyDIE, DICompositeType(Ty));
624 else {
625 assert(Ty.isDerivedType() && "Unknown kind of DIType");
626 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
627 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000628 // If this is a named finished type then include it in the list of types
629 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000630 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
631 bool IsImplementation = 0;
632 if (Ty.isCompositeType()) {
633 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000634 // A runtime language of 0 actually means C/C++ and that any
635 // non-negative value is some version of Objective-C/C++.
Eric Christopherc36145f2012-01-06 04:35:23 +0000636 IsImplementation = (CT.getRunTimeLang() == 0) ||
Eric Christophere2dc9332012-02-22 08:46:02 +0000637 CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000638 }
Eric Christophere0167892012-01-06 23:03:37 +0000639 unsigned Flags = IsImplementation ?
640 DwarfAccelTable::eTypeFlagClassIsImplementation : 0;
641 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000642 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000643
Devang Patel161b2f42011-04-12 23:21:44 +0000644 addToContextOwner(TyDIE, Ty.getContext());
645 return TyDIE;
646}
647
648/// addType - Add a new type attribute to the specified entity.
Eric Christopher663e0cf2012-03-28 07:34:31 +0000649void CompileUnit::addType(DIE *Entity, DIType Ty,
650 unsigned Attribute) {
Devang Patel161b2f42011-04-12 23:21:44 +0000651 if (!Ty.Verify())
652 return;
653
654 // Check for pre-existence.
655 DIEEntry *Entry = getDIEEntry(Ty);
656 // If it exists then use the existing value.
657 if (Entry) {
Eric Christopher663e0cf2012-03-28 07:34:31 +0000658 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000659 return;
660 }
661
662 // Construct type.
663 DIE *Buffer = getOrCreateTypeDIE(Ty);
664
665 // Set up proxy.
666 Entry = createDIEEntry(Buffer);
667 insertDIEEntry(Ty, Entry);
Eric Christopher663e0cf2012-03-28 07:34:31 +0000668 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000669
670 // If this is a complete composite type then include it in the
671 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000672 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000673}
674
675/// addGlobalType - Add a new global type to the compile unit.
676///
Devang Patelc20bdf12011-06-01 00:23:24 +0000677void CompileUnit::addGlobalType(DIType Ty) {
Devang Patele9ae06c2011-05-31 22:56:51 +0000678 DIDescriptor Context = Ty.getContext();
679 if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
Devang Patel94c7ddb2011-08-16 22:09:43 +0000680 && (!Context || Context.isCompileUnit() || Context.isFile()
681 || Context.isNameSpace()))
Devang Patelc20bdf12011-06-01 00:23:24 +0000682 if (DIEEntry *Entry = getDIEEntry(Ty))
683 GlobalTypes[Ty.getName()] = Entry->getEntry();
Devang Patel161b2f42011-04-12 23:21:44 +0000684}
685
Devang Patel31c5d052011-05-06 16:57:54 +0000686/// addPubTypes - Add type for pubtypes section.
687void CompileUnit::addPubTypes(DISubprogram SP) {
688 DICompositeType SPTy = SP.getType();
689 unsigned SPTag = SPTy.getTag();
690 if (SPTag != dwarf::DW_TAG_subroutine_type)
691 return;
692
693 DIArray Args = SPTy.getTypeArray();
694 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
695 DIType ATy(Args.getElement(i));
696 if (!ATy.Verify())
697 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +0000698 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +0000699 }
700}
701
Devang Patel161b2f42011-04-12 23:21:44 +0000702/// constructTypeDIE - Construct basic type die from DIBasicType.
703void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
704 // Get core information.
705 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000706 // Add name if not anonymous or intermediate type.
707 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000708 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +0000709
710 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
711 Buffer.setTag(dwarf::DW_TAG_unspecified_type);
712 // Unspecified types has only name, nothing else.
713 return;
714 }
715
716 Buffer.setTag(dwarf::DW_TAG_base_type);
Nick Lewycky746cb672011-10-26 22:55:33 +0000717 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +0000718 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +0000719
Devang Patel161b2f42011-04-12 23:21:44 +0000720 uint64_t Size = BTy.getSizeInBits() >> 3;
721 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
722}
723
724/// constructTypeDIE - Construct derived type die from DIDerivedType.
725void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
726 // Get core information.
727 StringRef Name = DTy.getName();
728 uint64_t Size = DTy.getSizeInBits() >> 3;
729 unsigned Tag = DTy.getTag();
730
731 // FIXME - Workaround for templates.
732 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
733
734 Buffer.setTag(Tag);
735
736 // Map to main type, void will not have a type.
737 DIType FromTy = DTy.getTypeDerivedFrom();
738 addType(&Buffer, FromTy);
739
740 // Add name if not anonymous or intermediate type.
741 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000742 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +0000743
744 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +0000745 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel161b2f42011-04-12 23:21:44 +0000746 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
747
748 // Add source line info if available and TyDesc is not a forward declaration.
749 if (!DTy.isForwardDecl())
750 addSourceLine(&Buffer, DTy);
751}
752
753/// constructTypeDIE - Construct type DIE from DICompositeType.
754void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
755 // Get core information.
756 StringRef Name = CTy.getName();
757
758 uint64_t Size = CTy.getSizeInBits() >> 3;
759 unsigned Tag = CTy.getTag();
760 Buffer.setTag(Tag);
761
762 switch (Tag) {
763 case dwarf::DW_TAG_vector_type:
764 case dwarf::DW_TAG_array_type:
765 constructArrayTypeDIE(Buffer, &CTy);
766 break;
767 case dwarf::DW_TAG_enumeration_type: {
768 DIArray Elements = CTy.getTypeArray();
769
770 // Add enumerators to enumeration type.
771 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
772 DIE *ElemDie = NULL;
773 DIDescriptor Enum(Elements.getElement(i));
774 if (Enum.isEnumerator()) {
775 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
776 Buffer.addChild(ElemDie);
777 }
778 }
779 }
780 break;
781 case dwarf::DW_TAG_subroutine_type: {
782 // Add return type.
783 DIArray Elements = CTy.getTypeArray();
784 DIDescriptor RTy = Elements.getElement(0);
785 addType(&Buffer, DIType(RTy));
786
787 bool isPrototyped = true;
788 // Add arguments.
789 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
790 DIDescriptor Ty = Elements.getElement(i);
791 if (Ty.isUnspecifiedParameter()) {
792 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
793 Buffer.addChild(Arg);
794 isPrototyped = false;
795 } else {
796 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
797 addType(Arg, DIType(Ty));
798 Buffer.addChild(Arg);
799 }
800 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +0000801 // Add prototype flag if we're dealing with a C language and the
802 // function has been prototyped.
803 if (isPrototyped &&
804 (Language == dwarf::DW_LANG_C89 ||
805 Language == dwarf::DW_LANG_C99 ||
806 Language == dwarf::DW_LANG_ObjC))
Devang Patel161b2f42011-04-12 23:21:44 +0000807 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
808 }
809 break;
810 case dwarf::DW_TAG_structure_type:
811 case dwarf::DW_TAG_union_type:
812 case dwarf::DW_TAG_class_type: {
813 // Add elements to structure type.
814 DIArray Elements = CTy.getTypeArray();
815
816 // A forward struct declared type may not have elements available.
817 unsigned N = Elements.getNumElements();
818 if (N == 0)
819 break;
820
821 // Add elements to structure type.
822 for (unsigned i = 0; i < N; ++i) {
823 DIDescriptor Element = Elements.getElement(i);
824 DIE *ElemDie = NULL;
825 if (Element.isSubprogram()) {
826 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +0000827 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +0000828 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +0000829 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000830 dwarf::DW_ACCESS_protected);
831 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +0000832 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000833 dwarf::DW_ACCESS_private);
834 else
Nick Lewycky13aaca52011-12-13 05:09:11 +0000835 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000836 dwarf::DW_ACCESS_public);
837 if (SP.isExplicit())
838 addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
839 }
840 else if (Element.isVariable()) {
841 DIVariable DV(Element);
842 ElemDie = new DIE(dwarf::DW_TAG_variable);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000843 addString(ElemDie, dwarf::DW_AT_name, DV.getName());
Devang Patel161b2f42011-04-12 23:21:44 +0000844 addType(ElemDie, DV.getType());
845 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
846 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
847 addSourceLine(ElemDie, DV);
Eric Christopher663e0cf2012-03-28 07:34:31 +0000848 } else if (Element.isDerivedType()) {
849 DIDerivedType DDTy(Element);
850 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
851 ElemDie = new DIE(dwarf::DW_TAG_friend);
852 addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend);
853 } else
854 ElemDie = createMemberDIE(DIDerivedType(Element));
855 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +0000856 DIObjCProperty Property(Element);
857 ElemDie = new DIE(Property.getTag());
858 StringRef PropertyName = Property.getObjCPropertyName();
859 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopherb8ca9882012-03-29 08:42:56 +0000860 addType(ElemDie, Property.getType());
861 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +0000862 StringRef GetterName = Property.getObjCPropertyGetterName();
863 if (!GetterName.empty())
864 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
865 StringRef SetterName = Property.getObjCPropertySetterName();
866 if (!SetterName.empty())
867 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
868 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +0000869 if (Property.isReadOnlyObjCProperty())
870 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
871 if (Property.isReadWriteObjCProperty())
872 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
873 if (Property.isAssignObjCProperty())
874 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
875 if (Property.isRetainObjCProperty())
876 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
877 if (Property.isCopyObjCProperty())
878 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
879 if (Property.isNonAtomicObjCProperty())
880 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
881 if (PropertyAttributes)
882 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
883 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +0000884
Devang Patel30d409c2012-02-07 23:33:58 +0000885 DIEEntry *Entry = getDIEEntry(Element);
886 if (!Entry) {
887 Entry = createDIEEntry(ElemDie);
888 insertDIEEntry(Element, Entry);
889 }
Devang Patel9e11eb12012-02-04 01:30:32 +0000890 } else
Devang Patel161b2f42011-04-12 23:21:44 +0000891 continue;
892 Buffer.addChild(ElemDie);
893 }
894
895 if (CTy.isAppleBlockExtension())
896 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
897
Devang Patel161b2f42011-04-12 23:21:44 +0000898 DICompositeType ContainingType = CTy.getContainingType();
899 if (DIDescriptor(ContainingType).isCompositeType())
900 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
901 getOrCreateTypeDIE(DIType(ContainingType)));
902 else {
903 DIDescriptor Context = CTy.getContext();
904 addToContextOwner(&Buffer, Context);
905 }
906
Devang Patel201e6cd2011-05-12 21:29:42 +0000907 if (CTy.isObjcClassComplete())
908 addUInt(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type,
Devang Patelb11f80e2011-05-12 19:06:16 +0000909 dwarf::DW_FORM_flag, 1);
910
Eric Christopher1a8e8862011-12-16 23:42:42 +0000911 // Add template parameters to a class, structure or union types.
912 // FIXME: The support isn't in the metadata for this yet.
913 if (Tag == dwarf::DW_TAG_class_type ||
914 Tag == dwarf::DW_TAG_structure_type ||
915 Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +0000916 addTemplateParams(Buffer, CTy.getTemplateParams());
917
918 break;
919 }
920 default:
921 break;
922 }
923
924 // Add name if not anonymous or intermediate type.
925 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000926 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +0000927
928 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
929 || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
Nick Lewycky746cb672011-10-26 22:55:33 +0000930 {
Devang Patel161b2f42011-04-12 23:21:44 +0000931 // Add size if non-zero (derived types might be zero-sized.)
932 if (Size)
933 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
934 else {
935 // Add zero size if it is not a forward declaration.
936 if (CTy.isForwardDecl())
937 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
938 else
939 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
940 }
941
942 // Add source line info if available.
943 if (!CTy.isForwardDecl())
944 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +0000945
946 // No harm in adding the runtime language to the declaration.
947 unsigned RLang = CTy.getRunTimeLang();
948 if (RLang)
949 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
950 dwarf::DW_FORM_data1, RLang);
Devang Patel161b2f42011-04-12 23:21:44 +0000951 }
952}
953
954/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
955/// for the given DITemplateTypeParameter.
956DIE *
957CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
958 DIE *ParamDIE = getDIE(TP);
959 if (ParamDIE)
960 return ParamDIE;
961
962 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
963 addType(ParamDIE, TP.getType());
Nick Lewycky390c40d2011-10-27 06:44:11 +0000964 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +0000965 return ParamDIE;
966}
967
968/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
969/// for the given DITemplateValueParameter.
970DIE *
971CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) {
972 DIE *ParamDIE = getDIE(TPV);
973 if (ParamDIE)
974 return ParamDIE;
975
976 ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
977 addType(ParamDIE, TPV.getType());
978 if (!TPV.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000979 addString(ParamDIE, dwarf::DW_AT_name, TPV.getName());
Devang Patel161b2f42011-04-12 23:21:44 +0000980 addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
981 TPV.getValue());
982 return ParamDIE;
983}
984
Devang Patel31c5d052011-05-06 16:57:54 +0000985/// getOrCreateNameSpace - Create a DIE for DINameSpace.
986DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
987 DIE *NDie = getDIE(NS);
988 if (NDie)
989 return NDie;
990 NDie = new DIE(dwarf::DW_TAG_namespace);
991 insertDIE(NS, NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +0000992 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +0000993 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +0000994 addAccelNamespace(NS.getName(), NDie);
995 } else
996 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +0000997 addSourceLine(NDie, NS);
998 addToContextOwner(NDie, NS.getContext());
999 return NDie;
1000}
1001
Devang Pateldbc64af2011-08-15 17:24:54 +00001002/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
1003/// printer to not emit usual symbol prefix before the symbol name is used then
1004/// return linkage name after skipping this special LLVM prefix.
1005static StringRef getRealLinkageName(StringRef LinkageName) {
1006 char One = '\1';
1007 if (LinkageName.startswith(StringRef(&One, 1)))
1008 return LinkageName.substr(1);
1009 return LinkageName;
1010}
1011
1012/// getOrCreateSubprogramDIE - Create new DIE using SP.
1013DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
1014 DIE *SPDie = getDIE(SP);
1015 if (SPDie)
1016 return SPDie;
1017
Rafael Espindola01b55b42011-11-10 22:34:29 +00001018 DISubprogram SPDecl = SP.getFunctionDeclaration();
1019 DIE *DeclDie = NULL;
1020 if (SPDecl.isSubprogram()) {
1021 DeclDie = getOrCreateSubprogramDIE(SPDecl);
1022 }
1023
Devang Pateldbc64af2011-08-15 17:24:54 +00001024 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1025
1026 // DW_TAG_inlined_subroutine may refer to this DIE.
1027 insertDIE(SP, SPDie);
1028
1029 // Add to context owner.
1030 addToContextOwner(SPDie, SP.getContext());
1031
1032 // Add function template parameters.
1033 addTemplateParams(*SPDie, SP.getTemplateParams());
1034
Eric Christophere9722e12012-04-16 23:54:23 +00001035 // Unfortunately this code needs to stay here instead of below the
1036 // AT_specification code in order to work around a bug in older
1037 // gdbs that requires the linkage name to resolve multiple template
1038 // functions.
Eric Christopher8d101c32012-03-15 08:19:33 +00001039 StringRef LinkageName = SP.getLinkageName();
1040 if (!LinkageName.empty())
1041 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
1042 getRealLinkageName(LinkageName));
1043
Devang Pateldbc64af2011-08-15 17:24:54 +00001044 // If this DIE is going to refer declaration info using AT_specification
1045 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001046 if (DeclDie) {
1047 // Refer function declaration directly.
1048 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1049 DeclDie);
1050
Devang Pateldbc64af2011-08-15 17:24:54 +00001051 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001052 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001053
1054 // Constructors and operators for anonymous aggregates do not have names.
1055 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001056 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001057
1058 addSourceLine(SPDie, SP);
1059
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001060 // Add the prototype if we have a prototype and we have a C like
1061 // language.
1062 if (SP.isPrototyped() &&
1063 (Language == dwarf::DW_LANG_C89 ||
1064 Language == dwarf::DW_LANG_C99 ||
1065 Language == dwarf::DW_LANG_ObjC))
Devang Pateldbc64af2011-08-15 17:24:54 +00001066 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1067
1068 // Add Return Type.
1069 DICompositeType SPTy = SP.getType();
1070 DIArray Args = SPTy.getTypeArray();
1071 unsigned SPTag = SPTy.getTag();
1072
1073 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1074 addType(SPDie, SPTy);
1075 else
1076 addType(SPDie, DIType(Args.getElement(0)));
1077
1078 unsigned VK = SP.getVirtuality();
1079 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001080 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001081 DIEBlock *Block = getDIEBlock();
1082 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1083 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1084 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1085 ContainingTypeMap.insert(std::make_pair(SPDie,
1086 SP.getContainingType()));
1087 }
1088
1089 if (!SP.isDefinition()) {
1090 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1091
1092 // Add arguments. Do not add arguments for subprogram definition. They will
1093 // be handled while processing variables.
1094 DICompositeType SPTy = SP.getType();
1095 DIArray Args = SPTy.getTypeArray();
1096 unsigned SPTag = SPTy.getTag();
1097
1098 if (SPTag == dwarf::DW_TAG_subroutine_type)
1099 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1100 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1101 DIType ATy = DIType(DIType(Args.getElement(i)));
1102 addType(Arg, ATy);
1103 if (ATy.isArtificial())
1104 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1105 SPDie->addChild(Arg);
1106 }
1107 }
1108
1109 if (SP.isArtificial())
1110 addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1111
1112 if (!SP.isLocalToUnit())
1113 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1114
1115 if (SP.isOptimized())
1116 addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1117
1118 if (unsigned isa = Asm->getISAEncoding()) {
1119 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1120 }
1121
1122 return SPDie;
1123}
1124
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001125// Return const expression if value is a GEP to access merged global
1126// constant. e.g.
1127// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1128static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1129 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1130 if (!CE || CE->getNumOperands() != 3 ||
1131 CE->getOpcode() != Instruction::GetElementPtr)
1132 return NULL;
1133
1134 // First operand points to a global struct.
1135 Value *Ptr = CE->getOperand(0);
1136 if (!isa<GlobalValue>(Ptr) ||
1137 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1138 return NULL;
1139
1140 // Second operand is zero.
1141 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1142 if (!CI || !CI->isZero())
1143 return NULL;
1144
1145 // Third operand is offset.
1146 if (!isa<ConstantInt>(CE->getOperand(2)))
1147 return NULL;
1148
1149 return CE;
1150}
1151
1152/// createGlobalVariableDIE - create global variable DIE.
1153void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001154 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001155 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001156 return;
1157
Devang Patel49e2f032011-08-18 22:21:50 +00001158 DIGlobalVariable GV(N);
Devang Patel28bea082011-08-18 23:17:55 +00001159 if (!GV.Verify())
1160 return;
1161
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001162 DIE *VariableDIE = new DIE(GV.getTag());
Devang Patel49e2f032011-08-18 22:21:50 +00001163 // Add to map.
1164 insertDIE(N, VariableDIE);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001165
1166 // Add name.
Nick Lewycky390c40d2011-10-27 06:44:11 +00001167 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001168 StringRef LinkageName = GV.getLinkageName();
Devang Patel49e2f032011-08-18 22:21:50 +00001169 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001170 if (!LinkageName.empty() && isGlobalVariable)
Nick Lewycky746cb672011-10-26 22:55:33 +00001171 addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Nick Lewycky390c40d2011-10-27 06:44:11 +00001172 getRealLinkageName(LinkageName));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001173 // Add type.
Devang Patel49e2f032011-08-18 22:21:50 +00001174 DIType GTy = GV.getType();
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001175 addType(VariableDIE, GTy);
1176
1177 // Add scoping info.
Eric Christopherdfa30e12011-11-09 05:24:07 +00001178 if (!GV.isLocalToUnit())
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001179 addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Eric Christopherdfa30e12011-11-09 05:24:07 +00001180
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001181 // Add line number info.
1182 addSourceLine(VariableDIE, GV);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001183 // Add to context owner.
1184 DIDescriptor GVContext = GV.getContext();
1185 addToContextOwner(VariableDIE, GVContext);
1186 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001187 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001188 DIE *VariableSpecDIE = NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001189 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001190 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001191 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1192 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1193 addLabel(Block, 0, dwarf::DW_FORM_udata,
1194 Asm->Mang->getSymbol(GV.getGlobal()));
1195 // Do not create specification DIE if context is either compile unit
1196 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001197 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001198 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1199 // Create specification DIE.
Eric Christopherd117fbb2011-11-11 01:55:22 +00001200 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001201 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1202 dwarf::DW_FORM_ref4, VariableDIE);
1203 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1204 addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag,
1205 1);
1206 addDie(VariableSpecDIE);
1207 } else {
1208 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001209 }
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001210 } else if (const ConstantInt *CI =
1211 dyn_cast_or_null<ConstantInt>(GV.getConstant()))
1212 addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
1213 else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001214 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001215 // GV is a merged global.
1216 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1217 Value *Ptr = CE->getOperand(0);
1218 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1219 addLabel(Block, 0, dwarf::DW_FORM_udata,
1220 Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
1221 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1222 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
1223 addUInt(Block, 0, dwarf::DW_FORM_udata,
1224 Asm->getTargetData().getIndexedOffset(Ptr->getType(), Idx));
1225 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1226 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1227 }
1228
Eric Christopherd117fbb2011-11-11 01:55:22 +00001229 if (addToAccelTable) {
1230 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1231 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001232
Eric Christopherd117fbb2011-11-11 01:55:22 +00001233 // If the linkage name is different than the name, go ahead and output
1234 // that as well into the name table.
1235 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1236 addAccelName(GV.getLinkageName(), AddrDIE);
1237 }
Eric Christopher74d8a872011-11-08 21:56:23 +00001238
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001239 return;
1240}
1241
Devang Patel161b2f42011-04-12 23:21:44 +00001242/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1243void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1244 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}