1 //===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains support for writing dwarf compile unit.
12 //===----------------------------------------------------------------------===//
14 #define DEBUG_TYPE "dwarfdebug"
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"
29 /// CompileUnit - Compile unit constructor.
30 CompileUnit::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);
35 /// ~CompileUnit - Destructor for compile unit.
36 CompileUnit::~CompileUnit() {
37 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
38 DIEBlocks[j]->~DIEBlock();
41 /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
42 /// information entry.
43 DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
44 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
48 /// addUInt - Add an unsigned integer attribute data and value.
50 void 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);
58 /// addSInt - Add an signed integer attribute data and value.
60 void 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);
67 /// addString - Add a string attribute data and value. DIEString only
68 /// keeps string reference.
69 void CompileUnit::addString(DIE *Die, unsigned Attribute, unsigned Form,
71 DIEValue *Value = new (DIEValueAllocator) DIEString(String);
72 Die->addValue(Attribute, Form, Value);
75 /// addLabel - Add a Dwarf label attribute data and value.
77 void 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);
83 /// addDelta - Add a label delta attribute data and value.
85 void 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);
91 /// addDIEEntry - Add a DIE attribute data and value.
93 void CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
95 Die->addValue(Attribute, Form, createDIEEntry(Entry));
99 /// addBlock - Add block data.
101 void CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
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);
108 /// addSourceLine - Add location information to specified debug information
110 void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
115 unsigned Line = V.getLineNumber();
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);
125 /// addSourceLine - Add location information to specified debug information
127 void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
128 // Verify global variable.
132 unsigned Line = G.getLineNumber();
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);
142 /// addSourceLine - Add location information to specified debug information
144 void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
145 // Verify subprogram.
148 // If the line number is 0, don't add it.
149 if (SP.getLineNumber() == 0)
152 unsigned Line = SP.getLineNumber();
153 if (!SP.getContext().Verify())
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);
161 /// addSourceLine - Add location information to specified debug information
163 void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
168 unsigned Line = Ty.getLineNumber();
169 if (Line == 0 || !Ty.getContext().Verify())
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);
177 /// addSourceLine - Add location information to specified debug information
179 void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
184 unsigned Line = NS.getLineNumber();
187 StringRef FN = NS.getFilename();
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);
195 /// addVariableAddress - Add DW_AT_location attribute for a
196 /// DbgVariable based on provided MachineLocation.
197 void CompileUnit::addVariableAddress(DbgVariable *&DV, DIE *Die,
198 MachineLocation Location) {
199 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);
204 addAddress(Die, dwarf::DW_AT_location, Location);
207 /// addRegisterOp - Add register operand.
208 void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
209 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
210 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
212 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
214 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
215 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
219 /// addRegisterOffset - Add register offset.
220 void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
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);
229 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
231 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
232 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
234 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
237 /// addAddress - Add an address attribute to a die based on the location
239 void CompileUnit::addAddress(DIE *Die, unsigned Attribute,
240 const MachineLocation &Location) {
241 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
243 if (Location.isReg())
244 addRegisterOp(Block, Location.getReg());
246 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
248 // Now attach the location information to the DIE.
249 addBlock(Die, Attribute, 0, Block);
252 /// 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.
257 void CompileUnit::addComplexAddress(DbgVariable *&DV, DIE *Die,
259 const MachineLocation &Location) {
260 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
262 if (Location.isReg())
263 addRegisterOp(Block, Location.getReg());
265 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
267 for (unsigned i = 0, N = DV->getNumAddrElements(); i < N; ++i) {
268 uint64_t Element = DV->getAddrElement(i);
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");
278 // Now attach the location information to the DIE.
279 addBlock(Die, Attribute, 0, Block);
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.
288 However, as far as the original *programmer* is concerned, the variable
289 should still have type 'SomeType', as originally declared.
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.
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.
304 The struct will look something like:
306 struct __Block_byref_x_VarName {
308 struct __Block_byref_x_VarName *forwarding;
309 ... <various other fields>
311 ... <maybe more fields>
314 If we are given the struct directly (as our starting point) we
315 need to tell the debugger to:
317 1). Add the offset of the forwarding field.
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).
322 3). Add the offset for the field VarName, to find the actual variable.
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:
329 DW_OP_deref -- optional, if we start with a pointer
330 DW_OP_plus_uconst <forward_fld_offset>
332 DW_OP_plus_uconst <varName_fld_offset>
334 That is what this function does. */
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.
342 void CompileUnit::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
344 const MachineLocation &Location) {
345 DIType Ty = DV->getType();
347 unsigned Tag = Ty.getTag();
348 bool isPointer = false;
350 StringRef varName = DV->getName();
352 if (Tag == dwarf::DW_TAG_pointer_type) {
353 DIDerivedType DTy = DIDerivedType(Ty);
354 TmpTy = DTy.getTypeDerivedFrom();
358 DICompositeType blockStruct = DICompositeType(TmpTy);
360 // Find the __forwarding field and the variable field in the __Block_byref
362 DIArray Fields = blockStruct.getTypeArray();
363 DIDescriptor varField = DIDescriptor();
364 DIDescriptor forwardingField = DIDescriptor();
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)
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;
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();
388 if (Location.isReg()) {
390 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
392 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
393 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
397 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
399 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
400 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
403 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
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).
409 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
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);
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);
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);
431 // Now attach the location information to the DIE.
432 addBlock(Die, Attribute, 0, Block);
435 /// addConstantValue - Add constant value entry in variable DIE.
436 bool 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);
445 /// addConstantFPValue - Add constant value entry in variable DIE.
446 bool 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();
451 // Get the raw data form of the floating point.
452 const APInt FltVal = FPImm.bitcastToAPInt();
453 const char *FltPtr = (const char*)FltVal.getRawData();
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);
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]);
466 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
470 /// addConstantValue - Add constant value entry in variable DIE.
471 bool CompileUnit::addConstantValue(DIE *Die, ConstantInt *CI,
473 if (CI->getBitWidth() <= 64) {
475 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
478 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
483 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
485 // Get the raw data form of the large APInt.
486 const APInt Val = CI->getValue();
487 const char *Ptr = (const char*)Val.getRawData();
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);
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]);
500 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
504 /// addTemplateParams - Add template parameters in buffer.
505 void 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)));
518 /// addToContextOwner - Add Die into the list of its context owner's children.
519 void 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);
535 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
537 DIE *CompileUnit::getOrCreateTypeDIE(DIType Ty) {
538 DIE *TyDIE = getDIE(Ty);
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));
550 assert(Ty.isDerivedType() && "Unknown kind of DIType");
551 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
554 addToContextOwner(TyDIE, Ty.getContext());
558 /// addType - Add a new type attribute to the specified entity.
559 void CompileUnit::addType(DIE *Entity, DIType Ty) {
563 // Check for pre-existence.
564 DIEEntry *Entry = getDIEEntry(Ty);
565 // If it exists then use the existing value.
567 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
572 DIE *Buffer = getOrCreateTypeDIE(Ty);
575 Entry = createDIEEntry(Buffer);
576 insertDIEEntry(Ty, Entry);
578 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
581 /// constructTypeDIE - Construct basic type die from DIBasicType.
582 void 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,
589 // Add name if not anonymous or intermediate type.
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);
596 /// constructTypeDIE - Construct derived type die from DIDerivedType.
597 void 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();
603 // FIXME - Workaround for templates.
604 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
608 // Map to main type, void will not have a type.
609 DIType FromTy = DTy.getTypeDerivedFrom();
610 addType(&Buffer, FromTy);
612 // Add name if not anonymous or intermediate type.
614 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
616 // Add size if non-zero (derived types might be zero-sized.)
618 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
620 // Add source line info if available and TyDesc is not a forward declaration.
621 if (!DTy.isForwardDecl())
622 addSourceLine(&Buffer, DTy);
625 /// constructTypeDIE - Construct type DIE from DICompositeType.
626 void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
627 // Get core information.
628 StringRef Name = CTy.getName();
630 uint64_t Size = CTy.getSizeInBits() >> 3;
631 unsigned Tag = CTy.getTag();
635 case dwarf::DW_TAG_vector_type:
636 case dwarf::DW_TAG_array_type:
637 constructArrayTypeDIE(Buffer, &CTy);
639 case dwarf::DW_TAG_enumeration_type: {
640 DIArray Elements = CTy.getTypeArray();
642 // Add enumerators to enumeration type.
643 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
645 DIDescriptor Enum(Elements.getElement(i));
646 if (Enum.isEnumerator()) {
647 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
648 Buffer.addChild(ElemDie);
653 case dwarf::DW_TAG_subroutine_type: {
655 DIArray Elements = CTy.getTypeArray();
656 DIDescriptor RTy = Elements.getElement(0);
657 addType(&Buffer, DIType(RTy));
659 bool isPrototyped = true;
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;
668 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
669 addType(Arg, DIType(Ty));
670 Buffer.addChild(Arg);
673 // Add prototype flag.
675 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
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();
684 // A forward struct declared type may not have elements available.
685 unsigned N = Elements.getNumElements();
689 // Add elements to structure type.
690 for (unsigned i = 0; i < N; ++i) {
691 DIDescriptor Element = Elements.getElement(i);
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);
703 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
704 dwarf::DW_ACCESS_public);
706 addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
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,
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));
721 Buffer.addChild(ElemDie);
724 if (CTy.isAppleBlockExtension())
725 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
727 unsigned RLang = CTy.getRunTimeLang();
729 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
730 dwarf::DW_FORM_data1, RLang);
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)));
737 DIDescriptor Context = CTy.getContext();
738 addToContextOwner(&Buffer, Context);
741 if (Tag == dwarf::DW_TAG_class_type)
742 addTemplateParams(Buffer, CTy.getTemplateParams());
750 // Add name if not anonymous or intermediate type.
752 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
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)
757 // Add size if non-zero (derived types might be zero-sized.)
759 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
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);
765 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
768 // Add source line info if available.
769 if (!CTy.isForwardDecl())
770 addSourceLine(&Buffer, CTy);
774 /// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
775 /// for the given DITemplateTypeParameter.
777 CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
778 DIE *ParamDIE = getDIE(TP);
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());
788 /// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
789 /// for the given DITemplateValueParameter.
791 CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) {
792 DIE *ParamDIE = getDIE(TPV);
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,
805 /// constructSubrangeDIE - Construct subrange DIE from DISubrange.
806 void 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();
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.
819 Buffer.addChild(DW_Subrange);
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);
828 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
829 void 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);
835 // Emit derived type.
836 addType(&Buffer, CTy->getTypeDerivedFrom());
837 DIArray Elements = CTy->getTypeArray();
839 // Get an anonymous type for index type.
840 DIE *IdxTy = getIndexTyDie();
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);
848 setIndexTyDie(IdxTy);
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);
859 /// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
860 DIE *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);
869 /// createMemberDIE - Create new member DIE.
870 DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
871 DIE *MemberDie = new DIE(DT.getTag());
872 StringRef Name = DT.getName();
874 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
876 addType(MemberDie, DT.getTypeDerivedFrom());
878 addSourceLine(MemberDie, DT);
880 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
881 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
883 uint64_t Size = DT.getSizeInBits();
884 uint64_t FieldSize = DT.getOriginalTypeSize();
886 if (Size != FieldSize) {
888 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
889 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
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;
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);
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);
907 // This is not a bitfield.
908 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
910 if (DT.getTag() == dwarf::DW_TAG_inheritance
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)
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);
926 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
929 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
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);
942 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
943 dwarf::DW_VIRTUALITY_virtual);
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,
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,