blob: 389ae46b646eb3e3a4922de39e32a7a96b5c6e94 [file] [log] [blame]
Devang Patel161b2f42011-04-12 23:21:44 +00001//===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains support for writing dwarf compile unit.
11//
12//===----------------------------------------------------------------------===//
13
14#define DEBUG_TYPE "dwarfdebug"
15
Eric Christopherc36145f2012-01-06 04:35:23 +000016#include "DwarfAccelTable.h"
Devang Patel161b2f42011-04-12 23:21:44 +000017#include "DwarfCompileUnit.h"
18#include "DwarfDebug.h"
19#include "llvm/Constants.h"
Devang Patel6f9d8ff2011-08-15 17:57:41 +000020#include "llvm/GlobalVariable.h"
21#include "llvm/Instructions.h"
Devang Patel161b2f42011-04-12 23:21:44 +000022#include "llvm/Analysis/DIBuilder.h"
Eric Christopherd61c34b2011-11-11 03:16:32 +000023#include "llvm/Support/Debug.h"
Devang Patel6f9d8ff2011-08-15 17:57:41 +000024#include "llvm/Target/Mangler.h"
Devang Patel161b2f42011-04-12 23:21:44 +000025#include "llvm/Target/TargetData.h"
26#include "llvm/Target/TargetFrameLowering.h"
27#include "llvm/Target/TargetMachine.h"
28#include "llvm/Target/TargetRegisterInfo.h"
29#include "llvm/ADT/APFloat.h"
30#include "llvm/Support/ErrorHandling.h"
31
32using namespace llvm;
33
34/// CompileUnit - Compile unit constructor.
Eric Christopher438b0922012-02-22 08:46:13 +000035CompileUnit::CompileUnit(unsigned I, unsigned L, DIE *D, AsmPrinter *A,
36 DwarfDebug *DW)
37 : ID(I), Language(L), CUDie(D), Asm(A), DD(DW), IndexTyDie(0) {
Devang Patel161b2f42011-04-12 23:21:44 +000038 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
39}
40
41/// ~CompileUnit - Destructor for compile unit.
42CompileUnit::~CompileUnit() {
43 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
44 DIEBlocks[j]->~DIEBlock();
45}
46
47/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
48/// information entry.
49DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
50 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
51 return Value;
52}
53
54/// addUInt - Add an unsigned integer attribute data and value.
55///
56void CompileUnit::addUInt(DIE *Die, unsigned Attribute,
57 unsigned Form, uint64_t Integer) {
58 if (!Form) Form = DIEInteger::BestForm(false, Integer);
59 DIEValue *Value = Integer == 1 ?
60 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
61 Die->addValue(Attribute, Form, Value);
62}
63
64/// addSInt - Add an signed integer attribute data and value.
65///
66void CompileUnit::addSInt(DIE *Die, unsigned Attribute,
67 unsigned Form, int64_t Integer) {
68 if (!Form) Form = DIEInteger::BestForm(true, Integer);
69 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
70 Die->addValue(Attribute, Form, Value);
71}
72
Nick Lewycky6a7efcf2011-10-28 05:29:47 +000073/// addString - Add a string attribute data and value. We always emit a
74/// reference to the string pool instead of immediate strings so that DIEs have
75/// more predictable sizes.
Nick Lewycky390c40d2011-10-27 06:44:11 +000076void CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) {
Nick Lewycky6a7efcf2011-10-28 05:29:47 +000077 MCSymbol *Symb = DD->getStringPoolEntry(String);
78 DIEValue *Value;
79 if (Asm->needsRelocationsForDwarfStringPool())
80 Value = new (DIEValueAllocator) DIELabel(Symb);
81 else {
82 MCSymbol *StringPool = DD->getStringPool();
83 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewycky390c40d2011-10-27 06:44:11 +000084 }
Nick Lewycky6a7efcf2011-10-28 05:29:47 +000085 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel161b2f42011-04-12 23:21:44 +000086}
87
88/// addLabel - Add a Dwarf label attribute data and value.
89///
90void CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
91 const MCSymbol *Label) {
92 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
93 Die->addValue(Attribute, Form, Value);
94}
95
96/// addDelta - Add a label delta attribute data and value.
97///
98void CompileUnit::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
99 const MCSymbol *Hi, const MCSymbol *Lo) {
100 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
101 Die->addValue(Attribute, Form, Value);
102}
103
104/// addDIEEntry - Add a DIE attribute data and value.
105///
106void CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
107 DIE *Entry) {
108 Die->addValue(Attribute, Form, createDIEEntry(Entry));
109}
110
Devang Patel161b2f42011-04-12 23:21:44 +0000111/// addBlock - Add block data.
112///
113void CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
114 DIEBlock *Block) {
115 Block->ComputeSize(Asm);
116 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
117 Die->addValue(Attribute, Block->BestForm(), Block);
118}
119
120/// addSourceLine - Add location information to specified debug information
121/// entry.
122void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
123 // Verify variable.
124 if (!V.Verify())
125 return;
126
127 unsigned Line = V.getLineNumber();
128 if (Line == 0)
129 return;
130 unsigned FileID = DD->GetOrCreateSourceID(V.getContext().getFilename(),
131 V.getContext().getDirectory());
132 assert(FileID && "Invalid file id");
133 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
134 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
135}
136
137/// addSourceLine - Add location information to specified debug information
138/// entry.
139void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
140 // Verify global variable.
141 if (!G.Verify())
142 return;
143
144 unsigned Line = G.getLineNumber();
145 if (Line == 0)
146 return;
Nick Lewycky746cb672011-10-26 22:55:33 +0000147 unsigned FileID = DD->GetOrCreateSourceID(G.getFilename(), G.getDirectory());
Devang Patel161b2f42011-04-12 23:21:44 +0000148 assert(FileID && "Invalid file id");
149 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
150 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
151}
152
153/// addSourceLine - Add location information to specified debug information
154/// entry.
155void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
156 // Verify subprogram.
157 if (!SP.Verify())
158 return;
159 // If the line number is 0, don't add it.
160 if (SP.getLineNumber() == 0)
161 return;
162
163 unsigned Line = SP.getLineNumber();
164 if (!SP.getContext().Verify())
165 return;
Nick Lewycky746cb672011-10-26 22:55:33 +0000166 unsigned FileID = DD->GetOrCreateSourceID(SP.getFilename(),
167 SP.getDirectory());
Devang Patel161b2f42011-04-12 23:21:44 +0000168 assert(FileID && "Invalid file id");
169 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
170 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
171}
172
173/// addSourceLine - Add location information to specified debug information
174/// entry.
175void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
176 // Verify type.
177 if (!Ty.Verify())
178 return;
179
180 unsigned Line = Ty.getLineNumber();
181 if (Line == 0 || !Ty.getContext().Verify())
182 return;
Nick Lewycky746cb672011-10-26 22:55:33 +0000183 unsigned FileID = DD->GetOrCreateSourceID(Ty.getFilename(),
184 Ty.getDirectory());
Devang Patel161b2f42011-04-12 23:21:44 +0000185 assert(FileID && "Invalid file id");
186 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
187 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
188}
189
190/// addSourceLine - Add location information to specified debug information
191/// entry.
192void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
193 // Verify namespace.
194 if (!NS.Verify())
195 return;
196
197 unsigned Line = NS.getLineNumber();
198 if (Line == 0)
199 return;
200 StringRef FN = NS.getFilename();
201
202 unsigned FileID = DD->GetOrCreateSourceID(FN, NS.getDirectory());
203 assert(FileID && "Invalid file id");
204 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
205 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
206}
207
Devang Patele1cdf842011-04-27 22:45:24 +0000208/// addVariableAddress - Add DW_AT_location attribute for a
209/// DbgVariable based on provided MachineLocation.
210void CompileUnit::addVariableAddress(DbgVariable *&DV, DIE *Die,
211 MachineLocation Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000212 if (DV->variableHasComplexAddress())
213 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
214 else if (DV->isBlockByrefVariable())
215 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
216 else
217 addAddress(Die, dwarf::DW_AT_location, Location);
218}
219
Devang Patel116da2f2011-04-26 19:06:18 +0000220/// addRegisterOp - Add register operand.
221void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
222 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
223 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
224 if (DWReg < 32)
225 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
226 else {
227 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
228 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
229 }
230}
231
232/// addRegisterOffset - Add register offset.
233void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
234 int64_t Offset) {
235 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
236 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
237 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
238 if (Reg == TRI->getFrameRegister(*Asm->MF))
239 // If variable offset is based in frame register then use fbreg.
240 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
241 else if (DWReg < 32)
242 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
243 else {
244 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
245 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
246 }
247 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
248}
249
250/// addAddress - Add an address attribute to a die based on the location
251/// provided.
252void CompileUnit::addAddress(DIE *Die, unsigned Attribute,
253 const MachineLocation &Location) {
254 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
255
256 if (Location.isReg())
257 addRegisterOp(Block, Location.getReg());
258 else
259 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
260
261 // Now attach the location information to the DIE.
262 addBlock(Die, Attribute, 0, Block);
263}
264
Devang Patel161b2f42011-04-12 23:21:44 +0000265/// addComplexAddress - Start with the address based on the location provided,
266/// and generate the DWARF information necessary to find the actual variable
267/// given the extra address information encoded in the DIVariable, starting from
268/// the starting location. Add the DWARF information to the die.
269///
270void CompileUnit::addComplexAddress(DbgVariable *&DV, DIE *Die,
271 unsigned Attribute,
272 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000273 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patelc26f5442011-04-28 02:22:40 +0000274 unsigned N = DV->getNumAddrElements();
275 unsigned i = 0;
276 if (Location.isReg()) {
277 if (N >= 2 && DV->getAddrElement(0) == DIBuilder::OpPlus) {
278 // If first address element is OpPlus then emit
279 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
280 addRegisterOffset(Block, Location.getReg(), DV->getAddrElement(1));
281 i = 2;
282 } else
283 addRegisterOp(Block, Location.getReg());
284 }
Devang Patel116da2f2011-04-26 19:06:18 +0000285 else
286 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000287
Devang Patelc26f5442011-04-28 02:22:40 +0000288 for (;i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +0000289 uint64_t Element = DV->getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000290 if (Element == DIBuilder::OpPlus) {
291 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
292 addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
293 } else if (Element == DIBuilder::OpDeref) {
294 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
295 } else llvm_unreachable("unknown DIBuilder Opcode");
296 }
297
298 // Now attach the location information to the DIE.
299 addBlock(Die, Attribute, 0, Block);
300}
301
302/* Byref variables, in Blocks, are declared by the programmer as "SomeType
303 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
304 gives the variable VarName either the struct, or a pointer to the struct, as
305 its type. This is necessary for various behind-the-scenes things the
306 compiler needs to do with by-reference variables in Blocks.
307
308 However, as far as the original *programmer* is concerned, the variable
309 should still have type 'SomeType', as originally declared.
310
311 The function getBlockByrefType dives into the __Block_byref_x_VarName
312 struct to find the original type of the variable, which is then assigned to
313 the variable's Debug Information Entry as its real type. So far, so good.
314 However now the debugger will expect the variable VarName to have the type
315 SomeType. So we need the location attribute for the variable to be an
316 expression that explains to the debugger how to navigate through the
317 pointers and struct to find the actual variable of type SomeType.
318
319 The following function does just that. We start by getting
320 the "normal" location for the variable. This will be the location
321 of either the struct __Block_byref_x_VarName or the pointer to the
322 struct __Block_byref_x_VarName.
323
324 The struct will look something like:
325
326 struct __Block_byref_x_VarName {
327 ... <various fields>
328 struct __Block_byref_x_VarName *forwarding;
329 ... <various other fields>
330 SomeType VarName;
331 ... <maybe more fields>
332 };
333
334 If we are given the struct directly (as our starting point) we
335 need to tell the debugger to:
336
337 1). Add the offset of the forwarding field.
338
339 2). Follow that pointer to get the real __Block_byref_x_VarName
340 struct to use (the real one may have been copied onto the heap).
341
342 3). Add the offset for the field VarName, to find the actual variable.
343
344 If we started with a pointer to the struct, then we need to
345 dereference that pointer first, before the other steps.
346 Translating this into DWARF ops, we will need to append the following
347 to the current location description for the variable:
348
349 DW_OP_deref -- optional, if we start with a pointer
350 DW_OP_plus_uconst <forward_fld_offset>
351 DW_OP_deref
352 DW_OP_plus_uconst <varName_fld_offset>
353
354 That is what this function does. */
355
356/// addBlockByrefAddress - Start with the address based on the location
357/// provided, and generate the DWARF information necessary to find the
358/// actual Block variable (navigating the Block struct) based on the
359/// starting location. Add the DWARF information to the die. For
360/// more information, read large comment just above here.
361///
362void CompileUnit::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
363 unsigned Attribute,
364 const MachineLocation &Location) {
365 DIType Ty = DV->getType();
366 DIType TmpTy = Ty;
367 unsigned Tag = Ty.getTag();
368 bool isPointer = false;
369
370 StringRef varName = DV->getName();
371
372 if (Tag == dwarf::DW_TAG_pointer_type) {
373 DIDerivedType DTy = DIDerivedType(Ty);
374 TmpTy = DTy.getTypeDerivedFrom();
375 isPointer = true;
376 }
377
378 DICompositeType blockStruct = DICompositeType(TmpTy);
379
380 // Find the __forwarding field and the variable field in the __Block_byref
381 // struct.
382 DIArray Fields = blockStruct.getTypeArray();
383 DIDescriptor varField = DIDescriptor();
384 DIDescriptor forwardingField = DIDescriptor();
385
386 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
387 DIDescriptor Element = Fields.getElement(i);
388 DIDerivedType DT = DIDerivedType(Element);
389 StringRef fieldName = DT.getName();
390 if (fieldName == "__forwarding")
391 forwardingField = Element;
392 else if (fieldName == varName)
393 varField = Element;
394 }
395
396 // Get the offsets for the forwarding field and the variable field.
397 unsigned forwardingFieldOffset =
398 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
399 unsigned varFieldOffset =
400 DIDerivedType(varField).getOffsetInBits() >> 3;
401
402 // Decode the original location, and use that as the start of the byref
403 // variable's location.
404 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
405 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
406 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
407
408 if (Location.isReg()) {
409 if (Reg < 32)
410 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
411 else {
412 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
413 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
414 }
415 } else {
416 if (Reg < 32)
417 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
418 else {
419 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
420 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
421 }
422
423 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
424 }
425
426 // If we started with a pointer to the __Block_byref... struct, then
427 // the first thing we need to do is dereference the pointer (DW_OP_deref).
428 if (isPointer)
429 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
430
431 // Next add the offset for the '__forwarding' field:
432 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
433 // adding the offset if it's 0.
434 if (forwardingFieldOffset > 0) {
435 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
436 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
437 }
438
439 // Now dereference the __forwarding field to get to the real __Block_byref
440 // struct: DW_OP_deref.
441 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
442
443 // Now that we've got the real __Block_byref... struct, add the offset
444 // for the variable's field to get to the location of the actual variable:
445 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
446 if (varFieldOffset > 0) {
447 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
448 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
449 }
450
451 // Now attach the location information to the DIE.
452 addBlock(Die, Attribute, 0, Block);
453}
454
Devang Patel4ec14b02011-07-20 21:57:04 +0000455/// isTypeSigned - Return true if the type is signed.
456static bool isTypeSigned(DIType Ty, int *SizeInBits) {
457 if (Ty.isDerivedType())
458 return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
459 if (Ty.isBasicType())
460 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
461 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
462 *SizeInBits = Ty.getSizeInBits();
463 return true;
464 }
465 return false;
466}
467
Devang Patel161b2f42011-04-12 23:21:44 +0000468/// addConstantValue - Add constant value entry in variable DIE.
Devang Patelb58128e2011-05-27 16:45:18 +0000469bool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
470 DIType Ty) {
Nick Lewycky746cb672011-10-26 22:55:33 +0000471 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000472 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patel4ec14b02011-07-20 21:57:04 +0000473 int SizeInBits = -1;
474 bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
475 unsigned Form = SignedConstant ? dwarf::DW_FORM_sdata : dwarf::DW_FORM_udata;
476 switch (SizeInBits) {
477 case 8: Form = dwarf::DW_FORM_data1; break;
478 case 16: Form = dwarf::DW_FORM_data2; break;
479 case 32: Form = dwarf::DW_FORM_data4; break;
480 case 64: Form = dwarf::DW_FORM_data8; break;
Devang Patel045c1d42011-05-27 19:13:26 +0000481 default: break;
482 }
Devang Patel4ec14b02011-07-20 21:57:04 +0000483 SignedConstant ? addSInt(Block, 0, Form, MO.getImm())
484 : addUInt(Block, 0, Form, MO.getImm());
Devang Patel72f0d9c2011-05-27 18:15:52 +0000485
Devang Patel161b2f42011-04-12 23:21:44 +0000486 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
487 return true;
488}
489
490/// addConstantFPValue - Add constant value entry in variable DIE.
491bool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Nick Lewycky390c40d2011-10-27 06:44:11 +0000492 assert (MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000493 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
494 APFloat FPImm = MO.getFPImm()->getValueAPF();
495
496 // Get the raw data form of the floating point.
497 const APInt FltVal = FPImm.bitcastToAPInt();
498 const char *FltPtr = (const char*)FltVal.getRawData();
499
500 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
501 bool LittleEndian = Asm->getTargetData().isLittleEndian();
502 int Incr = (LittleEndian ? 1 : -1);
503 int Start = (LittleEndian ? 0 : NumBytes - 1);
504 int Stop = (LittleEndian ? NumBytes : -1);
505
506 // Output the constant to DWARF one byte at a time.
507 for (; Start != Stop; Start += Incr)
508 addUInt(Block, 0, dwarf::DW_FORM_data1,
509 (unsigned char)0xFF & FltPtr[Start]);
510
511 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
512 return true;
513}
514
515/// addConstantValue - Add constant value entry in variable DIE.
Devang Patel8594d422011-06-24 20:46:11 +0000516bool CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000517 bool Unsigned) {
Devang Pateld6a81362011-05-28 00:39:18 +0000518 unsigned CIBitWidth = CI->getBitWidth();
519 if (CIBitWidth <= 64) {
520 unsigned form = 0;
521 switch (CIBitWidth) {
522 case 8: form = dwarf::DW_FORM_data1; break;
523 case 16: form = dwarf::DW_FORM_data2; break;
524 case 32: form = dwarf::DW_FORM_data4; break;
525 case 64: form = dwarf::DW_FORM_data8; break;
526 default:
527 form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata;
528 }
Devang Patel161b2f42011-04-12 23:21:44 +0000529 if (Unsigned)
Devang Pateld6a81362011-05-28 00:39:18 +0000530 addUInt(Die, dwarf::DW_AT_const_value, form, CI->getZExtValue());
Devang Patel161b2f42011-04-12 23:21:44 +0000531 else
Devang Pateld6a81362011-05-28 00:39:18 +0000532 addSInt(Die, dwarf::DW_AT_const_value, form, CI->getSExtValue());
Devang Patel161b2f42011-04-12 23:21:44 +0000533 return true;
534 }
535
536 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
537
538 // Get the raw data form of the large APInt.
539 const APInt Val = CI->getValue();
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000540 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000541
542 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
543 bool LittleEndian = Asm->getTargetData().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000544
545 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000546 for (int i = 0; i < NumBytes; i++) {
547 uint8_t c;
548 if (LittleEndian)
549 c = Ptr64[i / 8] >> (8 * (i & 7));
550 else
551 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
552 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
553 }
Devang Patel161b2f42011-04-12 23:21:44 +0000554
555 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
556 return true;
557}
558
559/// addTemplateParams - Add template parameters in buffer.
560void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
561 // Add template parameters.
562 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
563 DIDescriptor Element = TParams.getElement(i);
564 if (Element.isTemplateTypeParameter())
565 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
566 DITemplateTypeParameter(Element)));
567 else if (Element.isTemplateValueParameter())
568 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
569 DITemplateValueParameter(Element)));
570 }
Devang Patel161b2f42011-04-12 23:21:44 +0000571}
Nick Lewycky746cb672011-10-26 22:55:33 +0000572
Devang Patel161b2f42011-04-12 23:21:44 +0000573/// addToContextOwner - Add Die into the list of its context owner's children.
574void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
575 if (Context.isType()) {
576 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
577 ContextDIE->addChild(Die);
578 } else if (Context.isNameSpace()) {
579 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
580 ContextDIE->addChild(Die);
581 } else if (Context.isSubprogram()) {
Devang Pateldbc64af2011-08-15 17:24:54 +0000582 DIE *ContextDIE = getOrCreateSubprogramDIE(DISubprogram(Context));
Devang Patel161b2f42011-04-12 23:21:44 +0000583 ContextDIE->addChild(Die);
584 } else if (DIE *ContextDIE = getDIE(Context))
585 ContextDIE->addChild(Die);
586 else
587 addDie(Die);
588}
589
590/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
591/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000592DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
593 DIType Ty(TyNode);
594 if (!Ty.Verify())
595 return NULL;
Devang Patel161b2f42011-04-12 23:21:44 +0000596 DIE *TyDIE = getDIE(Ty);
597 if (TyDIE)
598 return TyDIE;
599
600 // Create new type.
601 TyDIE = new DIE(dwarf::DW_TAG_base_type);
602 insertDIE(Ty, TyDIE);
603 if (Ty.isBasicType())
604 constructTypeDIE(*TyDIE, DIBasicType(Ty));
605 else if (Ty.isCompositeType())
606 constructTypeDIE(*TyDIE, DICompositeType(Ty));
607 else {
608 assert(Ty.isDerivedType() && "Unknown kind of DIType");
609 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
610 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000611 // If this is a named finished type then include it in the list of types
612 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000613 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
614 bool IsImplementation = 0;
615 if (Ty.isCompositeType()) {
616 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000617 // A runtime language of 0 actually means C/C++ and that any
618 // non-negative value is some version of Objective-C/C++.
Eric Christopherc36145f2012-01-06 04:35:23 +0000619 IsImplementation = (CT.getRunTimeLang() == 0) ||
Eric Christophere2dc9332012-02-22 08:46:02 +0000620 CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000621 }
Eric Christophere0167892012-01-06 23:03:37 +0000622 unsigned Flags = IsImplementation ?
623 DwarfAccelTable::eTypeFlagClassIsImplementation : 0;
624 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000625 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000626
Devang Patel161b2f42011-04-12 23:21:44 +0000627 addToContextOwner(TyDIE, Ty.getContext());
628 return TyDIE;
629}
630
631/// addType - Add a new type attribute to the specified entity.
632void CompileUnit::addType(DIE *Entity, DIType Ty) {
633 if (!Ty.Verify())
634 return;
635
636 // Check for pre-existence.
637 DIEEntry *Entry = getDIEEntry(Ty);
638 // If it exists then use the existing value.
639 if (Entry) {
640 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
641 return;
642 }
643
644 // Construct type.
645 DIE *Buffer = getOrCreateTypeDIE(Ty);
646
647 // Set up proxy.
648 Entry = createDIEEntry(Buffer);
649 insertDIEEntry(Ty, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000650 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000651
652 // If this is a complete composite type then include it in the
653 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000654 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000655}
656
657/// addGlobalType - Add a new global type to the compile unit.
658///
Devang Patelc20bdf12011-06-01 00:23:24 +0000659void CompileUnit::addGlobalType(DIType Ty) {
Devang Patele9ae06c2011-05-31 22:56:51 +0000660 DIDescriptor Context = Ty.getContext();
661 if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
Devang Patel94c7ddb2011-08-16 22:09:43 +0000662 && (!Context || Context.isCompileUnit() || Context.isFile()
663 || Context.isNameSpace()))
Devang Patelc20bdf12011-06-01 00:23:24 +0000664 if (DIEEntry *Entry = getDIEEntry(Ty))
665 GlobalTypes[Ty.getName()] = Entry->getEntry();
Devang Patel161b2f42011-04-12 23:21:44 +0000666}
667
Devang Patel31c5d052011-05-06 16:57:54 +0000668/// addPubTypes - Add type for pubtypes section.
669void CompileUnit::addPubTypes(DISubprogram SP) {
670 DICompositeType SPTy = SP.getType();
671 unsigned SPTag = SPTy.getTag();
672 if (SPTag != dwarf::DW_TAG_subroutine_type)
673 return;
674
675 DIArray Args = SPTy.getTypeArray();
676 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
677 DIType ATy(Args.getElement(i));
678 if (!ATy.Verify())
679 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +0000680 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +0000681 }
682}
683
Devang Patel161b2f42011-04-12 23:21:44 +0000684/// constructTypeDIE - Construct basic type die from DIBasicType.
685void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
686 // Get core information.
687 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000688 // Add name if not anonymous or intermediate type.
689 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000690 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +0000691
692 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
693 Buffer.setTag(dwarf::DW_TAG_unspecified_type);
694 // Unspecified types has only name, nothing else.
695 return;
696 }
697
698 Buffer.setTag(dwarf::DW_TAG_base_type);
Nick Lewycky746cb672011-10-26 22:55:33 +0000699 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +0000700 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +0000701
Devang Patel161b2f42011-04-12 23:21:44 +0000702 uint64_t Size = BTy.getSizeInBits() >> 3;
703 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
704}
705
706/// constructTypeDIE - Construct derived type die from DIDerivedType.
707void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
708 // Get core information.
709 StringRef Name = DTy.getName();
710 uint64_t Size = DTy.getSizeInBits() >> 3;
711 unsigned Tag = DTy.getTag();
712
713 // FIXME - Workaround for templates.
714 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
715
716 Buffer.setTag(Tag);
717
718 // Map to main type, void will not have a type.
719 DIType FromTy = DTy.getTypeDerivedFrom();
720 addType(&Buffer, FromTy);
721
722 // Add name if not anonymous or intermediate type.
723 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000724 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +0000725
726 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +0000727 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel161b2f42011-04-12 23:21:44 +0000728 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
729
730 // Add source line info if available and TyDesc is not a forward declaration.
731 if (!DTy.isForwardDecl())
732 addSourceLine(&Buffer, DTy);
733}
734
735/// constructTypeDIE - Construct type DIE from DICompositeType.
736void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
737 // Get core information.
738 StringRef Name = CTy.getName();
739
740 uint64_t Size = CTy.getSizeInBits() >> 3;
741 unsigned Tag = CTy.getTag();
742 Buffer.setTag(Tag);
743
744 switch (Tag) {
745 case dwarf::DW_TAG_vector_type:
746 case dwarf::DW_TAG_array_type:
747 constructArrayTypeDIE(Buffer, &CTy);
748 break;
749 case dwarf::DW_TAG_enumeration_type: {
750 DIArray Elements = CTy.getTypeArray();
751
752 // Add enumerators to enumeration type.
753 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
754 DIE *ElemDie = NULL;
755 DIDescriptor Enum(Elements.getElement(i));
756 if (Enum.isEnumerator()) {
757 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
758 Buffer.addChild(ElemDie);
759 }
760 }
761 }
762 break;
763 case dwarf::DW_TAG_subroutine_type: {
764 // Add return type.
765 DIArray Elements = CTy.getTypeArray();
766 DIDescriptor RTy = Elements.getElement(0);
767 addType(&Buffer, DIType(RTy));
768
769 bool isPrototyped = true;
770 // Add arguments.
771 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
772 DIDescriptor Ty = Elements.getElement(i);
773 if (Ty.isUnspecifiedParameter()) {
774 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
775 Buffer.addChild(Arg);
776 isPrototyped = false;
777 } else {
778 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
779 addType(Arg, DIType(Ty));
780 Buffer.addChild(Arg);
781 }
782 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +0000783 // Add prototype flag if we're dealing with a C language and the
784 // function has been prototyped.
785 if (isPrototyped &&
786 (Language == dwarf::DW_LANG_C89 ||
787 Language == dwarf::DW_LANG_C99 ||
788 Language == dwarf::DW_LANG_ObjC))
Devang Patel161b2f42011-04-12 23:21:44 +0000789 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
790 }
791 break;
792 case dwarf::DW_TAG_structure_type:
793 case dwarf::DW_TAG_union_type:
794 case dwarf::DW_TAG_class_type: {
795 // Add elements to structure type.
796 DIArray Elements = CTy.getTypeArray();
797
798 // A forward struct declared type may not have elements available.
799 unsigned N = Elements.getNumElements();
800 if (N == 0)
801 break;
802
803 // Add elements to structure type.
804 for (unsigned i = 0; i < N; ++i) {
805 DIDescriptor Element = Elements.getElement(i);
806 DIE *ElemDie = NULL;
807 if (Element.isSubprogram()) {
808 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +0000809 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +0000810 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +0000811 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000812 dwarf::DW_ACCESS_protected);
813 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +0000814 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000815 dwarf::DW_ACCESS_private);
816 else
Nick Lewycky13aaca52011-12-13 05:09:11 +0000817 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000818 dwarf::DW_ACCESS_public);
819 if (SP.isExplicit())
820 addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
821 }
822 else if (Element.isVariable()) {
823 DIVariable DV(Element);
824 ElemDie = new DIE(dwarf::DW_TAG_variable);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000825 addString(ElemDie, dwarf::DW_AT_name, DV.getName());
Devang Patel161b2f42011-04-12 23:21:44 +0000826 addType(ElemDie, DV.getType());
827 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
828 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
829 addSourceLine(ElemDie, DV);
830 } else if (Element.isDerivedType())
831 ElemDie = createMemberDIE(DIDerivedType(Element));
Devang Patel9e11eb12012-02-04 01:30:32 +0000832 else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +0000833 DIObjCProperty Property(Element);
834 ElemDie = new DIE(Property.getTag());
835 StringRef PropertyName = Property.getObjCPropertyName();
836 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
837 StringRef GetterName = Property.getObjCPropertyGetterName();
838 if (!GetterName.empty())
839 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
840 StringRef SetterName = Property.getObjCPropertySetterName();
841 if (!SetterName.empty())
842 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
843 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +0000844 if (Property.isReadOnlyObjCProperty())
845 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
846 if (Property.isReadWriteObjCProperty())
847 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
848 if (Property.isAssignObjCProperty())
849 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
850 if (Property.isRetainObjCProperty())
851 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
852 if (Property.isCopyObjCProperty())
853 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
854 if (Property.isNonAtomicObjCProperty())
855 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
856 if (PropertyAttributes)
857 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
858 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +0000859
Devang Patel30d409c2012-02-07 23:33:58 +0000860 DIEEntry *Entry = getDIEEntry(Element);
861 if (!Entry) {
862 Entry = createDIEEntry(ElemDie);
863 insertDIEEntry(Element, Entry);
864 }
Devang Patel9e11eb12012-02-04 01:30:32 +0000865 } else
Devang Patel161b2f42011-04-12 23:21:44 +0000866 continue;
867 Buffer.addChild(ElemDie);
868 }
869
870 if (CTy.isAppleBlockExtension())
871 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
872
Devang Patel161b2f42011-04-12 23:21:44 +0000873 DICompositeType ContainingType = CTy.getContainingType();
874 if (DIDescriptor(ContainingType).isCompositeType())
875 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
876 getOrCreateTypeDIE(DIType(ContainingType)));
877 else {
878 DIDescriptor Context = CTy.getContext();
879 addToContextOwner(&Buffer, Context);
880 }
881
Devang Patel201e6cd2011-05-12 21:29:42 +0000882 if (CTy.isObjcClassComplete())
883 addUInt(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type,
Devang Patelb11f80e2011-05-12 19:06:16 +0000884 dwarf::DW_FORM_flag, 1);
885
Eric Christopher1a8e8862011-12-16 23:42:42 +0000886 // Add template parameters to a class, structure or union types.
887 // FIXME: The support isn't in the metadata for this yet.
888 if (Tag == dwarf::DW_TAG_class_type ||
889 Tag == dwarf::DW_TAG_structure_type ||
890 Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +0000891 addTemplateParams(Buffer, CTy.getTemplateParams());
892
893 break;
894 }
895 default:
896 break;
897 }
898
899 // Add name if not anonymous or intermediate type.
900 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000901 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +0000902
903 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
904 || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
Nick Lewycky746cb672011-10-26 22:55:33 +0000905 {
Devang Patel161b2f42011-04-12 23:21:44 +0000906 // Add size if non-zero (derived types might be zero-sized.)
907 if (Size)
908 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
909 else {
910 // Add zero size if it is not a forward declaration.
911 if (CTy.isForwardDecl())
912 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
913 else
914 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
915 }
916
917 // Add source line info if available.
918 if (!CTy.isForwardDecl())
919 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +0000920
921 // No harm in adding the runtime language to the declaration.
922 unsigned RLang = CTy.getRunTimeLang();
923 if (RLang)
924 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
925 dwarf::DW_FORM_data1, RLang);
Devang Patel161b2f42011-04-12 23:21:44 +0000926 }
927}
928
929/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
930/// for the given DITemplateTypeParameter.
931DIE *
932CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
933 DIE *ParamDIE = getDIE(TP);
934 if (ParamDIE)
935 return ParamDIE;
936
937 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
938 addType(ParamDIE, TP.getType());
Nick Lewycky390c40d2011-10-27 06:44:11 +0000939 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +0000940 return ParamDIE;
941}
942
943/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
944/// for the given DITemplateValueParameter.
945DIE *
946CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) {
947 DIE *ParamDIE = getDIE(TPV);
948 if (ParamDIE)
949 return ParamDIE;
950
951 ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
952 addType(ParamDIE, TPV.getType());
953 if (!TPV.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000954 addString(ParamDIE, dwarf::DW_AT_name, TPV.getName());
Devang Patel161b2f42011-04-12 23:21:44 +0000955 addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
956 TPV.getValue());
957 return ParamDIE;
958}
959
Devang Patel31c5d052011-05-06 16:57:54 +0000960/// getOrCreateNameSpace - Create a DIE for DINameSpace.
961DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
962 DIE *NDie = getDIE(NS);
963 if (NDie)
964 return NDie;
965 NDie = new DIE(dwarf::DW_TAG_namespace);
966 insertDIE(NS, NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +0000967 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +0000968 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +0000969 addAccelNamespace(NS.getName(), NDie);
970 } else
971 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +0000972 addSourceLine(NDie, NS);
973 addToContextOwner(NDie, NS.getContext());
974 return NDie;
975}
976
Devang Pateldbc64af2011-08-15 17:24:54 +0000977/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
978/// printer to not emit usual symbol prefix before the symbol name is used then
979/// return linkage name after skipping this special LLVM prefix.
980static StringRef getRealLinkageName(StringRef LinkageName) {
981 char One = '\1';
982 if (LinkageName.startswith(StringRef(&One, 1)))
983 return LinkageName.substr(1);
984 return LinkageName;
985}
986
987/// getOrCreateSubprogramDIE - Create new DIE using SP.
988DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
989 DIE *SPDie = getDIE(SP);
990 if (SPDie)
991 return SPDie;
992
Rafael Espindola01b55b42011-11-10 22:34:29 +0000993 DISubprogram SPDecl = SP.getFunctionDeclaration();
994 DIE *DeclDie = NULL;
995 if (SPDecl.isSubprogram()) {
996 DeclDie = getOrCreateSubprogramDIE(SPDecl);
997 }
998
Devang Pateldbc64af2011-08-15 17:24:54 +0000999 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1000
1001 // DW_TAG_inlined_subroutine may refer to this DIE.
1002 insertDIE(SP, SPDie);
1003
1004 // Add to context owner.
1005 addToContextOwner(SPDie, SP.getContext());
1006
1007 // Add function template parameters.
1008 addTemplateParams(*SPDie, SP.getTemplateParams());
1009
Eric Christopher8d101c32012-03-15 08:19:33 +00001010 // Unfortunately this code needs to stay here to work around
1011 // a bug in older gdbs that requires the linkage name to resolve
1012 // multiple template functions.
1013 StringRef LinkageName = SP.getLinkageName();
1014 if (!LinkageName.empty())
1015 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
1016 getRealLinkageName(LinkageName));
1017
Devang Pateldbc64af2011-08-15 17:24:54 +00001018 // If this DIE is going to refer declaration info using AT_specification
1019 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001020 if (DeclDie) {
1021 // Refer function declaration directly.
1022 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1023 DeclDie);
1024
Devang Pateldbc64af2011-08-15 17:24:54 +00001025 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001026 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001027
1028 // Constructors and operators for anonymous aggregates do not have names.
1029 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001030 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001031
1032 addSourceLine(SPDie, SP);
1033
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001034 // Add the prototype if we have a prototype and we have a C like
1035 // language.
1036 if (SP.isPrototyped() &&
1037 (Language == dwarf::DW_LANG_C89 ||
1038 Language == dwarf::DW_LANG_C99 ||
1039 Language == dwarf::DW_LANG_ObjC))
Devang Pateldbc64af2011-08-15 17:24:54 +00001040 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1041
1042 // Add Return Type.
1043 DICompositeType SPTy = SP.getType();
1044 DIArray Args = SPTy.getTypeArray();
1045 unsigned SPTag = SPTy.getTag();
1046
1047 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1048 addType(SPDie, SPTy);
1049 else
1050 addType(SPDie, DIType(Args.getElement(0)));
1051
1052 unsigned VK = SP.getVirtuality();
1053 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001054 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001055 DIEBlock *Block = getDIEBlock();
1056 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1057 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1058 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1059 ContainingTypeMap.insert(std::make_pair(SPDie,
1060 SP.getContainingType()));
1061 }
1062
1063 if (!SP.isDefinition()) {
1064 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1065
1066 // Add arguments. Do not add arguments for subprogram definition. They will
1067 // be handled while processing variables.
1068 DICompositeType SPTy = SP.getType();
1069 DIArray Args = SPTy.getTypeArray();
1070 unsigned SPTag = SPTy.getTag();
1071
1072 if (SPTag == dwarf::DW_TAG_subroutine_type)
1073 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1074 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1075 DIType ATy = DIType(DIType(Args.getElement(i)));
1076 addType(Arg, ATy);
1077 if (ATy.isArtificial())
1078 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1079 SPDie->addChild(Arg);
1080 }
1081 }
1082
1083 if (SP.isArtificial())
1084 addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1085
1086 if (!SP.isLocalToUnit())
1087 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1088
1089 if (SP.isOptimized())
1090 addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1091
1092 if (unsigned isa = Asm->getISAEncoding()) {
1093 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1094 }
1095
1096 return SPDie;
1097}
1098
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001099// Return const expression if value is a GEP to access merged global
1100// constant. e.g.
1101// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1102static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1103 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1104 if (!CE || CE->getNumOperands() != 3 ||
1105 CE->getOpcode() != Instruction::GetElementPtr)
1106 return NULL;
1107
1108 // First operand points to a global struct.
1109 Value *Ptr = CE->getOperand(0);
1110 if (!isa<GlobalValue>(Ptr) ||
1111 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1112 return NULL;
1113
1114 // Second operand is zero.
1115 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1116 if (!CI || !CI->isZero())
1117 return NULL;
1118
1119 // Third operand is offset.
1120 if (!isa<ConstantInt>(CE->getOperand(2)))
1121 return NULL;
1122
1123 return CE;
1124}
1125
1126/// createGlobalVariableDIE - create global variable DIE.
1127void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001128 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001129 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001130 return;
1131
Devang Patel49e2f032011-08-18 22:21:50 +00001132 DIGlobalVariable GV(N);
Devang Patel28bea082011-08-18 23:17:55 +00001133 if (!GV.Verify())
1134 return;
1135
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001136 DIE *VariableDIE = new DIE(GV.getTag());
Devang Patel49e2f032011-08-18 22:21:50 +00001137 // Add to map.
1138 insertDIE(N, VariableDIE);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001139
1140 // Add name.
Nick Lewycky390c40d2011-10-27 06:44:11 +00001141 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001142 StringRef LinkageName = GV.getLinkageName();
Devang Patel49e2f032011-08-18 22:21:50 +00001143 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001144 if (!LinkageName.empty() && isGlobalVariable)
Nick Lewycky746cb672011-10-26 22:55:33 +00001145 addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Nick Lewycky390c40d2011-10-27 06:44:11 +00001146 getRealLinkageName(LinkageName));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001147 // Add type.
Devang Patel49e2f032011-08-18 22:21:50 +00001148 DIType GTy = GV.getType();
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001149 addType(VariableDIE, GTy);
1150
1151 // Add scoping info.
Eric Christopherdfa30e12011-11-09 05:24:07 +00001152 if (!GV.isLocalToUnit())
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001153 addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Eric Christopherdfa30e12011-11-09 05:24:07 +00001154
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001155 // Add line number info.
1156 addSourceLine(VariableDIE, GV);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001157 // Add to context owner.
1158 DIDescriptor GVContext = GV.getContext();
1159 addToContextOwner(VariableDIE, GVContext);
1160 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001161 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001162 DIE *VariableSpecDIE = NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001163 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001164 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001165 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1166 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1167 addLabel(Block, 0, dwarf::DW_FORM_udata,
1168 Asm->Mang->getSymbol(GV.getGlobal()));
1169 // Do not create specification DIE if context is either compile unit
1170 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001171 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001172 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1173 // Create specification DIE.
Eric Christopherd117fbb2011-11-11 01:55:22 +00001174 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001175 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1176 dwarf::DW_FORM_ref4, VariableDIE);
1177 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1178 addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag,
1179 1);
1180 addDie(VariableSpecDIE);
1181 } else {
1182 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001183 }
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001184 } else if (const ConstantInt *CI =
1185 dyn_cast_or_null<ConstantInt>(GV.getConstant()))
1186 addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
1187 else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001188 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001189 // GV is a merged global.
1190 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1191 Value *Ptr = CE->getOperand(0);
1192 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1193 addLabel(Block, 0, dwarf::DW_FORM_udata,
1194 Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
1195 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1196 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
1197 addUInt(Block, 0, dwarf::DW_FORM_udata,
1198 Asm->getTargetData().getIndexedOffset(Ptr->getType(), Idx));
1199 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1200 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1201 }
1202
Eric Christopherd117fbb2011-11-11 01:55:22 +00001203 if (addToAccelTable) {
1204 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1205 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001206
Eric Christopherd117fbb2011-11-11 01:55:22 +00001207 // If the linkage name is different than the name, go ahead and output
1208 // that as well into the name table.
1209 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1210 addAccelName(GV.getLinkageName(), AddrDIE);
1211 }
Eric Christopher74d8a872011-11-08 21:56:23 +00001212
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001213 return;
1214}
1215
Devang Patel161b2f42011-04-12 23:21:44 +00001216/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1217void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1218 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1219 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patelce35d8b2011-11-17 23:43:15 +00001220 uint64_t L = SR.getLo();
1221 uint64_t H = SR.getHi();
Devang Patel161b2f42011-04-12 23:21:44 +00001222
1223 // The L value defines the lower bounds which is typically zero for C/C++. The
1224 // H value is the upper bounds. Values are 64 bit. H - L + 1 is the size
1225 // of the array. If L > H then do not emit DW_AT_lower_bound and
1226 // DW_AT_upper_bound attributes. If L is zero and H is also zero then the
1227 // array has one element and in such case do not emit lower bound.
1228
1229 if (L > H) {
1230 Buffer.addChild(DW_Subrange);
1231 return;
1232 }
1233 if (L)
Devang Patelce35d8b2011-11-17 23:43:15 +00001234 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1235 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
Devang Patel161b2f42011-04-12 23:21:44 +00001236 Buffer.addChild(DW_Subrange);
1237}
1238
1239/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1240void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1241 DICompositeType *CTy) {
1242 Buffer.setTag(dwarf::DW_TAG_array_type);
1243 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1244 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1245
1246 // Emit derived type.
1247 addType(&Buffer, CTy->getTypeDerivedFrom());
1248 DIArray Elements = CTy->getTypeArray();
1249
1250 // Get an anonymous type for index type.
1251 DIE *IdxTy = getIndexTyDie();
1252 if (!IdxTy) {
1253 // Construct an anonymous type for index type.
1254 IdxTy = new DIE(dwarf::DW_TAG_base_type);
1255 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1256 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1257 dwarf::DW_ATE_signed);
1258 addDie(IdxTy);
1259 setIndexTyDie(IdxTy);
1260 }
1261
1262 // Add subranges to array type.
1263 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1264 DIDescriptor Element = Elements.getElement(i);
1265 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1266 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1267 }
1268}
1269
1270/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1271DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1272 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1273 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001274 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001275 int64_t Value = ETy.getEnumValue();
1276 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1277 return Enumerator;
1278}
1279
Devang Pateldbc64af2011-08-15 17:24:54 +00001280/// constructContainingTypeDIEs - Construct DIEs for types that contain
1281/// vtables.
1282void CompileUnit::constructContainingTypeDIEs() {
1283 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1284 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1285 DIE *SPDie = CI->first;
1286 const MDNode *N = CI->second;
1287 if (!N) continue;
1288 DIE *NDie = getDIE(N);
1289 if (!NDie) continue;
1290 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1291 }
1292}
1293
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001294/// constructVariableDIE - Construct a DIE for the given DbgVariable.
1295DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
1296 StringRef Name = DV->getName();
1297 if (Name.empty())
1298 return NULL;
1299
1300 // Translate tag to proper Dwarf tag.
1301 unsigned Tag = DV->getTag();
1302
1303 // Define variable debug information entry.
1304 DIE *VariableDie = new DIE(Tag);
1305 DbgVariable *AbsVar = DV->getAbstractVariable();
1306 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
1307 if (AbsDIE)
1308 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1309 dwarf::DW_FORM_ref4, AbsDIE);
1310 else {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001311 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001312 addSourceLine(VariableDie, DV->getVariable());
1313 addType(VariableDie, DV->getType());
1314 }
1315
1316 if (DV->isArtificial())
1317 addUInt(VariableDie, dwarf::DW_AT_artificial,
1318 dwarf::DW_FORM_flag, 1);
1319
1320 if (isScopeAbstract) {
1321 DV->setDIE(VariableDie);
1322 return VariableDie;
1323 }
1324
1325 // Add variable address.
1326
1327 unsigned Offset = DV->getDotDebugLocOffset();
1328 if (Offset != ~0U) {
1329 addLabel(VariableDie, dwarf::DW_AT_location,
1330 dwarf::DW_FORM_data4,
1331 Asm->GetTempSymbol("debug_loc", Offset));
1332 DV->setDIE(VariableDie);
1333 return VariableDie;
1334 }
1335
Eric Christopher8cf5e742011-10-03 15:49:20 +00001336 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001337 if (const MachineInstr *DVInsn = DV->getMInsn()) {
1338 bool updated = false;
1339 if (DVInsn->getNumOperands() == 3) {
1340 if (DVInsn->getOperand(0).isReg()) {
1341 const MachineOperand RegOp = DVInsn->getOperand(0);
1342 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1343 if (DVInsn->getOperand(1).isImm() &&
1344 TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
1345 unsigned FrameReg = 0;
1346 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
1347 int Offset =
1348 TFI->getFrameIndexReference(*Asm->MF,
1349 DVInsn->getOperand(1).getImm(),
1350 FrameReg);
1351 MachineLocation Location(FrameReg, Offset);
1352 addVariableAddress(DV, VariableDie, Location);
1353
1354 } else if (RegOp.getReg())
1355 addVariableAddress(DV, VariableDie,
1356 MachineLocation(RegOp.getReg()));
1357 updated = true;
1358 }
1359 else if (DVInsn->getOperand(0).isImm())
1360 updated =
1361 addConstantValue(VariableDie, DVInsn->getOperand(0),
1362 DV->getType());
1363 else if (DVInsn->getOperand(0).isFPImm())
1364 updated =
1365 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
1366 else if (DVInsn->getOperand(0).isCImm())
1367 updated =
1368 addConstantValue(VariableDie,
1369 DVInsn->getOperand(0).getCImm(),
1370 DV->getType().isUnsignedDIType());
1371 } else {
1372 addVariableAddress(DV, VariableDie,
1373 Asm->getDebugValueLocation(DVInsn));
1374 updated = true;
1375 }
1376 if (!updated) {
1377 // If variableDie is not updated then DBG_VALUE instruction does not
1378 // have valid variable info.
1379 delete VariableDie;
1380 return NULL;
1381 }
1382 DV->setDIE(VariableDie);
1383 return VariableDie;
1384 } else {
1385 // .. else use frame index.
1386 int FI = DV->getFrameIndex();
1387 if (FI != ~0) {
1388 unsigned FrameReg = 0;
1389 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
1390 int Offset =
1391 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1392 MachineLocation Location(FrameReg, Offset);
1393 addVariableAddress(DV, VariableDie, Location);
1394 }
1395 }
1396
1397 DV->setDIE(VariableDie);
1398 return VariableDie;
1399}
1400
Devang Patel161b2f42011-04-12 23:21:44 +00001401/// createMemberDIE - Create new member DIE.
1402DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1403 DIE *MemberDie = new DIE(DT.getTag());
1404 StringRef Name = DT.getName();
1405 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001406 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001407
1408 addType(MemberDie, DT.getTypeDerivedFrom());
1409
1410 addSourceLine(MemberDie, DT);
1411
1412 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1413 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1414
1415 uint64_t Size = DT.getSizeInBits();
1416 uint64_t FieldSize = DT.getOriginalTypeSize();
1417
1418 if (Size != FieldSize) {
1419 // Handle bitfield.
1420 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1421 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1422
1423 uint64_t Offset = DT.getOffsetInBits();
1424 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1425 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1426 uint64_t FieldOffset = (HiMark - FieldSize);
1427 Offset -= FieldOffset;
1428
1429 // Maybe we need to work from the other end.
1430 if (Asm->getTargetData().isLittleEndian())
1431 Offset = FieldSize - (Offset + Size);
1432 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1433
1434 // Here WD_AT_data_member_location points to the anonymous
1435 // field that includes this bit field.
1436 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1437
1438 } else
1439 // This is not a bitfield.
1440 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1441
1442 if (DT.getTag() == dwarf::DW_TAG_inheritance
1443 && DT.isVirtual()) {
1444
1445 // For C++, virtual base classes are not at fixed offset. Use following
1446 // expression to extract appropriate offset from vtable.
1447 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1448
1449 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1450 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1451 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1452 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1453 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1454 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1455 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1456 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1457
1458 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1459 VBaseLocationDie);
1460 } else
1461 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1462
1463 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001464 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001465 dwarf::DW_ACCESS_protected);
1466 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001467 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001468 dwarf::DW_ACCESS_private);
1469 // Otherwise C++ member and base classes are considered public.
Devang Patel94c7ddb2011-08-16 22:09:43 +00001470 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001471 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001472 dwarf::DW_ACCESS_public);
1473 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001474 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001475 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001476
1477 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001478 if (MDNode *PNode = DT.getObjCProperty())
1479 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
1480 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
1481 PropertyDie);
1482
Devang Patel9e11eb12012-02-04 01:30:32 +00001483 // This is only for backward compatibility.
Devang Patele9db5e22011-04-16 00:11:51 +00001484 StringRef PropertyName = DT.getObjCPropertyName();
1485 if (!PropertyName.empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001486 addString(MemberDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Devang Patele9db5e22011-04-16 00:11:51 +00001487 StringRef GetterName = DT.getObjCPropertyGetterName();
1488 if (!GetterName.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001489 addString(MemberDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
Devang Patele9db5e22011-04-16 00:11:51 +00001490 StringRef SetterName = DT.getObjCPropertySetterName();
1491 if (!SetterName.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001492 addString(MemberDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
Devang Patele9db5e22011-04-16 00:11:51 +00001493 unsigned PropertyAttributes = 0;
1494 if (DT.isReadOnlyObjCProperty())
1495 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1496 if (DT.isReadWriteObjCProperty())
1497 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1498 if (DT.isAssignObjCProperty())
1499 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1500 if (DT.isRetainObjCProperty())
1501 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1502 if (DT.isCopyObjCProperty())
1503 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1504 if (DT.isNonAtomicObjCProperty())
1505 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1506 if (PropertyAttributes)
1507 addUInt(MemberDie, dwarf::DW_AT_APPLE_property_attribute, 0,
1508 PropertyAttributes);
1509 }
Devang Patel161b2f42011-04-12 23:21:44 +00001510 return MemberDie;
1511}