blob: 99b6bfc5f35a7e852631c1c33cd82eaffcd0bd74 [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.
35CompileUnit::CompileUnit(unsigned I, DIE *D, AsmPrinter *A, DwarfDebug *DW)
36 : ID(I), CUDie(D), Asm(A), DD(DW), IndexTyDie(0) {
37 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
38}
39
40/// ~CompileUnit - Destructor for compile unit.
41CompileUnit::~CompileUnit() {
42 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
43 DIEBlocks[j]->~DIEBlock();
44}
45
46/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
47/// information entry.
48DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
49 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
50 return Value;
51}
52
53/// addUInt - Add an unsigned integer attribute data and value.
54///
55void CompileUnit::addUInt(DIE *Die, unsigned Attribute,
56 unsigned Form, uint64_t Integer) {
57 if (!Form) Form = DIEInteger::BestForm(false, Integer);
58 DIEValue *Value = Integer == 1 ?
59 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
60 Die->addValue(Attribute, Form, Value);
61}
62
63/// addSInt - Add an signed integer attribute data and value.
64///
65void CompileUnit::addSInt(DIE *Die, unsigned Attribute,
66 unsigned Form, int64_t Integer) {
67 if (!Form) Form = DIEInteger::BestForm(true, Integer);
68 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
69 Die->addValue(Attribute, Form, Value);
70}
71
Nick Lewycky6a7efcf2011-10-28 05:29:47 +000072/// addString - Add a string attribute data and value. We always emit a
73/// reference to the string pool instead of immediate strings so that DIEs have
74/// more predictable sizes.
Nick Lewycky390c40d2011-10-27 06:44:11 +000075void CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) {
Nick Lewycky6a7efcf2011-10-28 05:29:47 +000076 MCSymbol *Symb = DD->getStringPoolEntry(String);
77 DIEValue *Value;
78 if (Asm->needsRelocationsForDwarfStringPool())
79 Value = new (DIEValueAllocator) DIELabel(Symb);
80 else {
81 MCSymbol *StringPool = DD->getStringPool();
82 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewycky390c40d2011-10-27 06:44:11 +000083 }
Nick Lewycky6a7efcf2011-10-28 05:29:47 +000084 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel161b2f42011-04-12 23:21:44 +000085}
86
87/// addLabel - Add a Dwarf label attribute data and value.
88///
89void CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
90 const MCSymbol *Label) {
91 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
92 Die->addValue(Attribute, Form, Value);
93}
94
95/// addDelta - Add a label delta attribute data and value.
96///
97void CompileUnit::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
98 const MCSymbol *Hi, const MCSymbol *Lo) {
99 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
100 Die->addValue(Attribute, Form, Value);
101}
102
103/// addDIEEntry - Add a DIE attribute data and value.
104///
105void CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
106 DIE *Entry) {
107 Die->addValue(Attribute, Form, createDIEEntry(Entry));
108}
109
Devang Patel161b2f42011-04-12 23:21:44 +0000110/// addBlock - Add block data.
111///
112void CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
113 DIEBlock *Block) {
114 Block->ComputeSize(Asm);
115 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
116 Die->addValue(Attribute, Block->BestForm(), Block);
117}
118
119/// addSourceLine - Add location information to specified debug information
120/// entry.
121void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
122 // Verify variable.
123 if (!V.Verify())
124 return;
125
126 unsigned Line = V.getLineNumber();
127 if (Line == 0)
128 return;
129 unsigned FileID = DD->GetOrCreateSourceID(V.getContext().getFilename(),
130 V.getContext().getDirectory());
131 assert(FileID && "Invalid file id");
132 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
133 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
134}
135
136/// addSourceLine - Add location information to specified debug information
137/// entry.
138void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
139 // Verify global variable.
140 if (!G.Verify())
141 return;
142
143 unsigned Line = G.getLineNumber();
144 if (Line == 0)
145 return;
Nick Lewycky746cb672011-10-26 22:55:33 +0000146 unsigned FileID = DD->GetOrCreateSourceID(G.getFilename(), G.getDirectory());
Devang Patel161b2f42011-04-12 23:21:44 +0000147 assert(FileID && "Invalid file id");
148 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
149 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
150}
151
152/// addSourceLine - Add location information to specified debug information
153/// entry.
154void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
155 // Verify subprogram.
156 if (!SP.Verify())
157 return;
158 // If the line number is 0, don't add it.
159 if (SP.getLineNumber() == 0)
160 return;
161
162 unsigned Line = SP.getLineNumber();
163 if (!SP.getContext().Verify())
164 return;
Nick Lewycky746cb672011-10-26 22:55:33 +0000165 unsigned FileID = DD->GetOrCreateSourceID(SP.getFilename(),
166 SP.getDirectory());
Devang Patel161b2f42011-04-12 23:21:44 +0000167 assert(FileID && "Invalid file id");
168 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
169 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
170}
171
172/// addSourceLine - Add location information to specified debug information
173/// entry.
174void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
175 // Verify type.
176 if (!Ty.Verify())
177 return;
178
179 unsigned Line = Ty.getLineNumber();
180 if (Line == 0 || !Ty.getContext().Verify())
181 return;
Nick Lewycky746cb672011-10-26 22:55:33 +0000182 unsigned FileID = DD->GetOrCreateSourceID(Ty.getFilename(),
183 Ty.getDirectory());
Devang Patel161b2f42011-04-12 23:21:44 +0000184 assert(FileID && "Invalid file id");
185 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
186 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
187}
188
189/// addSourceLine - Add location information to specified debug information
190/// entry.
191void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
192 // Verify namespace.
193 if (!NS.Verify())
194 return;
195
196 unsigned Line = NS.getLineNumber();
197 if (Line == 0)
198 return;
199 StringRef FN = NS.getFilename();
200
201 unsigned FileID = DD->GetOrCreateSourceID(FN, NS.getDirectory());
202 assert(FileID && "Invalid file id");
203 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
204 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
205}
206
Devang Patele1cdf842011-04-27 22:45:24 +0000207/// addVariableAddress - Add DW_AT_location attribute for a
208/// DbgVariable based on provided MachineLocation.
209void CompileUnit::addVariableAddress(DbgVariable *&DV, DIE *Die,
210 MachineLocation Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000211 if (DV->variableHasComplexAddress())
212 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
213 else if (DV->isBlockByrefVariable())
214 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
215 else
216 addAddress(Die, dwarf::DW_AT_location, Location);
217}
218
Devang Patel116da2f2011-04-26 19:06:18 +0000219/// addRegisterOp - Add register operand.
220void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
221 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
222 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
223 if (DWReg < 32)
224 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
225 else {
226 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
227 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
228 }
229}
230
231/// addRegisterOffset - Add register offset.
232void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
233 int64_t Offset) {
234 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
235 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
236 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
237 if (Reg == TRI->getFrameRegister(*Asm->MF))
238 // If variable offset is based in frame register then use fbreg.
239 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
240 else if (DWReg < 32)
241 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
242 else {
243 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
244 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
245 }
246 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
247}
248
249/// addAddress - Add an address attribute to a die based on the location
250/// provided.
251void CompileUnit::addAddress(DIE *Die, unsigned Attribute,
252 const MachineLocation &Location) {
253 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
254
255 if (Location.isReg())
256 addRegisterOp(Block, Location.getReg());
257 else
258 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
259
260 // Now attach the location information to the DIE.
261 addBlock(Die, Attribute, 0, Block);
262}
263
Devang Patel161b2f42011-04-12 23:21:44 +0000264/// addComplexAddress - Start with the address based on the location provided,
265/// and generate the DWARF information necessary to find the actual variable
266/// given the extra address information encoded in the DIVariable, starting from
267/// the starting location. Add the DWARF information to the die.
268///
269void CompileUnit::addComplexAddress(DbgVariable *&DV, DIE *Die,
270 unsigned Attribute,
271 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000272 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patelc26f5442011-04-28 02:22:40 +0000273 unsigned N = DV->getNumAddrElements();
274 unsigned i = 0;
275 if (Location.isReg()) {
276 if (N >= 2 && DV->getAddrElement(0) == DIBuilder::OpPlus) {
277 // If first address element is OpPlus then emit
278 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
279 addRegisterOffset(Block, Location.getReg(), DV->getAddrElement(1));
280 i = 2;
281 } else
282 addRegisterOp(Block, Location.getReg());
283 }
Devang Patel116da2f2011-04-26 19:06:18 +0000284 else
285 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000286
Devang Patelc26f5442011-04-28 02:22:40 +0000287 for (;i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +0000288 uint64_t Element = DV->getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000289 if (Element == DIBuilder::OpPlus) {
290 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
291 addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
292 } else if (Element == DIBuilder::OpDeref) {
293 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
294 } else llvm_unreachable("unknown DIBuilder Opcode");
295 }
296
297 // Now attach the location information to the DIE.
298 addBlock(Die, Attribute, 0, Block);
299}
300
301/* Byref variables, in Blocks, are declared by the programmer as "SomeType
302 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
303 gives the variable VarName either the struct, or a pointer to the struct, as
304 its type. This is necessary for various behind-the-scenes things the
305 compiler needs to do with by-reference variables in Blocks.
306
307 However, as far as the original *programmer* is concerned, the variable
308 should still have type 'SomeType', as originally declared.
309
310 The function getBlockByrefType dives into the __Block_byref_x_VarName
311 struct to find the original type of the variable, which is then assigned to
312 the variable's Debug Information Entry as its real type. So far, so good.
313 However now the debugger will expect the variable VarName to have the type
314 SomeType. So we need the location attribute for the variable to be an
315 expression that explains to the debugger how to navigate through the
316 pointers and struct to find the actual variable of type SomeType.
317
318 The following function does just that. We start by getting
319 the "normal" location for the variable. This will be the location
320 of either the struct __Block_byref_x_VarName or the pointer to the
321 struct __Block_byref_x_VarName.
322
323 The struct will look something like:
324
325 struct __Block_byref_x_VarName {
326 ... <various fields>
327 struct __Block_byref_x_VarName *forwarding;
328 ... <various other fields>
329 SomeType VarName;
330 ... <maybe more fields>
331 };
332
333 If we are given the struct directly (as our starting point) we
334 need to tell the debugger to:
335
336 1). Add the offset of the forwarding field.
337
338 2). Follow that pointer to get the real __Block_byref_x_VarName
339 struct to use (the real one may have been copied onto the heap).
340
341 3). Add the offset for the field VarName, to find the actual variable.
342
343 If we started with a pointer to the struct, then we need to
344 dereference that pointer first, before the other steps.
345 Translating this into DWARF ops, we will need to append the following
346 to the current location description for the variable:
347
348 DW_OP_deref -- optional, if we start with a pointer
349 DW_OP_plus_uconst <forward_fld_offset>
350 DW_OP_deref
351 DW_OP_plus_uconst <varName_fld_offset>
352
353 That is what this function does. */
354
355/// addBlockByrefAddress - Start with the address based on the location
356/// provided, and generate the DWARF information necessary to find the
357/// actual Block variable (navigating the Block struct) based on the
358/// starting location. Add the DWARF information to the die. For
359/// more information, read large comment just above here.
360///
361void CompileUnit::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
362 unsigned Attribute,
363 const MachineLocation &Location) {
364 DIType Ty = DV->getType();
365 DIType TmpTy = Ty;
366 unsigned Tag = Ty.getTag();
367 bool isPointer = false;
368
369 StringRef varName = DV->getName();
370
371 if (Tag == dwarf::DW_TAG_pointer_type) {
372 DIDerivedType DTy = DIDerivedType(Ty);
373 TmpTy = DTy.getTypeDerivedFrom();
374 isPointer = true;
375 }
376
377 DICompositeType blockStruct = DICompositeType(TmpTy);
378
379 // Find the __forwarding field and the variable field in the __Block_byref
380 // struct.
381 DIArray Fields = blockStruct.getTypeArray();
382 DIDescriptor varField = DIDescriptor();
383 DIDescriptor forwardingField = DIDescriptor();
384
385 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
386 DIDescriptor Element = Fields.getElement(i);
387 DIDerivedType DT = DIDerivedType(Element);
388 StringRef fieldName = DT.getName();
389 if (fieldName == "__forwarding")
390 forwardingField = Element;
391 else if (fieldName == varName)
392 varField = Element;
393 }
394
395 // Get the offsets for the forwarding field and the variable field.
396 unsigned forwardingFieldOffset =
397 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
398 unsigned varFieldOffset =
399 DIDerivedType(varField).getOffsetInBits() >> 3;
400
401 // Decode the original location, and use that as the start of the byref
402 // variable's location.
403 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
404 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
405 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
406
407 if (Location.isReg()) {
408 if (Reg < 32)
409 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
410 else {
411 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
412 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
413 }
414 } else {
415 if (Reg < 32)
416 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
417 else {
418 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
419 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
420 }
421
422 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
423 }
424
425 // If we started with a pointer to the __Block_byref... struct, then
426 // the first thing we need to do is dereference the pointer (DW_OP_deref).
427 if (isPointer)
428 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
429
430 // Next add the offset for the '__forwarding' field:
431 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
432 // adding the offset if it's 0.
433 if (forwardingFieldOffset > 0) {
434 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
435 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
436 }
437
438 // Now dereference the __forwarding field to get to the real __Block_byref
439 // struct: DW_OP_deref.
440 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
441
442 // Now that we've got the real __Block_byref... struct, add the offset
443 // for the variable's field to get to the location of the actual variable:
444 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
445 if (varFieldOffset > 0) {
446 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
447 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
448 }
449
450 // Now attach the location information to the DIE.
451 addBlock(Die, Attribute, 0, Block);
452}
453
Devang Patel4ec14b02011-07-20 21:57:04 +0000454/// isTypeSigned - Return true if the type is signed.
455static bool isTypeSigned(DIType Ty, int *SizeInBits) {
456 if (Ty.isDerivedType())
457 return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
458 if (Ty.isBasicType())
459 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
460 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
461 *SizeInBits = Ty.getSizeInBits();
462 return true;
463 }
464 return false;
465}
466
Devang Patel161b2f42011-04-12 23:21:44 +0000467/// addConstantValue - Add constant value entry in variable DIE.
Devang Patelb58128e2011-05-27 16:45:18 +0000468bool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
469 DIType Ty) {
Nick Lewycky746cb672011-10-26 22:55:33 +0000470 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000471 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patel4ec14b02011-07-20 21:57:04 +0000472 int SizeInBits = -1;
473 bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
474 unsigned Form = SignedConstant ? dwarf::DW_FORM_sdata : dwarf::DW_FORM_udata;
475 switch (SizeInBits) {
476 case 8: Form = dwarf::DW_FORM_data1; break;
477 case 16: Form = dwarf::DW_FORM_data2; break;
478 case 32: Form = dwarf::DW_FORM_data4; break;
479 case 64: Form = dwarf::DW_FORM_data8; break;
Devang Patel045c1d42011-05-27 19:13:26 +0000480 default: break;
481 }
Devang Patel4ec14b02011-07-20 21:57:04 +0000482 SignedConstant ? addSInt(Block, 0, Form, MO.getImm())
483 : addUInt(Block, 0, Form, MO.getImm());
Devang Patel72f0d9c2011-05-27 18:15:52 +0000484
Devang Patel161b2f42011-04-12 23:21:44 +0000485 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
486 return true;
487}
488
489/// addConstantFPValue - Add constant value entry in variable DIE.
490bool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Nick Lewycky390c40d2011-10-27 06:44:11 +0000491 assert (MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000492 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
493 APFloat FPImm = MO.getFPImm()->getValueAPF();
494
495 // Get the raw data form of the floating point.
496 const APInt FltVal = FPImm.bitcastToAPInt();
497 const char *FltPtr = (const char*)FltVal.getRawData();
498
499 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
500 bool LittleEndian = Asm->getTargetData().isLittleEndian();
501 int Incr = (LittleEndian ? 1 : -1);
502 int Start = (LittleEndian ? 0 : NumBytes - 1);
503 int Stop = (LittleEndian ? NumBytes : -1);
504
505 // Output the constant to DWARF one byte at a time.
506 for (; Start != Stop; Start += Incr)
507 addUInt(Block, 0, dwarf::DW_FORM_data1,
508 (unsigned char)0xFF & FltPtr[Start]);
509
510 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
511 return true;
512}
513
514/// addConstantValue - Add constant value entry in variable DIE.
Devang Patel8594d422011-06-24 20:46:11 +0000515bool CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000516 bool Unsigned) {
Devang Pateld6a81362011-05-28 00:39:18 +0000517 unsigned CIBitWidth = CI->getBitWidth();
518 if (CIBitWidth <= 64) {
519 unsigned form = 0;
520 switch (CIBitWidth) {
521 case 8: form = dwarf::DW_FORM_data1; break;
522 case 16: form = dwarf::DW_FORM_data2; break;
523 case 32: form = dwarf::DW_FORM_data4; break;
524 case 64: form = dwarf::DW_FORM_data8; break;
525 default:
526 form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata;
527 }
Devang Patel161b2f42011-04-12 23:21:44 +0000528 if (Unsigned)
Devang Pateld6a81362011-05-28 00:39:18 +0000529 addUInt(Die, dwarf::DW_AT_const_value, form, CI->getZExtValue());
Devang Patel161b2f42011-04-12 23:21:44 +0000530 else
Devang Pateld6a81362011-05-28 00:39:18 +0000531 addSInt(Die, dwarf::DW_AT_const_value, form, CI->getSExtValue());
Devang Patel161b2f42011-04-12 23:21:44 +0000532 return true;
533 }
534
535 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
536
537 // Get the raw data form of the large APInt.
538 const APInt Val = CI->getValue();
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000539 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000540
541 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
542 bool LittleEndian = Asm->getTargetData().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000543
544 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000545 for (int i = 0; i < NumBytes; i++) {
546 uint8_t c;
547 if (LittleEndian)
548 c = Ptr64[i / 8] >> (8 * (i & 7));
549 else
550 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
551 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
552 }
Devang Patel161b2f42011-04-12 23:21:44 +0000553
554 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
555 return true;
556}
557
558/// addTemplateParams - Add template parameters in buffer.
559void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
560 // Add template parameters.
561 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
562 DIDescriptor Element = TParams.getElement(i);
563 if (Element.isTemplateTypeParameter())
564 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
565 DITemplateTypeParameter(Element)));
566 else if (Element.isTemplateValueParameter())
567 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
568 DITemplateValueParameter(Element)));
569 }
Devang Patel161b2f42011-04-12 23:21:44 +0000570}
Nick Lewycky746cb672011-10-26 22:55:33 +0000571
Devang Patel161b2f42011-04-12 23:21:44 +0000572/// addToContextOwner - Add Die into the list of its context owner's children.
573void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
574 if (Context.isType()) {
575 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
576 ContextDIE->addChild(Die);
577 } else if (Context.isNameSpace()) {
578 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
579 ContextDIE->addChild(Die);
580 } else if (Context.isSubprogram()) {
Devang Pateldbc64af2011-08-15 17:24:54 +0000581 DIE *ContextDIE = getOrCreateSubprogramDIE(DISubprogram(Context));
Devang Patel161b2f42011-04-12 23:21:44 +0000582 ContextDIE->addChild(Die);
583 } else if (DIE *ContextDIE = getDIE(Context))
584 ContextDIE->addChild(Die);
585 else
586 addDie(Die);
587}
588
589/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
590/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000591DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
592 DIType Ty(TyNode);
593 if (!Ty.Verify())
594 return NULL;
Devang Patel161b2f42011-04-12 23:21:44 +0000595 DIE *TyDIE = getDIE(Ty);
596 if (TyDIE)
597 return TyDIE;
598
599 // Create new type.
600 TyDIE = new DIE(dwarf::DW_TAG_base_type);
601 insertDIE(Ty, TyDIE);
602 if (Ty.isBasicType())
603 constructTypeDIE(*TyDIE, DIBasicType(Ty));
604 else if (Ty.isCompositeType())
605 constructTypeDIE(*TyDIE, DICompositeType(Ty));
606 else {
607 assert(Ty.isDerivedType() && "Unknown kind of DIType");
608 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
609 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000610 // If this is a named finished type then include it in the list of types
611 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000612 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
613 bool IsImplementation = 0;
614 if (Ty.isCompositeType()) {
615 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000616 // A runtime language of 0 actually means C/C++ and that any
617 // non-negative value is some version of Objective-C/C++.
Eric Christopherc36145f2012-01-06 04:35:23 +0000618 IsImplementation = (CT.getRunTimeLang() == 0) ||
619 CT.isObjcClassComplete();;
620 }
Eric Christophere0167892012-01-06 23:03:37 +0000621 unsigned Flags = IsImplementation ?
622 DwarfAccelTable::eTypeFlagClassIsImplementation : 0;
623 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000624 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000625
Devang Patel161b2f42011-04-12 23:21:44 +0000626 addToContextOwner(TyDIE, Ty.getContext());
627 return TyDIE;
628}
629
630/// addType - Add a new type attribute to the specified entity.
631void CompileUnit::addType(DIE *Entity, DIType Ty) {
632 if (!Ty.Verify())
633 return;
634
635 // Check for pre-existence.
636 DIEEntry *Entry = getDIEEntry(Ty);
637 // If it exists then use the existing value.
638 if (Entry) {
639 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
640 return;
641 }
642
643 // Construct type.
644 DIE *Buffer = getOrCreateTypeDIE(Ty);
645
646 // Set up proxy.
647 Entry = createDIEEntry(Buffer);
648 insertDIEEntry(Ty, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000649 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000650
651 // If this is a complete composite type then include it in the
652 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000653 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000654}
655
656/// addGlobalType - Add a new global type to the compile unit.
657///
Devang Patelc20bdf12011-06-01 00:23:24 +0000658void CompileUnit::addGlobalType(DIType Ty) {
Devang Patele9ae06c2011-05-31 22:56:51 +0000659 DIDescriptor Context = Ty.getContext();
660 if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
Devang Patel94c7ddb2011-08-16 22:09:43 +0000661 && (!Context || Context.isCompileUnit() || Context.isFile()
662 || Context.isNameSpace()))
Devang Patelc20bdf12011-06-01 00:23:24 +0000663 if (DIEEntry *Entry = getDIEEntry(Ty))
664 GlobalTypes[Ty.getName()] = Entry->getEntry();
Devang Patel161b2f42011-04-12 23:21:44 +0000665}
666
Devang Patel31c5d052011-05-06 16:57:54 +0000667/// addPubTypes - Add type for pubtypes section.
668void CompileUnit::addPubTypes(DISubprogram SP) {
669 DICompositeType SPTy = SP.getType();
670 unsigned SPTag = SPTy.getTag();
671 if (SPTag != dwarf::DW_TAG_subroutine_type)
672 return;
673
674 DIArray Args = SPTy.getTypeArray();
675 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
676 DIType ATy(Args.getElement(i));
677 if (!ATy.Verify())
678 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +0000679 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +0000680 }
681}
682
Devang Patel161b2f42011-04-12 23:21:44 +0000683/// constructTypeDIE - Construct basic type die from DIBasicType.
684void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
685 // Get core information.
686 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000687 // Add name if not anonymous or intermediate type.
688 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000689 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +0000690
691 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
692 Buffer.setTag(dwarf::DW_TAG_unspecified_type);
693 // Unspecified types has only name, nothing else.
694 return;
695 }
696
697 Buffer.setTag(dwarf::DW_TAG_base_type);
Nick Lewycky746cb672011-10-26 22:55:33 +0000698 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel734a67c2011-09-14 23:13:28 +0000699 BTy.getEncoding());
700
Devang Patel161b2f42011-04-12 23:21:44 +0000701 uint64_t Size = BTy.getSizeInBits() >> 3;
702 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
703}
704
705/// constructTypeDIE - Construct derived type die from DIDerivedType.
706void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
707 // Get core information.
708 StringRef Name = DTy.getName();
709 uint64_t Size = DTy.getSizeInBits() >> 3;
710 unsigned Tag = DTy.getTag();
711
712 // FIXME - Workaround for templates.
713 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
714
715 Buffer.setTag(Tag);
716
717 // Map to main type, void will not have a type.
718 DIType FromTy = DTy.getTypeDerivedFrom();
719 addType(&Buffer, FromTy);
720
721 // Add name if not anonymous or intermediate type.
722 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000723 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +0000724
725 // Add size if non-zero (derived types might be zero-sized.)
726 if (Size)
727 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
728
729 // Add source line info if available and TyDesc is not a forward declaration.
730 if (!DTy.isForwardDecl())
731 addSourceLine(&Buffer, DTy);
732}
733
734/// constructTypeDIE - Construct type DIE from DICompositeType.
735void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
736 // Get core information.
737 StringRef Name = CTy.getName();
738
739 uint64_t Size = CTy.getSizeInBits() >> 3;
740 unsigned Tag = CTy.getTag();
741 Buffer.setTag(Tag);
742
743 switch (Tag) {
744 case dwarf::DW_TAG_vector_type:
745 case dwarf::DW_TAG_array_type:
746 constructArrayTypeDIE(Buffer, &CTy);
747 break;
748 case dwarf::DW_TAG_enumeration_type: {
749 DIArray Elements = CTy.getTypeArray();
750
751 // Add enumerators to enumeration type.
752 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
753 DIE *ElemDie = NULL;
754 DIDescriptor Enum(Elements.getElement(i));
755 if (Enum.isEnumerator()) {
756 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
757 Buffer.addChild(ElemDie);
758 }
759 }
760 }
761 break;
762 case dwarf::DW_TAG_subroutine_type: {
763 // Add return type.
764 DIArray Elements = CTy.getTypeArray();
765 DIDescriptor RTy = Elements.getElement(0);
766 addType(&Buffer, DIType(RTy));
767
768 bool isPrototyped = true;
769 // Add arguments.
770 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
771 DIDescriptor Ty = Elements.getElement(i);
772 if (Ty.isUnspecifiedParameter()) {
773 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
774 Buffer.addChild(Arg);
775 isPrototyped = false;
776 } else {
777 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
778 addType(Arg, DIType(Ty));
779 Buffer.addChild(Arg);
780 }
781 }
782 // Add prototype flag.
783 if (isPrototyped)
784 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
785 }
786 break;
787 case dwarf::DW_TAG_structure_type:
788 case dwarf::DW_TAG_union_type:
789 case dwarf::DW_TAG_class_type: {
790 // Add elements to structure type.
791 DIArray Elements = CTy.getTypeArray();
792
793 // A forward struct declared type may not have elements available.
794 unsigned N = Elements.getNumElements();
795 if (N == 0)
796 break;
797
798 // Add elements to structure type.
799 for (unsigned i = 0; i < N; ++i) {
800 DIDescriptor Element = Elements.getElement(i);
801 DIE *ElemDie = NULL;
802 if (Element.isSubprogram()) {
803 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +0000804 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +0000805 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +0000806 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000807 dwarf::DW_ACCESS_protected);
808 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +0000809 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000810 dwarf::DW_ACCESS_private);
811 else
Nick Lewycky13aaca52011-12-13 05:09:11 +0000812 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000813 dwarf::DW_ACCESS_public);
814 if (SP.isExplicit())
815 addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
816 }
817 else if (Element.isVariable()) {
818 DIVariable DV(Element);
819 ElemDie = new DIE(dwarf::DW_TAG_variable);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000820 addString(ElemDie, dwarf::DW_AT_name, DV.getName());
Devang Patel161b2f42011-04-12 23:21:44 +0000821 addType(ElemDie, DV.getType());
822 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
823 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
824 addSourceLine(ElemDie, DV);
825 } else if (Element.isDerivedType())
826 ElemDie = createMemberDIE(DIDerivedType(Element));
827 else
828 continue;
829 Buffer.addChild(ElemDie);
830 }
831
832 if (CTy.isAppleBlockExtension())
833 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
834
835 unsigned RLang = CTy.getRunTimeLang();
836 if (RLang)
837 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
838 dwarf::DW_FORM_data1, RLang);
839
840 DICompositeType ContainingType = CTy.getContainingType();
841 if (DIDescriptor(ContainingType).isCompositeType())
842 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
843 getOrCreateTypeDIE(DIType(ContainingType)));
844 else {
845 DIDescriptor Context = CTy.getContext();
846 addToContextOwner(&Buffer, Context);
847 }
848
Devang Patel201e6cd2011-05-12 21:29:42 +0000849 if (CTy.isObjcClassComplete())
850 addUInt(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type,
Devang Patelb11f80e2011-05-12 19:06:16 +0000851 dwarf::DW_FORM_flag, 1);
852
Eric Christopher1a8e8862011-12-16 23:42:42 +0000853 // Add template parameters to a class, structure or union types.
854 // FIXME: The support isn't in the metadata for this yet.
855 if (Tag == dwarf::DW_TAG_class_type ||
856 Tag == dwarf::DW_TAG_structure_type ||
857 Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +0000858 addTemplateParams(Buffer, CTy.getTemplateParams());
859
860 break;
861 }
862 default:
863 break;
864 }
865
866 // Add name if not anonymous or intermediate type.
867 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000868 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +0000869
870 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
871 || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
Nick Lewycky746cb672011-10-26 22:55:33 +0000872 {
Devang Patel161b2f42011-04-12 23:21:44 +0000873 // Add size if non-zero (derived types might be zero-sized.)
874 if (Size)
875 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
876 else {
877 // Add zero size if it is not a forward declaration.
878 if (CTy.isForwardDecl())
879 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
880 else
881 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
882 }
883
884 // Add source line info if available.
885 if (!CTy.isForwardDecl())
886 addSourceLine(&Buffer, CTy);
887 }
888}
889
890/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
891/// for the given DITemplateTypeParameter.
892DIE *
893CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
894 DIE *ParamDIE = getDIE(TP);
895 if (ParamDIE)
896 return ParamDIE;
897
898 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
899 addType(ParamDIE, TP.getType());
Nick Lewycky390c40d2011-10-27 06:44:11 +0000900 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +0000901 return ParamDIE;
902}
903
904/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
905/// for the given DITemplateValueParameter.
906DIE *
907CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) {
908 DIE *ParamDIE = getDIE(TPV);
909 if (ParamDIE)
910 return ParamDIE;
911
912 ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
913 addType(ParamDIE, TPV.getType());
914 if (!TPV.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000915 addString(ParamDIE, dwarf::DW_AT_name, TPV.getName());
Devang Patel161b2f42011-04-12 23:21:44 +0000916 addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
917 TPV.getValue());
918 return ParamDIE;
919}
920
Devang Patel31c5d052011-05-06 16:57:54 +0000921/// getOrCreateNameSpace - Create a DIE for DINameSpace.
922DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
923 DIE *NDie = getDIE(NS);
924 if (NDie)
925 return NDie;
926 NDie = new DIE(dwarf::DW_TAG_namespace);
927 insertDIE(NS, NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +0000928 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +0000929 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +0000930 addAccelNamespace(NS.getName(), NDie);
931 } else
932 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +0000933 addSourceLine(NDie, NS);
934 addToContextOwner(NDie, NS.getContext());
935 return NDie;
936}
937
Devang Pateldbc64af2011-08-15 17:24:54 +0000938/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
939/// printer to not emit usual symbol prefix before the symbol name is used then
940/// return linkage name after skipping this special LLVM prefix.
941static StringRef getRealLinkageName(StringRef LinkageName) {
942 char One = '\1';
943 if (LinkageName.startswith(StringRef(&One, 1)))
944 return LinkageName.substr(1);
945 return LinkageName;
946}
947
948/// getOrCreateSubprogramDIE - Create new DIE using SP.
949DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
950 DIE *SPDie = getDIE(SP);
951 if (SPDie)
952 return SPDie;
953
Rafael Espindola01b55b42011-11-10 22:34:29 +0000954 DISubprogram SPDecl = SP.getFunctionDeclaration();
955 DIE *DeclDie = NULL;
956 if (SPDecl.isSubprogram()) {
957 DeclDie = getOrCreateSubprogramDIE(SPDecl);
958 }
959
Devang Pateldbc64af2011-08-15 17:24:54 +0000960 SPDie = new DIE(dwarf::DW_TAG_subprogram);
961
962 // DW_TAG_inlined_subroutine may refer to this DIE.
963 insertDIE(SP, SPDie);
964
965 // Add to context owner.
966 addToContextOwner(SPDie, SP.getContext());
967
968 // Add function template parameters.
969 addTemplateParams(*SPDie, SP.getTemplateParams());
970
971 StringRef LinkageName = SP.getLinkageName();
972 if (!LinkageName.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000973 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Nick Lewycky746cb672011-10-26 22:55:33 +0000974 getRealLinkageName(LinkageName));
Devang Pateldbc64af2011-08-15 17:24:54 +0000975
976 // If this DIE is going to refer declaration info using AT_specification
977 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +0000978 if (DeclDie) {
979 // Refer function declaration directly.
980 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
981 DeclDie);
982
Devang Pateldbc64af2011-08-15 17:24:54 +0000983 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +0000984 }
Devang Pateldbc64af2011-08-15 17:24:54 +0000985
986 // Constructors and operators for anonymous aggregates do not have names.
987 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000988 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +0000989
990 addSourceLine(SPDie, SP);
991
992 if (SP.isPrototyped())
993 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
994
995 // Add Return Type.
996 DICompositeType SPTy = SP.getType();
997 DIArray Args = SPTy.getTypeArray();
998 unsigned SPTag = SPTy.getTag();
999
1000 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1001 addType(SPDie, SPTy);
1002 else
1003 addType(SPDie, DIType(Args.getElement(0)));
1004
1005 unsigned VK = SP.getVirtuality();
1006 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001007 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001008 DIEBlock *Block = getDIEBlock();
1009 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1010 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1011 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1012 ContainingTypeMap.insert(std::make_pair(SPDie,
1013 SP.getContainingType()));
1014 }
1015
1016 if (!SP.isDefinition()) {
1017 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1018
1019 // Add arguments. Do not add arguments for subprogram definition. They will
1020 // be handled while processing variables.
1021 DICompositeType SPTy = SP.getType();
1022 DIArray Args = SPTy.getTypeArray();
1023 unsigned SPTag = SPTy.getTag();
1024
1025 if (SPTag == dwarf::DW_TAG_subroutine_type)
1026 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1027 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1028 DIType ATy = DIType(DIType(Args.getElement(i)));
1029 addType(Arg, ATy);
1030 if (ATy.isArtificial())
1031 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1032 SPDie->addChild(Arg);
1033 }
1034 }
1035
1036 if (SP.isArtificial())
1037 addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1038
1039 if (!SP.isLocalToUnit())
1040 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1041
1042 if (SP.isOptimized())
1043 addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1044
1045 if (unsigned isa = Asm->getISAEncoding()) {
1046 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1047 }
1048
1049 return SPDie;
1050}
1051
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001052// Return const expression if value is a GEP to access merged global
1053// constant. e.g.
1054// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1055static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1056 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1057 if (!CE || CE->getNumOperands() != 3 ||
1058 CE->getOpcode() != Instruction::GetElementPtr)
1059 return NULL;
1060
1061 // First operand points to a global struct.
1062 Value *Ptr = CE->getOperand(0);
1063 if (!isa<GlobalValue>(Ptr) ||
1064 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1065 return NULL;
1066
1067 // Second operand is zero.
1068 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1069 if (!CI || !CI->isZero())
1070 return NULL;
1071
1072 // Third operand is offset.
1073 if (!isa<ConstantInt>(CE->getOperand(2)))
1074 return NULL;
1075
1076 return CE;
1077}
1078
1079/// createGlobalVariableDIE - create global variable DIE.
1080void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001081 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001082 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001083 return;
1084
Devang Patel49e2f032011-08-18 22:21:50 +00001085 DIGlobalVariable GV(N);
Devang Patel28bea082011-08-18 23:17:55 +00001086 if (!GV.Verify())
1087 return;
1088
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001089 DIE *VariableDIE = new DIE(GV.getTag());
Devang Patel49e2f032011-08-18 22:21:50 +00001090 // Add to map.
1091 insertDIE(N, VariableDIE);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001092
1093 // Add name.
Nick Lewycky390c40d2011-10-27 06:44:11 +00001094 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001095 StringRef LinkageName = GV.getLinkageName();
Devang Patel49e2f032011-08-18 22:21:50 +00001096 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001097 if (!LinkageName.empty() && isGlobalVariable)
Nick Lewycky746cb672011-10-26 22:55:33 +00001098 addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Nick Lewycky390c40d2011-10-27 06:44:11 +00001099 getRealLinkageName(LinkageName));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001100 // Add type.
Devang Patel49e2f032011-08-18 22:21:50 +00001101 DIType GTy = GV.getType();
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001102 addType(VariableDIE, GTy);
1103
1104 // Add scoping info.
Eric Christopherdfa30e12011-11-09 05:24:07 +00001105 if (!GV.isLocalToUnit())
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001106 addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Eric Christopherdfa30e12011-11-09 05:24:07 +00001107
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001108 // Add line number info.
1109 addSourceLine(VariableDIE, GV);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001110 // Add to context owner.
1111 DIDescriptor GVContext = GV.getContext();
1112 addToContextOwner(VariableDIE, GVContext);
1113 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001114 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001115 DIE *VariableSpecDIE = NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001116 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001117 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001118 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1119 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1120 addLabel(Block, 0, dwarf::DW_FORM_udata,
1121 Asm->Mang->getSymbol(GV.getGlobal()));
1122 // Do not create specification DIE if context is either compile unit
1123 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001124 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001125 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1126 // Create specification DIE.
Eric Christopherd117fbb2011-11-11 01:55:22 +00001127 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001128 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1129 dwarf::DW_FORM_ref4, VariableDIE);
1130 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1131 addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag,
1132 1);
1133 addDie(VariableSpecDIE);
1134 } else {
1135 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001136 }
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001137 } else if (const ConstantInt *CI =
1138 dyn_cast_or_null<ConstantInt>(GV.getConstant()))
1139 addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
1140 else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001141 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001142 // GV is a merged global.
1143 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1144 Value *Ptr = CE->getOperand(0);
1145 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1146 addLabel(Block, 0, dwarf::DW_FORM_udata,
1147 Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
1148 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1149 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
1150 addUInt(Block, 0, dwarf::DW_FORM_udata,
1151 Asm->getTargetData().getIndexedOffset(Ptr->getType(), Idx));
1152 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1153 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1154 }
1155
Eric Christopherd117fbb2011-11-11 01:55:22 +00001156 if (addToAccelTable) {
1157 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1158 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001159
Eric Christopherd117fbb2011-11-11 01:55:22 +00001160 // If the linkage name is different than the name, go ahead and output
1161 // that as well into the name table.
1162 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1163 addAccelName(GV.getLinkageName(), AddrDIE);
1164 }
Eric Christopher74d8a872011-11-08 21:56:23 +00001165
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001166 return;
1167}
1168
Devang Patel161b2f42011-04-12 23:21:44 +00001169/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1170void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1171 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1172 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patelce35d8b2011-11-17 23:43:15 +00001173 uint64_t L = SR.getLo();
1174 uint64_t H = SR.getHi();
Devang Patel161b2f42011-04-12 23:21:44 +00001175
1176 // The L value defines the lower bounds which is typically zero for C/C++. The
1177 // H value is the upper bounds. Values are 64 bit. H - L + 1 is the size
1178 // of the array. If L > H then do not emit DW_AT_lower_bound and
1179 // DW_AT_upper_bound attributes. If L is zero and H is also zero then the
1180 // array has one element and in such case do not emit lower bound.
1181
1182 if (L > H) {
1183 Buffer.addChild(DW_Subrange);
1184 return;
1185 }
1186 if (L)
Devang Patelce35d8b2011-11-17 23:43:15 +00001187 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1188 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
Devang Patel161b2f42011-04-12 23:21:44 +00001189 Buffer.addChild(DW_Subrange);
1190}
1191
1192/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1193void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1194 DICompositeType *CTy) {
1195 Buffer.setTag(dwarf::DW_TAG_array_type);
1196 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1197 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1198
1199 // Emit derived type.
1200 addType(&Buffer, CTy->getTypeDerivedFrom());
1201 DIArray Elements = CTy->getTypeArray();
1202
1203 // Get an anonymous type for index type.
1204 DIE *IdxTy = getIndexTyDie();
1205 if (!IdxTy) {
1206 // Construct an anonymous type for index type.
1207 IdxTy = new DIE(dwarf::DW_TAG_base_type);
1208 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1209 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1210 dwarf::DW_ATE_signed);
1211 addDie(IdxTy);
1212 setIndexTyDie(IdxTy);
1213 }
1214
1215 // Add subranges to array type.
1216 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1217 DIDescriptor Element = Elements.getElement(i);
1218 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1219 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1220 }
1221}
1222
1223/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1224DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1225 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1226 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001227 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001228 int64_t Value = ETy.getEnumValue();
1229 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1230 return Enumerator;
1231}
1232
Devang Pateldbc64af2011-08-15 17:24:54 +00001233/// constructContainingTypeDIEs - Construct DIEs for types that contain
1234/// vtables.
1235void CompileUnit::constructContainingTypeDIEs() {
1236 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1237 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1238 DIE *SPDie = CI->first;
1239 const MDNode *N = CI->second;
1240 if (!N) continue;
1241 DIE *NDie = getDIE(N);
1242 if (!NDie) continue;
1243 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1244 }
1245}
1246
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001247/// constructVariableDIE - Construct a DIE for the given DbgVariable.
1248DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
1249 StringRef Name = DV->getName();
1250 if (Name.empty())
1251 return NULL;
1252
1253 // Translate tag to proper Dwarf tag.
1254 unsigned Tag = DV->getTag();
1255
1256 // Define variable debug information entry.
1257 DIE *VariableDie = new DIE(Tag);
1258 DbgVariable *AbsVar = DV->getAbstractVariable();
1259 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
1260 if (AbsDIE)
1261 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1262 dwarf::DW_FORM_ref4, AbsDIE);
1263 else {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001264 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001265 addSourceLine(VariableDie, DV->getVariable());
1266 addType(VariableDie, DV->getType());
1267 }
1268
1269 if (DV->isArtificial())
1270 addUInt(VariableDie, dwarf::DW_AT_artificial,
1271 dwarf::DW_FORM_flag, 1);
1272
1273 if (isScopeAbstract) {
1274 DV->setDIE(VariableDie);
1275 return VariableDie;
1276 }
1277
1278 // Add variable address.
1279
1280 unsigned Offset = DV->getDotDebugLocOffset();
1281 if (Offset != ~0U) {
1282 addLabel(VariableDie, dwarf::DW_AT_location,
1283 dwarf::DW_FORM_data4,
1284 Asm->GetTempSymbol("debug_loc", Offset));
1285 DV->setDIE(VariableDie);
1286 return VariableDie;
1287 }
1288
Eric Christopher8cf5e742011-10-03 15:49:20 +00001289 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001290 if (const MachineInstr *DVInsn = DV->getMInsn()) {
1291 bool updated = false;
1292 if (DVInsn->getNumOperands() == 3) {
1293 if (DVInsn->getOperand(0).isReg()) {
1294 const MachineOperand RegOp = DVInsn->getOperand(0);
1295 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1296 if (DVInsn->getOperand(1).isImm() &&
1297 TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
1298 unsigned FrameReg = 0;
1299 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
1300 int Offset =
1301 TFI->getFrameIndexReference(*Asm->MF,
1302 DVInsn->getOperand(1).getImm(),
1303 FrameReg);
1304 MachineLocation Location(FrameReg, Offset);
1305 addVariableAddress(DV, VariableDie, Location);
1306
1307 } else if (RegOp.getReg())
1308 addVariableAddress(DV, VariableDie,
1309 MachineLocation(RegOp.getReg()));
1310 updated = true;
1311 }
1312 else if (DVInsn->getOperand(0).isImm())
1313 updated =
1314 addConstantValue(VariableDie, DVInsn->getOperand(0),
1315 DV->getType());
1316 else if (DVInsn->getOperand(0).isFPImm())
1317 updated =
1318 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
1319 else if (DVInsn->getOperand(0).isCImm())
1320 updated =
1321 addConstantValue(VariableDie,
1322 DVInsn->getOperand(0).getCImm(),
1323 DV->getType().isUnsignedDIType());
1324 } else {
1325 addVariableAddress(DV, VariableDie,
1326 Asm->getDebugValueLocation(DVInsn));
1327 updated = true;
1328 }
1329 if (!updated) {
1330 // If variableDie is not updated then DBG_VALUE instruction does not
1331 // have valid variable info.
1332 delete VariableDie;
1333 return NULL;
1334 }
1335 DV->setDIE(VariableDie);
1336 return VariableDie;
1337 } else {
1338 // .. else use frame index.
1339 int FI = DV->getFrameIndex();
1340 if (FI != ~0) {
1341 unsigned FrameReg = 0;
1342 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
1343 int Offset =
1344 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1345 MachineLocation Location(FrameReg, Offset);
1346 addVariableAddress(DV, VariableDie, Location);
1347 }
1348 }
1349
1350 DV->setDIE(VariableDie);
1351 return VariableDie;
1352}
1353
Devang Patel161b2f42011-04-12 23:21:44 +00001354/// createMemberDIE - Create new member DIE.
1355DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1356 DIE *MemberDie = new DIE(DT.getTag());
1357 StringRef Name = DT.getName();
1358 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001359 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001360
1361 addType(MemberDie, DT.getTypeDerivedFrom());
1362
1363 addSourceLine(MemberDie, DT);
1364
1365 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1366 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1367
1368 uint64_t Size = DT.getSizeInBits();
1369 uint64_t FieldSize = DT.getOriginalTypeSize();
1370
1371 if (Size != FieldSize) {
1372 // Handle bitfield.
1373 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1374 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1375
1376 uint64_t Offset = DT.getOffsetInBits();
1377 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1378 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1379 uint64_t FieldOffset = (HiMark - FieldSize);
1380 Offset -= FieldOffset;
1381
1382 // Maybe we need to work from the other end.
1383 if (Asm->getTargetData().isLittleEndian())
1384 Offset = FieldSize - (Offset + Size);
1385 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1386
1387 // Here WD_AT_data_member_location points to the anonymous
1388 // field that includes this bit field.
1389 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1390
1391 } else
1392 // This is not a bitfield.
1393 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1394
1395 if (DT.getTag() == dwarf::DW_TAG_inheritance
1396 && DT.isVirtual()) {
1397
1398 // For C++, virtual base classes are not at fixed offset. Use following
1399 // expression to extract appropriate offset from vtable.
1400 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1401
1402 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1403 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1404 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1405 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1406 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1407 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1408 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1409 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1410
1411 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1412 VBaseLocationDie);
1413 } else
1414 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1415
1416 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001417 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001418 dwarf::DW_ACCESS_protected);
1419 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001420 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001421 dwarf::DW_ACCESS_private);
1422 // Otherwise C++ member and base classes are considered public.
Devang Patel94c7ddb2011-08-16 22:09:43 +00001423 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001424 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001425 dwarf::DW_ACCESS_public);
1426 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001427 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001428 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001429
1430 // Objective-C properties.
1431 StringRef PropertyName = DT.getObjCPropertyName();
1432 if (!PropertyName.empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001433 addString(MemberDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Devang Patele9db5e22011-04-16 00:11:51 +00001434 StringRef GetterName = DT.getObjCPropertyGetterName();
1435 if (!GetterName.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001436 addString(MemberDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
Devang Patele9db5e22011-04-16 00:11:51 +00001437 StringRef SetterName = DT.getObjCPropertySetterName();
1438 if (!SetterName.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001439 addString(MemberDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
Devang Patele9db5e22011-04-16 00:11:51 +00001440 unsigned PropertyAttributes = 0;
1441 if (DT.isReadOnlyObjCProperty())
1442 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1443 if (DT.isReadWriteObjCProperty())
1444 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1445 if (DT.isAssignObjCProperty())
1446 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1447 if (DT.isRetainObjCProperty())
1448 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1449 if (DT.isCopyObjCProperty())
1450 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1451 if (DT.isNonAtomicObjCProperty())
1452 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1453 if (PropertyAttributes)
1454 addUInt(MemberDie, dwarf::DW_AT_APPLE_property_attribute, 0,
1455 PropertyAttributes);
1456 }
Devang Patel161b2f42011-04-12 23:21:44 +00001457 return MemberDie;
1458}