blob: fa5cdd248a7071c144976c55baa5148a30ae1e1c [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();
261
Devang Patel116da2f2011-04-26 19:06:18 +0000262 if (Location.isReg())
263 addRegisterOp(Block, Location.getReg());
264 else
265 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000266
267 for (unsigned i = 0, N = DV->getNumAddrElements(); i < N; ++i) {
268 uint64_t Element = DV->getAddrElement(i);
269
270 if (Element == DIBuilder::OpPlus) {
271 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
272 addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
273 } else if (Element == DIBuilder::OpDeref) {
274 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
275 } else llvm_unreachable("unknown DIBuilder Opcode");
276 }
277
278 // Now attach the location information to the DIE.
279 addBlock(Die, Attribute, 0, Block);
280}
281
282/* Byref variables, in Blocks, are declared by the programmer as "SomeType
283 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
284 gives the variable VarName either the struct, or a pointer to the struct, as
285 its type. This is necessary for various behind-the-scenes things the
286 compiler needs to do with by-reference variables in Blocks.
287
288 However, as far as the original *programmer* is concerned, the variable
289 should still have type 'SomeType', as originally declared.
290
291 The function getBlockByrefType dives into the __Block_byref_x_VarName
292 struct to find the original type of the variable, which is then assigned to
293 the variable's Debug Information Entry as its real type. So far, so good.
294 However now the debugger will expect the variable VarName to have the type
295 SomeType. So we need the location attribute for the variable to be an
296 expression that explains to the debugger how to navigate through the
297 pointers and struct to find the actual variable of type SomeType.
298
299 The following function does just that. We start by getting
300 the "normal" location for the variable. This will be the location
301 of either the struct __Block_byref_x_VarName or the pointer to the
302 struct __Block_byref_x_VarName.
303
304 The struct will look something like:
305
306 struct __Block_byref_x_VarName {
307 ... <various fields>
308 struct __Block_byref_x_VarName *forwarding;
309 ... <various other fields>
310 SomeType VarName;
311 ... <maybe more fields>
312 };
313
314 If we are given the struct directly (as our starting point) we
315 need to tell the debugger to:
316
317 1). Add the offset of the forwarding field.
318
319 2). Follow that pointer to get the real __Block_byref_x_VarName
320 struct to use (the real one may have been copied onto the heap).
321
322 3). Add the offset for the field VarName, to find the actual variable.
323
324 If we started with a pointer to the struct, then we need to
325 dereference that pointer first, before the other steps.
326 Translating this into DWARF ops, we will need to append the following
327 to the current location description for the variable:
328
329 DW_OP_deref -- optional, if we start with a pointer
330 DW_OP_plus_uconst <forward_fld_offset>
331 DW_OP_deref
332 DW_OP_plus_uconst <varName_fld_offset>
333
334 That is what this function does. */
335
336/// addBlockByrefAddress - Start with the address based on the location
337/// provided, and generate the DWARF information necessary to find the
338/// actual Block variable (navigating the Block struct) based on the
339/// starting location. Add the DWARF information to the die. For
340/// more information, read large comment just above here.
341///
342void CompileUnit::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
343 unsigned Attribute,
344 const MachineLocation &Location) {
345 DIType Ty = DV->getType();
346 DIType TmpTy = Ty;
347 unsigned Tag = Ty.getTag();
348 bool isPointer = false;
349
350 StringRef varName = DV->getName();
351
352 if (Tag == dwarf::DW_TAG_pointer_type) {
353 DIDerivedType DTy = DIDerivedType(Ty);
354 TmpTy = DTy.getTypeDerivedFrom();
355 isPointer = true;
356 }
357
358 DICompositeType blockStruct = DICompositeType(TmpTy);
359
360 // Find the __forwarding field and the variable field in the __Block_byref
361 // struct.
362 DIArray Fields = blockStruct.getTypeArray();
363 DIDescriptor varField = DIDescriptor();
364 DIDescriptor forwardingField = DIDescriptor();
365
366 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
367 DIDescriptor Element = Fields.getElement(i);
368 DIDerivedType DT = DIDerivedType(Element);
369 StringRef fieldName = DT.getName();
370 if (fieldName == "__forwarding")
371 forwardingField = Element;
372 else if (fieldName == varName)
373 varField = Element;
374 }
375
376 // Get the offsets for the forwarding field and the variable field.
377 unsigned forwardingFieldOffset =
378 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
379 unsigned varFieldOffset =
380 DIDerivedType(varField).getOffsetInBits() >> 3;
381
382 // Decode the original location, and use that as the start of the byref
383 // variable's location.
384 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
385 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
386 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
387
388 if (Location.isReg()) {
389 if (Reg < 32)
390 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
391 else {
392 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
393 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
394 }
395 } else {
396 if (Reg < 32)
397 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
398 else {
399 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
400 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
401 }
402
403 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
404 }
405
406 // If we started with a pointer to the __Block_byref... struct, then
407 // the first thing we need to do is dereference the pointer (DW_OP_deref).
408 if (isPointer)
409 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
410
411 // Next add the offset for the '__forwarding' field:
412 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
413 // adding the offset if it's 0.
414 if (forwardingFieldOffset > 0) {
415 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
416 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
417 }
418
419 // Now dereference the __forwarding field to get to the real __Block_byref
420 // struct: DW_OP_deref.
421 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
422
423 // Now that we've got the real __Block_byref... struct, add the offset
424 // for the variable's field to get to the location of the actual variable:
425 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
426 if (varFieldOffset > 0) {
427 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
428 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
429 }
430
431 // Now attach the location information to the DIE.
432 addBlock(Die, Attribute, 0, Block);
433}
434
Devang Patel161b2f42011-04-12 23:21:44 +0000435/// addConstantValue - Add constant value entry in variable DIE.
436bool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO) {
437 assert (MO.isImm() && "Invalid machine operand!");
438 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
439 unsigned Imm = MO.getImm();
440 addUInt(Block, 0, dwarf::DW_FORM_udata, Imm);
441 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
442 return true;
443}
444
445/// addConstantFPValue - Add constant value entry in variable DIE.
446bool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
447 assert (MO.isFPImm() && "Invalid machine operand!");
448 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
449 APFloat FPImm = MO.getFPImm()->getValueAPF();
450
451 // Get the raw data form of the floating point.
452 const APInt FltVal = FPImm.bitcastToAPInt();
453 const char *FltPtr = (const char*)FltVal.getRawData();
454
455 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
456 bool LittleEndian = Asm->getTargetData().isLittleEndian();
457 int Incr = (LittleEndian ? 1 : -1);
458 int Start = (LittleEndian ? 0 : NumBytes - 1);
459 int Stop = (LittleEndian ? NumBytes : -1);
460
461 // Output the constant to DWARF one byte at a time.
462 for (; Start != Stop; Start += Incr)
463 addUInt(Block, 0, dwarf::DW_FORM_data1,
464 (unsigned char)0xFF & FltPtr[Start]);
465
466 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
467 return true;
468}
469
470/// addConstantValue - Add constant value entry in variable DIE.
471bool CompileUnit::addConstantValue(DIE *Die, ConstantInt *CI,
472 bool Unsigned) {
473 if (CI->getBitWidth() <= 64) {
474 if (Unsigned)
475 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
476 CI->getZExtValue());
477 else
478 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
479 CI->getSExtValue());
480 return true;
481 }
482
483 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
484
485 // Get the raw data form of the large APInt.
486 const APInt Val = CI->getValue();
487 const char *Ptr = (const char*)Val.getRawData();
488
489 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
490 bool LittleEndian = Asm->getTargetData().isLittleEndian();
491 int Incr = (LittleEndian ? 1 : -1);
492 int Start = (LittleEndian ? 0 : NumBytes - 1);
493 int Stop = (LittleEndian ? NumBytes : -1);
494
495 // Output the constant to DWARF one byte at a time.
496 for (; Start != Stop; Start += Incr)
497 addUInt(Block, 0, dwarf::DW_FORM_data1,
498 (unsigned char)0xFF & Ptr[Start]);
499
500 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
501 return true;
502}
503
504/// addTemplateParams - Add template parameters in buffer.
505void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
506 // Add template parameters.
507 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
508 DIDescriptor Element = TParams.getElement(i);
509 if (Element.isTemplateTypeParameter())
510 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
511 DITemplateTypeParameter(Element)));
512 else if (Element.isTemplateValueParameter())
513 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
514 DITemplateValueParameter(Element)));
515 }
516
517}
518/// addToContextOwner - Add Die into the list of its context owner's children.
519void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
520 if (Context.isType()) {
521 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
522 ContextDIE->addChild(Die);
523 } else if (Context.isNameSpace()) {
524 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
525 ContextDIE->addChild(Die);
526 } else if (Context.isSubprogram()) {
527 DIE *ContextDIE = DD->createSubprogramDIE(DISubprogram(Context));
528 ContextDIE->addChild(Die);
529 } else if (DIE *ContextDIE = getDIE(Context))
530 ContextDIE->addChild(Die);
531 else
532 addDie(Die);
533}
534
535/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
536/// given DIType.
537DIE *CompileUnit::getOrCreateTypeDIE(DIType Ty) {
538 DIE *TyDIE = getDIE(Ty);
539 if (TyDIE)
540 return TyDIE;
541
542 // Create new type.
543 TyDIE = new DIE(dwarf::DW_TAG_base_type);
544 insertDIE(Ty, TyDIE);
545 if (Ty.isBasicType())
546 constructTypeDIE(*TyDIE, DIBasicType(Ty));
547 else if (Ty.isCompositeType())
548 constructTypeDIE(*TyDIE, DICompositeType(Ty));
549 else {
550 assert(Ty.isDerivedType() && "Unknown kind of DIType");
551 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
552 }
553
554 addToContextOwner(TyDIE, Ty.getContext());
555 return TyDIE;
556}
557
558/// addType - Add a new type attribute to the specified entity.
559void CompileUnit::addType(DIE *Entity, DIType Ty) {
560 if (!Ty.Verify())
561 return;
562
563 // Check for pre-existence.
564 DIEEntry *Entry = getDIEEntry(Ty);
565 // If it exists then use the existing value.
566 if (Entry) {
567 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
568 return;
569 }
570
571 // Construct type.
572 DIE *Buffer = getOrCreateTypeDIE(Ty);
573
574 // Set up proxy.
575 Entry = createDIEEntry(Buffer);
576 insertDIEEntry(Ty, Entry);
577
578 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
579}
580
581/// constructTypeDIE - Construct basic type die from DIBasicType.
582void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
583 // Get core information.
584 StringRef Name = BTy.getName();
585 Buffer.setTag(dwarf::DW_TAG_base_type);
586 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
587 BTy.getEncoding());
588
589 // Add name if not anonymous or intermediate type.
590 if (!Name.empty())
591 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
592 uint64_t Size = BTy.getSizeInBits() >> 3;
593 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
594}
595
596/// constructTypeDIE - Construct derived type die from DIDerivedType.
597void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
598 // Get core information.
599 StringRef Name = DTy.getName();
600 uint64_t Size = DTy.getSizeInBits() >> 3;
601 unsigned Tag = DTy.getTag();
602
603 // FIXME - Workaround for templates.
604 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
605
606 Buffer.setTag(Tag);
607
608 // Map to main type, void will not have a type.
609 DIType FromTy = DTy.getTypeDerivedFrom();
610 addType(&Buffer, FromTy);
611
612 // Add name if not anonymous or intermediate type.
613 if (!Name.empty())
614 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
615
616 // Add size if non-zero (derived types might be zero-sized.)
617 if (Size)
618 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
619
620 // Add source line info if available and TyDesc is not a forward declaration.
621 if (!DTy.isForwardDecl())
622 addSourceLine(&Buffer, DTy);
623}
624
625/// constructTypeDIE - Construct type DIE from DICompositeType.
626void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
627 // Get core information.
628 StringRef Name = CTy.getName();
629
630 uint64_t Size = CTy.getSizeInBits() >> 3;
631 unsigned Tag = CTy.getTag();
632 Buffer.setTag(Tag);
633
634 switch (Tag) {
635 case dwarf::DW_TAG_vector_type:
636 case dwarf::DW_TAG_array_type:
637 constructArrayTypeDIE(Buffer, &CTy);
638 break;
639 case dwarf::DW_TAG_enumeration_type: {
640 DIArray Elements = CTy.getTypeArray();
641
642 // Add enumerators to enumeration type.
643 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
644 DIE *ElemDie = NULL;
645 DIDescriptor Enum(Elements.getElement(i));
646 if (Enum.isEnumerator()) {
647 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
648 Buffer.addChild(ElemDie);
649 }
650 }
651 }
652 break;
653 case dwarf::DW_TAG_subroutine_type: {
654 // Add return type.
655 DIArray Elements = CTy.getTypeArray();
656 DIDescriptor RTy = Elements.getElement(0);
657 addType(&Buffer, DIType(RTy));
658
659 bool isPrototyped = true;
660 // Add arguments.
661 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
662 DIDescriptor Ty = Elements.getElement(i);
663 if (Ty.isUnspecifiedParameter()) {
664 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
665 Buffer.addChild(Arg);
666 isPrototyped = false;
667 } else {
668 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
669 addType(Arg, DIType(Ty));
670 Buffer.addChild(Arg);
671 }
672 }
673 // Add prototype flag.
674 if (isPrototyped)
675 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
676 }
677 break;
678 case dwarf::DW_TAG_structure_type:
679 case dwarf::DW_TAG_union_type:
680 case dwarf::DW_TAG_class_type: {
681 // Add elements to structure type.
682 DIArray Elements = CTy.getTypeArray();
683
684 // A forward struct declared type may not have elements available.
685 unsigned N = Elements.getNumElements();
686 if (N == 0)
687 break;
688
689 // Add elements to structure type.
690 for (unsigned i = 0; i < N; ++i) {
691 DIDescriptor Element = Elements.getElement(i);
692 DIE *ElemDie = NULL;
693 if (Element.isSubprogram()) {
694 DISubprogram SP(Element);
695 ElemDie = DD->createSubprogramDIE(DISubprogram(Element));
696 if (SP.isProtected())
697 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
698 dwarf::DW_ACCESS_protected);
699 else if (SP.isPrivate())
700 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
701 dwarf::DW_ACCESS_private);
702 else
703 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
704 dwarf::DW_ACCESS_public);
705 if (SP.isExplicit())
706 addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
707 }
708 else if (Element.isVariable()) {
709 DIVariable DV(Element);
710 ElemDie = new DIE(dwarf::DW_TAG_variable);
711 addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
712 DV.getName());
713 addType(ElemDie, DV.getType());
714 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
715 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
716 addSourceLine(ElemDie, DV);
717 } else if (Element.isDerivedType())
718 ElemDie = createMemberDIE(DIDerivedType(Element));
719 else
720 continue;
721 Buffer.addChild(ElemDie);
722 }
723
724 if (CTy.isAppleBlockExtension())
725 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
726
727 unsigned RLang = CTy.getRunTimeLang();
728 if (RLang)
729 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
730 dwarf::DW_FORM_data1, RLang);
731
732 DICompositeType ContainingType = CTy.getContainingType();
733 if (DIDescriptor(ContainingType).isCompositeType())
734 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
735 getOrCreateTypeDIE(DIType(ContainingType)));
736 else {
737 DIDescriptor Context = CTy.getContext();
738 addToContextOwner(&Buffer, Context);
739 }
740
741 if (Tag == dwarf::DW_TAG_class_type)
742 addTemplateParams(Buffer, CTy.getTemplateParams());
743
744 break;
745 }
746 default:
747 break;
748 }
749
750 // Add name if not anonymous or intermediate type.
751 if (!Name.empty())
752 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
753
754 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
755 || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
756 {
757 // Add size if non-zero (derived types might be zero-sized.)
758 if (Size)
759 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
760 else {
761 // Add zero size if it is not a forward declaration.
762 if (CTy.isForwardDecl())
763 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
764 else
765 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
766 }
767
768 // Add source line info if available.
769 if (!CTy.isForwardDecl())
770 addSourceLine(&Buffer, CTy);
771 }
772}
773
774/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
775/// for the given DITemplateTypeParameter.
776DIE *
777CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
778 DIE *ParamDIE = getDIE(TP);
779 if (ParamDIE)
780 return ParamDIE;
781
782 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
783 addType(ParamDIE, TP.getType());
784 addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TP.getName());
785 return ParamDIE;
786}
787
788/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
789/// for the given DITemplateValueParameter.
790DIE *
791CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) {
792 DIE *ParamDIE = getDIE(TPV);
793 if (ParamDIE)
794 return ParamDIE;
795
796 ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
797 addType(ParamDIE, TPV.getType());
798 if (!TPV.getName().empty())
799 addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TPV.getName());
800 addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
801 TPV.getValue());
802 return ParamDIE;
803}
804
805/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
806void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
807 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
808 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
809 int64_t L = SR.getLo();
810 int64_t H = SR.getHi();
811
812 // The L value defines the lower bounds which is typically zero for C/C++. The
813 // H value is the upper bounds. Values are 64 bit. H - L + 1 is the size
814 // of the array. If L > H then do not emit DW_AT_lower_bound and
815 // DW_AT_upper_bound attributes. If L is zero and H is also zero then the
816 // array has one element and in such case do not emit lower bound.
817
818 if (L > H) {
819 Buffer.addChild(DW_Subrange);
820 return;
821 }
822 if (L)
823 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
824 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
825 Buffer.addChild(DW_Subrange);
826}
827
828/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
829void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
830 DICompositeType *CTy) {
831 Buffer.setTag(dwarf::DW_TAG_array_type);
832 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
833 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
834
835 // Emit derived type.
836 addType(&Buffer, CTy->getTypeDerivedFrom());
837 DIArray Elements = CTy->getTypeArray();
838
839 // Get an anonymous type for index type.
840 DIE *IdxTy = getIndexTyDie();
841 if (!IdxTy) {
842 // Construct an anonymous type for index type.
843 IdxTy = new DIE(dwarf::DW_TAG_base_type);
844 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
845 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
846 dwarf::DW_ATE_signed);
847 addDie(IdxTy);
848 setIndexTyDie(IdxTy);
849 }
850
851 // Add subranges to array type.
852 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
853 DIDescriptor Element = Elements.getElement(i);
854 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
855 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
856 }
857}
858
859/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
860DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
861 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
862 StringRef Name = ETy.getName();
863 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
864 int64_t Value = ETy.getEnumValue();
865 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
866 return Enumerator;
867}
868
869/// createMemberDIE - Create new member DIE.
870DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
871 DIE *MemberDie = new DIE(DT.getTag());
872 StringRef Name = DT.getName();
873 if (!Name.empty())
874 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
875
876 addType(MemberDie, DT.getTypeDerivedFrom());
877
878 addSourceLine(MemberDie, DT);
879
880 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
881 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
882
883 uint64_t Size = DT.getSizeInBits();
884 uint64_t FieldSize = DT.getOriginalTypeSize();
885
886 if (Size != FieldSize) {
887 // Handle bitfield.
888 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
889 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
890
891 uint64_t Offset = DT.getOffsetInBits();
892 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
893 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
894 uint64_t FieldOffset = (HiMark - FieldSize);
895 Offset -= FieldOffset;
896
897 // Maybe we need to work from the other end.
898 if (Asm->getTargetData().isLittleEndian())
899 Offset = FieldSize - (Offset + Size);
900 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
901
902 // Here WD_AT_data_member_location points to the anonymous
903 // field that includes this bit field.
904 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
905
906 } else
907 // This is not a bitfield.
908 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
909
910 if (DT.getTag() == dwarf::DW_TAG_inheritance
911 && DT.isVirtual()) {
912
913 // For C++, virtual base classes are not at fixed offset. Use following
914 // expression to extract appropriate offset from vtable.
915 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
916
917 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
918 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
919 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
920 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
921 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
922 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
923 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
924 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
925
926 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
927 VBaseLocationDie);
928 } else
929 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
930
931 if (DT.isProtected())
932 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
933 dwarf::DW_ACCESS_protected);
934 else if (DT.isPrivate())
935 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
936 dwarf::DW_ACCESS_private);
937 // Otherwise C++ member and base classes are considered public.
938 else if (DT.getCompileUnit().getLanguage() == dwarf::DW_LANG_C_plus_plus)
939 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
940 dwarf::DW_ACCESS_public);
941 if (DT.isVirtual())
942 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
943 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +0000944
945 // Objective-C properties.
946 StringRef PropertyName = DT.getObjCPropertyName();
947 if (!PropertyName.empty()) {
948 addString(MemberDie, dwarf::DW_AT_APPLE_property_name, dwarf::DW_FORM_string,
949 PropertyName);
950 StringRef GetterName = DT.getObjCPropertyGetterName();
951 if (!GetterName.empty())
952 addString(MemberDie, dwarf::DW_AT_APPLE_property_getter,
953 dwarf::DW_FORM_string, GetterName);
954 StringRef SetterName = DT.getObjCPropertySetterName();
955 if (!SetterName.empty())
956 addString(MemberDie, dwarf::DW_AT_APPLE_property_setter,
957 dwarf::DW_FORM_string, SetterName);
958 unsigned PropertyAttributes = 0;
959 if (DT.isReadOnlyObjCProperty())
960 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
961 if (DT.isReadWriteObjCProperty())
962 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
963 if (DT.isAssignObjCProperty())
964 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
965 if (DT.isRetainObjCProperty())
966 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
967 if (DT.isCopyObjCProperty())
968 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
969 if (DT.isNonAtomicObjCProperty())
970 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
971 if (PropertyAttributes)
972 addUInt(MemberDie, dwarf::DW_AT_APPLE_property_attribute, 0,
973 PropertyAttributes);
974 }
Devang Patel161b2f42011-04-12 23:21:44 +0000975 return MemberDie;
976}