blob: ec6954e302a29c9bf48ddae089bd7a051a8a06e0 [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
16#include "DwarfCompileUnit.h"
17#include "DwarfDebug.h"
18#include "llvm/Constants.h"
19#include "llvm/Analysis/DIBuilder.h"
20#include "llvm/Target/TargetData.h"
21#include "llvm/Target/TargetFrameLowering.h"
22#include "llvm/Target/TargetMachine.h"
23#include "llvm/Target/TargetRegisterInfo.h"
24#include "llvm/ADT/APFloat.h"
25#include "llvm/Support/ErrorHandling.h"
26
27using namespace llvm;
28
29/// CompileUnit - Compile unit constructor.
30CompileUnit::CompileUnit(unsigned I, DIE *D, AsmPrinter *A, DwarfDebug *DW)
31 : ID(I), CUDie(D), Asm(A), DD(DW), IndexTyDie(0) {
32 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
33}
34
35/// ~CompileUnit - Destructor for compile unit.
36CompileUnit::~CompileUnit() {
37 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
38 DIEBlocks[j]->~DIEBlock();
39}
40
41/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
42/// information entry.
43DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
44 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
45 return Value;
46}
47
48/// addUInt - Add an unsigned integer attribute data and value.
49///
50void CompileUnit::addUInt(DIE *Die, unsigned Attribute,
51 unsigned Form, uint64_t Integer) {
52 if (!Form) Form = DIEInteger::BestForm(false, Integer);
53 DIEValue *Value = Integer == 1 ?
54 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
55 Die->addValue(Attribute, Form, Value);
56}
57
58/// addSInt - Add an signed integer attribute data and value.
59///
60void CompileUnit::addSInt(DIE *Die, unsigned Attribute,
61 unsigned Form, int64_t Integer) {
62 if (!Form) Form = DIEInteger::BestForm(true, Integer);
63 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
64 Die->addValue(Attribute, Form, Value);
65}
66
67/// addString - Add a string attribute data and value. DIEString only
68/// keeps string reference.
69void CompileUnit::addString(DIE *Die, unsigned Attribute, unsigned Form,
70 StringRef String) {
71 DIEValue *Value = new (DIEValueAllocator) DIEString(String);
72 Die->addValue(Attribute, Form, Value);
73}
74
75/// addLabel - Add a Dwarf label attribute data and value.
76///
77void CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
78 const MCSymbol *Label) {
79 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
80 Die->addValue(Attribute, Form, Value);
81}
82
83/// addDelta - Add a label delta attribute data and value.
84///
85void CompileUnit::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
86 const MCSymbol *Hi, const MCSymbol *Lo) {
87 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
88 Die->addValue(Attribute, Form, Value);
89}
90
91/// addDIEEntry - Add a DIE attribute data and value.
92///
93void CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
94 DIE *Entry) {
95 Die->addValue(Attribute, Form, createDIEEntry(Entry));
96}
97
98
99/// addBlock - Add block data.
100///
101void CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
102 DIEBlock *Block) {
103 Block->ComputeSize(Asm);
104 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
105 Die->addValue(Attribute, Block->BestForm(), Block);
106}
107
108/// addSourceLine - Add location information to specified debug information
109/// entry.
110void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
111 // Verify variable.
112 if (!V.Verify())
113 return;
114
115 unsigned Line = V.getLineNumber();
116 if (Line == 0)
117 return;
118 unsigned FileID = DD->GetOrCreateSourceID(V.getContext().getFilename(),
119 V.getContext().getDirectory());
120 assert(FileID && "Invalid file id");
121 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
122 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
123}
124
125/// addSourceLine - Add location information to specified debug information
126/// entry.
127void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
128 // Verify global variable.
129 if (!G.Verify())
130 return;
131
132 unsigned Line = G.getLineNumber();
133 if (Line == 0)
134 return;
135 unsigned FileID = DD->GetOrCreateSourceID(G.getContext().getFilename(),
136 G.getContext().getDirectory());
137 assert(FileID && "Invalid file id");
138 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
139 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
140}
141
142/// addSourceLine - Add location information to specified debug information
143/// entry.
144void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
145 // Verify subprogram.
146 if (!SP.Verify())
147 return;
148 // If the line number is 0, don't add it.
149 if (SP.getLineNumber() == 0)
150 return;
151
152 unsigned Line = SP.getLineNumber();
153 if (!SP.getContext().Verify())
154 return;
155 unsigned FileID = DD->GetOrCreateSourceID(SP.getFilename(), SP.getDirectory());
156 assert(FileID && "Invalid file id");
157 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
158 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
159}
160
161/// addSourceLine - Add location information to specified debug information
162/// entry.
163void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
164 // Verify type.
165 if (!Ty.Verify())
166 return;
167
168 unsigned Line = Ty.getLineNumber();
169 if (Line == 0 || !Ty.getContext().Verify())
170 return;
171 unsigned FileID = DD->GetOrCreateSourceID(Ty.getFilename(), Ty.getDirectory());
172 assert(FileID && "Invalid file id");
173 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
174 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
175}
176
177/// addSourceLine - Add location information to specified debug information
178/// entry.
179void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
180 // Verify namespace.
181 if (!NS.Verify())
182 return;
183
184 unsigned Line = NS.getLineNumber();
185 if (Line == 0)
186 return;
187 StringRef FN = NS.getFilename();
188
189 unsigned FileID = DD->GetOrCreateSourceID(FN, NS.getDirectory());
190 assert(FileID && "Invalid file id");
191 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
192 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
193}
194
Devang Patele1cdf842011-04-27 22:45:24 +0000195/// addVariableAddress - Add DW_AT_location attribute for a
196/// DbgVariable based on provided MachineLocation.
197void CompileUnit::addVariableAddress(DbgVariable *&DV, DIE *Die,
198 MachineLocation Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000199 if (DV->variableHasComplexAddress())
200 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
201 else if (DV->isBlockByrefVariable())
202 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
203 else
204 addAddress(Die, dwarf::DW_AT_location, Location);
205}
206
Devang Patel116da2f2011-04-26 19:06:18 +0000207/// addRegisterOp - Add register operand.
208void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
209 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
210 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
211 if (DWReg < 32)
212 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
213 else {
214 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
215 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
216 }
217}
218
219/// addRegisterOffset - Add register offset.
220void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
221 int64_t Offset) {
222 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
223 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
224 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
225 if (Reg == TRI->getFrameRegister(*Asm->MF))
226 // If variable offset is based in frame register then use fbreg.
227 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
228 else if (DWReg < 32)
229 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
230 else {
231 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
232 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
233 }
234 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
235}
236
237/// addAddress - Add an address attribute to a die based on the location
238/// provided.
239void CompileUnit::addAddress(DIE *Die, unsigned Attribute,
240 const MachineLocation &Location) {
241 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
242
243 if (Location.isReg())
244 addRegisterOp(Block, Location.getReg());
245 else
246 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
247
248 // Now attach the location information to the DIE.
249 addBlock(Die, Attribute, 0, Block);
250}
251
Devang Patel161b2f42011-04-12 23:21:44 +0000252/// addComplexAddress - Start with the address based on the location provided,
253/// and generate the DWARF information necessary to find the actual variable
254/// given the extra address information encoded in the DIVariable, starting from
255/// the starting location. Add the DWARF information to the die.
256///
257void CompileUnit::addComplexAddress(DbgVariable *&DV, DIE *Die,
258 unsigned Attribute,
259 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000260 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patelc26f5442011-04-28 02:22:40 +0000261 unsigned N = DV->getNumAddrElements();
262 unsigned i = 0;
263 if (Location.isReg()) {
264 if (N >= 2 && DV->getAddrElement(0) == DIBuilder::OpPlus) {
265 // If first address element is OpPlus then emit
266 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
267 addRegisterOffset(Block, Location.getReg(), DV->getAddrElement(1));
268 i = 2;
269 } else
270 addRegisterOp(Block, Location.getReg());
271 }
Devang Patel116da2f2011-04-26 19:06:18 +0000272 else
273 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000274
Devang Patelc26f5442011-04-28 02:22:40 +0000275 for (;i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +0000276 uint64_t Element = DV->getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000277 if (Element == DIBuilder::OpPlus) {
278 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
279 addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
280 } else if (Element == DIBuilder::OpDeref) {
281 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
282 } else llvm_unreachable("unknown DIBuilder Opcode");
283 }
284
285 // Now attach the location information to the DIE.
286 addBlock(Die, Attribute, 0, Block);
287}
288
289/* Byref variables, in Blocks, are declared by the programmer as "SomeType
290 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
291 gives the variable VarName either the struct, or a pointer to the struct, as
292 its type. This is necessary for various behind-the-scenes things the
293 compiler needs to do with by-reference variables in Blocks.
294
295 However, as far as the original *programmer* is concerned, the variable
296 should still have type 'SomeType', as originally declared.
297
298 The function getBlockByrefType dives into the __Block_byref_x_VarName
299 struct to find the original type of the variable, which is then assigned to
300 the variable's Debug Information Entry as its real type. So far, so good.
301 However now the debugger will expect the variable VarName to have the type
302 SomeType. So we need the location attribute for the variable to be an
303 expression that explains to the debugger how to navigate through the
304 pointers and struct to find the actual variable of type SomeType.
305
306 The following function does just that. We start by getting
307 the "normal" location for the variable. This will be the location
308 of either the struct __Block_byref_x_VarName or the pointer to the
309 struct __Block_byref_x_VarName.
310
311 The struct will look something like:
312
313 struct __Block_byref_x_VarName {
314 ... <various fields>
315 struct __Block_byref_x_VarName *forwarding;
316 ... <various other fields>
317 SomeType VarName;
318 ... <maybe more fields>
319 };
320
321 If we are given the struct directly (as our starting point) we
322 need to tell the debugger to:
323
324 1). Add the offset of the forwarding field.
325
326 2). Follow that pointer to get the real __Block_byref_x_VarName
327 struct to use (the real one may have been copied onto the heap).
328
329 3). Add the offset for the field VarName, to find the actual variable.
330
331 If we started with a pointer to the struct, then we need to
332 dereference that pointer first, before the other steps.
333 Translating this into DWARF ops, we will need to append the following
334 to the current location description for the variable:
335
336 DW_OP_deref -- optional, if we start with a pointer
337 DW_OP_plus_uconst <forward_fld_offset>
338 DW_OP_deref
339 DW_OP_plus_uconst <varName_fld_offset>
340
341 That is what this function does. */
342
343/// addBlockByrefAddress - Start with the address based on the location
344/// provided, and generate the DWARF information necessary to find the
345/// actual Block variable (navigating the Block struct) based on the
346/// starting location. Add the DWARF information to the die. For
347/// more information, read large comment just above here.
348///
349void CompileUnit::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
350 unsigned Attribute,
351 const MachineLocation &Location) {
352 DIType Ty = DV->getType();
353 DIType TmpTy = Ty;
354 unsigned Tag = Ty.getTag();
355 bool isPointer = false;
356
357 StringRef varName = DV->getName();
358
359 if (Tag == dwarf::DW_TAG_pointer_type) {
360 DIDerivedType DTy = DIDerivedType(Ty);
361 TmpTy = DTy.getTypeDerivedFrom();
362 isPointer = true;
363 }
364
365 DICompositeType blockStruct = DICompositeType(TmpTy);
366
367 // Find the __forwarding field and the variable field in the __Block_byref
368 // struct.
369 DIArray Fields = blockStruct.getTypeArray();
370 DIDescriptor varField = DIDescriptor();
371 DIDescriptor forwardingField = DIDescriptor();
372
373 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
374 DIDescriptor Element = Fields.getElement(i);
375 DIDerivedType DT = DIDerivedType(Element);
376 StringRef fieldName = DT.getName();
377 if (fieldName == "__forwarding")
378 forwardingField = Element;
379 else if (fieldName == varName)
380 varField = Element;
381 }
382
383 // Get the offsets for the forwarding field and the variable field.
384 unsigned forwardingFieldOffset =
385 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
386 unsigned varFieldOffset =
387 DIDerivedType(varField).getOffsetInBits() >> 3;
388
389 // Decode the original location, and use that as the start of the byref
390 // variable's location.
391 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
392 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
393 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
394
395 if (Location.isReg()) {
396 if (Reg < 32)
397 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
398 else {
399 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
400 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
401 }
402 } else {
403 if (Reg < 32)
404 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
405 else {
406 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
407 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
408 }
409
410 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
411 }
412
413 // If we started with a pointer to the __Block_byref... struct, then
414 // the first thing we need to do is dereference the pointer (DW_OP_deref).
415 if (isPointer)
416 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
417
418 // Next add the offset for the '__forwarding' field:
419 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
420 // adding the offset if it's 0.
421 if (forwardingFieldOffset > 0) {
422 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
423 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
424 }
425
426 // Now dereference the __forwarding field to get to the real __Block_byref
427 // struct: DW_OP_deref.
428 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
429
430 // Now that we've got the real __Block_byref... struct, add the offset
431 // for the variable's field to get to the location of the actual variable:
432 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
433 if (varFieldOffset > 0) {
434 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
435 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
436 }
437
438 // Now attach the location information to the DIE.
439 addBlock(Die, Attribute, 0, Block);
440}
441
Devang Patel161b2f42011-04-12 23:21:44 +0000442/// addConstantValue - Add constant value entry in variable DIE.
Devang Patelb58128e2011-05-27 16:45:18 +0000443bool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
444 DIType Ty) {
Devang Patel161b2f42011-04-12 23:21:44 +0000445 assert (MO.isImm() && "Invalid machine operand!");
446 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
447 unsigned Imm = MO.getImm();
Devang Patelb58128e2011-05-27 16:45:18 +0000448 unsigned form = dwarf::DW_FORM_udata;
449 switch (Ty.getSizeInBits()) {
450 case 8: form = dwarf::DW_FORM_data1; break;
451 case 16: form = dwarf::DW_FORM_data2; break;
452 case 32: form = dwarf::DW_FORM_data4; break;
453 case 64: form = dwarf::DW_FORM_data8; break;
454 default: break;
455 }
456 addUInt(Block, 0, form, Imm);
Devang Patel161b2f42011-04-12 23:21:44 +0000457 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
458 return true;
459}
460
461/// addConstantFPValue - Add constant value entry in variable DIE.
462bool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
463 assert (MO.isFPImm() && "Invalid machine operand!");
464 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
465 APFloat FPImm = MO.getFPImm()->getValueAPF();
466
467 // Get the raw data form of the floating point.
468 const APInt FltVal = FPImm.bitcastToAPInt();
469 const char *FltPtr = (const char*)FltVal.getRawData();
470
471 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
472 bool LittleEndian = Asm->getTargetData().isLittleEndian();
473 int Incr = (LittleEndian ? 1 : -1);
474 int Start = (LittleEndian ? 0 : NumBytes - 1);
475 int Stop = (LittleEndian ? NumBytes : -1);
476
477 // Output the constant to DWARF one byte at a time.
478 for (; Start != Stop; Start += Incr)
479 addUInt(Block, 0, dwarf::DW_FORM_data1,
480 (unsigned char)0xFF & FltPtr[Start]);
481
482 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
483 return true;
484}
485
486/// addConstantValue - Add constant value entry in variable DIE.
487bool CompileUnit::addConstantValue(DIE *Die, ConstantInt *CI,
488 bool Unsigned) {
489 if (CI->getBitWidth() <= 64) {
490 if (Unsigned)
491 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
492 CI->getZExtValue());
493 else
494 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
495 CI->getSExtValue());
496 return true;
497 }
498
499 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
500
501 // Get the raw data form of the large APInt.
502 const APInt Val = CI->getValue();
503 const char *Ptr = (const char*)Val.getRawData();
504
505 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
506 bool LittleEndian = Asm->getTargetData().isLittleEndian();
507 int Incr = (LittleEndian ? 1 : -1);
508 int Start = (LittleEndian ? 0 : NumBytes - 1);
509 int Stop = (LittleEndian ? NumBytes : -1);
510
511 // Output the constant to DWARF one byte at a time.
512 for (; Start != Stop; Start += Incr)
513 addUInt(Block, 0, dwarf::DW_FORM_data1,
514 (unsigned char)0xFF & Ptr[Start]);
515
516 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
517 return true;
518}
519
520/// addTemplateParams - Add template parameters in buffer.
521void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
522 // Add template parameters.
523 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
524 DIDescriptor Element = TParams.getElement(i);
525 if (Element.isTemplateTypeParameter())
526 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
527 DITemplateTypeParameter(Element)));
528 else if (Element.isTemplateValueParameter())
529 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
530 DITemplateValueParameter(Element)));
531 }
532
533}
534/// addToContextOwner - Add Die into the list of its context owner's children.
535void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
536 if (Context.isType()) {
537 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
538 ContextDIE->addChild(Die);
539 } else if (Context.isNameSpace()) {
540 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
541 ContextDIE->addChild(Die);
542 } else if (Context.isSubprogram()) {
543 DIE *ContextDIE = DD->createSubprogramDIE(DISubprogram(Context));
544 ContextDIE->addChild(Die);
545 } else if (DIE *ContextDIE = getDIE(Context))
546 ContextDIE->addChild(Die);
547 else
548 addDie(Die);
549}
550
551/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
552/// given DIType.
553DIE *CompileUnit::getOrCreateTypeDIE(DIType Ty) {
554 DIE *TyDIE = getDIE(Ty);
555 if (TyDIE)
556 return TyDIE;
557
558 // Create new type.
559 TyDIE = new DIE(dwarf::DW_TAG_base_type);
560 insertDIE(Ty, TyDIE);
561 if (Ty.isBasicType())
562 constructTypeDIE(*TyDIE, DIBasicType(Ty));
563 else if (Ty.isCompositeType())
564 constructTypeDIE(*TyDIE, DICompositeType(Ty));
565 else {
566 assert(Ty.isDerivedType() && "Unknown kind of DIType");
567 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
568 }
569
570 addToContextOwner(TyDIE, Ty.getContext());
571 return TyDIE;
572}
573
574/// addType - Add a new type attribute to the specified entity.
575void CompileUnit::addType(DIE *Entity, DIType Ty) {
576 if (!Ty.Verify())
577 return;
578
579 // Check for pre-existence.
580 DIEEntry *Entry = getDIEEntry(Ty);
581 // If it exists then use the existing value.
582 if (Entry) {
583 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
584 return;
585 }
586
587 // Construct type.
588 DIE *Buffer = getOrCreateTypeDIE(Ty);
589
590 // Set up proxy.
591 Entry = createDIEEntry(Buffer);
592 insertDIEEntry(Ty, Entry);
593
594 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
595}
596
Devang Patel31c5d052011-05-06 16:57:54 +0000597/// addPubTypes - Add type for pubtypes section.
598void CompileUnit::addPubTypes(DISubprogram SP) {
599 DICompositeType SPTy = SP.getType();
600 unsigned SPTag = SPTy.getTag();
601 if (SPTag != dwarf::DW_TAG_subroutine_type)
602 return;
603
604 DIArray Args = SPTy.getTypeArray();
605 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
606 DIType ATy(Args.getElement(i));
607 if (!ATy.Verify())
608 continue;
609 DICompositeType CATy = getDICompositeType(ATy);
610 if (DIDescriptor(CATy).Verify() && !CATy.getName().empty()
611 && !CATy.isForwardDecl()) {
612 if (DIEEntry *Entry = getDIEEntry(CATy))
613 addGlobalType(CATy.getName(), Entry->getEntry());
614 }
615 }
616}
617
Devang Patel161b2f42011-04-12 23:21:44 +0000618/// constructTypeDIE - Construct basic type die from DIBasicType.
619void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
620 // Get core information.
621 StringRef Name = BTy.getName();
622 Buffer.setTag(dwarf::DW_TAG_base_type);
623 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
624 BTy.getEncoding());
625
626 // Add name if not anonymous or intermediate type.
627 if (!Name.empty())
628 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
629 uint64_t Size = BTy.getSizeInBits() >> 3;
630 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
631}
632
633/// constructTypeDIE - Construct derived type die from DIDerivedType.
634void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
635 // Get core information.
636 StringRef Name = DTy.getName();
637 uint64_t Size = DTy.getSizeInBits() >> 3;
638 unsigned Tag = DTy.getTag();
639
640 // FIXME - Workaround for templates.
641 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
642
643 Buffer.setTag(Tag);
644
645 // Map to main type, void will not have a type.
646 DIType FromTy = DTy.getTypeDerivedFrom();
647 addType(&Buffer, FromTy);
648
649 // Add name if not anonymous or intermediate type.
650 if (!Name.empty())
651 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
652
653 // Add size if non-zero (derived types might be zero-sized.)
654 if (Size)
655 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
656
657 // Add source line info if available and TyDesc is not a forward declaration.
658 if (!DTy.isForwardDecl())
659 addSourceLine(&Buffer, DTy);
660}
661
662/// constructTypeDIE - Construct type DIE from DICompositeType.
663void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
664 // Get core information.
665 StringRef Name = CTy.getName();
666
667 uint64_t Size = CTy.getSizeInBits() >> 3;
668 unsigned Tag = CTy.getTag();
669 Buffer.setTag(Tag);
670
671 switch (Tag) {
672 case dwarf::DW_TAG_vector_type:
673 case dwarf::DW_TAG_array_type:
674 constructArrayTypeDIE(Buffer, &CTy);
675 break;
676 case dwarf::DW_TAG_enumeration_type: {
677 DIArray Elements = CTy.getTypeArray();
678
679 // Add enumerators to enumeration type.
680 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
681 DIE *ElemDie = NULL;
682 DIDescriptor Enum(Elements.getElement(i));
683 if (Enum.isEnumerator()) {
684 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
685 Buffer.addChild(ElemDie);
686 }
687 }
688 }
689 break;
690 case dwarf::DW_TAG_subroutine_type: {
691 // Add return type.
692 DIArray Elements = CTy.getTypeArray();
693 DIDescriptor RTy = Elements.getElement(0);
694 addType(&Buffer, DIType(RTy));
695
696 bool isPrototyped = true;
697 // Add arguments.
698 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
699 DIDescriptor Ty = Elements.getElement(i);
700 if (Ty.isUnspecifiedParameter()) {
701 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
702 Buffer.addChild(Arg);
703 isPrototyped = false;
704 } else {
705 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
706 addType(Arg, DIType(Ty));
707 Buffer.addChild(Arg);
708 }
709 }
710 // Add prototype flag.
711 if (isPrototyped)
712 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
713 }
714 break;
715 case dwarf::DW_TAG_structure_type:
716 case dwarf::DW_TAG_union_type:
717 case dwarf::DW_TAG_class_type: {
718 // Add elements to structure type.
719 DIArray Elements = CTy.getTypeArray();
720
721 // A forward struct declared type may not have elements available.
722 unsigned N = Elements.getNumElements();
723 if (N == 0)
724 break;
725
726 // Add elements to structure type.
727 for (unsigned i = 0; i < N; ++i) {
728 DIDescriptor Element = Elements.getElement(i);
729 DIE *ElemDie = NULL;
730 if (Element.isSubprogram()) {
731 DISubprogram SP(Element);
732 ElemDie = DD->createSubprogramDIE(DISubprogram(Element));
733 if (SP.isProtected())
734 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
735 dwarf::DW_ACCESS_protected);
736 else if (SP.isPrivate())
737 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
738 dwarf::DW_ACCESS_private);
739 else
740 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
741 dwarf::DW_ACCESS_public);
742 if (SP.isExplicit())
743 addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
744 }
745 else if (Element.isVariable()) {
746 DIVariable DV(Element);
747 ElemDie = new DIE(dwarf::DW_TAG_variable);
748 addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
749 DV.getName());
750 addType(ElemDie, DV.getType());
751 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
752 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
753 addSourceLine(ElemDie, DV);
754 } else if (Element.isDerivedType())
755 ElemDie = createMemberDIE(DIDerivedType(Element));
756 else
757 continue;
758 Buffer.addChild(ElemDie);
759 }
760
761 if (CTy.isAppleBlockExtension())
762 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
763
764 unsigned RLang = CTy.getRunTimeLang();
765 if (RLang)
766 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
767 dwarf::DW_FORM_data1, RLang);
768
769 DICompositeType ContainingType = CTy.getContainingType();
770 if (DIDescriptor(ContainingType).isCompositeType())
771 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
772 getOrCreateTypeDIE(DIType(ContainingType)));
773 else {
774 DIDescriptor Context = CTy.getContext();
775 addToContextOwner(&Buffer, Context);
776 }
777
Devang Patel201e6cd2011-05-12 21:29:42 +0000778 if (CTy.isObjcClassComplete())
779 addUInt(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type,
Devang Patelb11f80e2011-05-12 19:06:16 +0000780 dwarf::DW_FORM_flag, 1);
781
Devang Patel161b2f42011-04-12 23:21:44 +0000782 if (Tag == dwarf::DW_TAG_class_type)
783 addTemplateParams(Buffer, CTy.getTemplateParams());
784
785 break;
786 }
787 default:
788 break;
789 }
790
791 // Add name if not anonymous or intermediate type.
792 if (!Name.empty())
793 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
794
795 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
796 || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
797 {
798 // Add size if non-zero (derived types might be zero-sized.)
799 if (Size)
800 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
801 else {
802 // Add zero size if it is not a forward declaration.
803 if (CTy.isForwardDecl())
804 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
805 else
806 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
807 }
808
809 // Add source line info if available.
810 if (!CTy.isForwardDecl())
811 addSourceLine(&Buffer, CTy);
812 }
813}
814
815/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
816/// for the given DITemplateTypeParameter.
817DIE *
818CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
819 DIE *ParamDIE = getDIE(TP);
820 if (ParamDIE)
821 return ParamDIE;
822
823 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
824 addType(ParamDIE, TP.getType());
825 addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TP.getName());
826 return ParamDIE;
827}
828
829/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
830/// for the given DITemplateValueParameter.
831DIE *
832CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) {
833 DIE *ParamDIE = getDIE(TPV);
834 if (ParamDIE)
835 return ParamDIE;
836
837 ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
838 addType(ParamDIE, TPV.getType());
839 if (!TPV.getName().empty())
840 addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TPV.getName());
841 addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
842 TPV.getValue());
843 return ParamDIE;
844}
845
Devang Patel31c5d052011-05-06 16:57:54 +0000846/// getOrCreateNameSpace - Create a DIE for DINameSpace.
847DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
848 DIE *NDie = getDIE(NS);
849 if (NDie)
850 return NDie;
851 NDie = new DIE(dwarf::DW_TAG_namespace);
852 insertDIE(NS, NDie);
853 if (!NS.getName().empty())
854 addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
855 addSourceLine(NDie, NS);
856 addToContextOwner(NDie, NS.getContext());
857 return NDie;
858}
859
Devang Patel161b2f42011-04-12 23:21:44 +0000860/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
861void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
862 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
863 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
864 int64_t L = SR.getLo();
865 int64_t H = SR.getHi();
866
867 // The L value defines the lower bounds which is typically zero for C/C++. The
868 // H value is the upper bounds. Values are 64 bit. H - L + 1 is the size
869 // of the array. If L > H then do not emit DW_AT_lower_bound and
870 // DW_AT_upper_bound attributes. If L is zero and H is also zero then the
871 // array has one element and in such case do not emit lower bound.
872
873 if (L > H) {
874 Buffer.addChild(DW_Subrange);
875 return;
876 }
877 if (L)
878 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
879 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
880 Buffer.addChild(DW_Subrange);
881}
882
883/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
884void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
885 DICompositeType *CTy) {
886 Buffer.setTag(dwarf::DW_TAG_array_type);
887 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
888 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
889
890 // Emit derived type.
891 addType(&Buffer, CTy->getTypeDerivedFrom());
892 DIArray Elements = CTy->getTypeArray();
893
894 // Get an anonymous type for index type.
895 DIE *IdxTy = getIndexTyDie();
896 if (!IdxTy) {
897 // Construct an anonymous type for index type.
898 IdxTy = new DIE(dwarf::DW_TAG_base_type);
899 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
900 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
901 dwarf::DW_ATE_signed);
902 addDie(IdxTy);
903 setIndexTyDie(IdxTy);
904 }
905
906 // Add subranges to array type.
907 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
908 DIDescriptor Element = Elements.getElement(i);
909 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
910 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
911 }
912}
913
914/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
915DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
916 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
917 StringRef Name = ETy.getName();
918 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
919 int64_t Value = ETy.getEnumValue();
920 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
921 return Enumerator;
922}
923
924/// createMemberDIE - Create new member DIE.
925DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
926 DIE *MemberDie = new DIE(DT.getTag());
927 StringRef Name = DT.getName();
928 if (!Name.empty())
929 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
930
931 addType(MemberDie, DT.getTypeDerivedFrom());
932
933 addSourceLine(MemberDie, DT);
934
935 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
936 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
937
938 uint64_t Size = DT.getSizeInBits();
939 uint64_t FieldSize = DT.getOriginalTypeSize();
940
941 if (Size != FieldSize) {
942 // Handle bitfield.
943 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
944 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
945
946 uint64_t Offset = DT.getOffsetInBits();
947 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
948 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
949 uint64_t FieldOffset = (HiMark - FieldSize);
950 Offset -= FieldOffset;
951
952 // Maybe we need to work from the other end.
953 if (Asm->getTargetData().isLittleEndian())
954 Offset = FieldSize - (Offset + Size);
955 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
956
957 // Here WD_AT_data_member_location points to the anonymous
958 // field that includes this bit field.
959 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
960
961 } else
962 // This is not a bitfield.
963 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
964
965 if (DT.getTag() == dwarf::DW_TAG_inheritance
966 && DT.isVirtual()) {
967
968 // For C++, virtual base classes are not at fixed offset. Use following
969 // expression to extract appropriate offset from vtable.
970 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
971
972 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
973 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
974 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
975 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
976 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
977 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
978 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
979 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
980
981 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
982 VBaseLocationDie);
983 } else
984 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
985
986 if (DT.isProtected())
987 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
988 dwarf::DW_ACCESS_protected);
989 else if (DT.isPrivate())
990 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
991 dwarf::DW_ACCESS_private);
992 // Otherwise C++ member and base classes are considered public.
993 else if (DT.getCompileUnit().getLanguage() == dwarf::DW_LANG_C_plus_plus)
994 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
995 dwarf::DW_ACCESS_public);
996 if (DT.isVirtual())
997 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
998 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +0000999
1000 // Objective-C properties.
1001 StringRef PropertyName = DT.getObjCPropertyName();
1002 if (!PropertyName.empty()) {
1003 addString(MemberDie, dwarf::DW_AT_APPLE_property_name, dwarf::DW_FORM_string,
1004 PropertyName);
1005 StringRef GetterName = DT.getObjCPropertyGetterName();
1006 if (!GetterName.empty())
1007 addString(MemberDie, dwarf::DW_AT_APPLE_property_getter,
1008 dwarf::DW_FORM_string, GetterName);
1009 StringRef SetterName = DT.getObjCPropertySetterName();
1010 if (!SetterName.empty())
1011 addString(MemberDie, dwarf::DW_AT_APPLE_property_setter,
1012 dwarf::DW_FORM_string, SetterName);
1013 unsigned PropertyAttributes = 0;
1014 if (DT.isReadOnlyObjCProperty())
1015 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1016 if (DT.isReadWriteObjCProperty())
1017 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1018 if (DT.isAssignObjCProperty())
1019 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1020 if (DT.isRetainObjCProperty())
1021 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1022 if (DT.isCopyObjCProperty())
1023 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1024 if (DT.isNonAtomicObjCProperty())
1025 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1026 if (PropertyAttributes)
1027 addUInt(MemberDie, dwarf::DW_AT_APPLE_property_attribute, 0,
1028 PropertyAttributes);
1029 }
Devang Patel161b2f42011-04-12 23:21:44 +00001030 return MemberDie;
1031}