]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - opencl/llvm.git/blob - lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
Make a bunch of CompileUnit member functions private.
[opencl/llvm.git] / lib / CodeGen / AsmPrinter / DwarfCompileUnit.cpp
1 //===-- 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 constructing a dwarf compile unit.
11 //
12 //===----------------------------------------------------------------------===//
14 #define DEBUG_TYPE "dwarfdebug"
16 #include "DwarfCompileUnit.h"
17 #include "DwarfAccelTable.h"
18 #include "DwarfDebug.h"
19 #include "llvm/ADT/APFloat.h"
20 #include "llvm/DIBuilder.h"
21 #include "llvm/IR/Constants.h"
22 #include "llvm/IR/DataLayout.h"
23 #include "llvm/IR/GlobalVariable.h"
24 #include "llvm/IR/Instructions.h"
25 #include "llvm/Target/Mangler.h"
26 #include "llvm/Target/TargetFrameLowering.h"
27 #include "llvm/Target/TargetMachine.h"
28 #include "llvm/Target/TargetLoweringObjectFile.h"
29 #include "llvm/Target/TargetRegisterInfo.h"
31 using namespace llvm;
33 /// CompileUnit - Compile unit constructor.
34 CompileUnit::CompileUnit(unsigned UID, DIE *D, const MDNode *N, AsmPrinter *A,
35                          DwarfDebug *DW, DwarfUnits *DWU)
36     : UniqueID(UID), Node(N), CUDie(D), Asm(A), DD(DW), DU(DWU), IndexTyDie(0) {
37   DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
38   insertDIE(N, D);
39 }
41 /// ~CompileUnit - Destructor for compile unit.
42 CompileUnit::~CompileUnit() {
43   for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
44     DIEBlocks[j]->~DIEBlock();
45 }
47 /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
48 /// information entry.
49 DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
50   DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
51   return Value;
52 }
54 /// getDefaultLowerBound - Return the default lower bound for an array. If the
55 /// DWARF version doesn't handle the language, return -1.
56 int64_t CompileUnit::getDefaultLowerBound() const {
57   switch (DICompileUnit(Node).getLanguage()) {
58   default:
59     break;
61   case dwarf::DW_LANG_C89:
62   case dwarf::DW_LANG_C99:
63   case dwarf::DW_LANG_C:
64   case dwarf::DW_LANG_C_plus_plus:
65   case dwarf::DW_LANG_ObjC:
66   case dwarf::DW_LANG_ObjC_plus_plus:
67     return 0;
69   case dwarf::DW_LANG_Fortran77:
70   case dwarf::DW_LANG_Fortran90:
71   case dwarf::DW_LANG_Fortran95:
72     return 1;
74   // The languages below have valid values only if the DWARF version >= 4.
75   case dwarf::DW_LANG_Java:
76   case dwarf::DW_LANG_Python:
77   case dwarf::DW_LANG_UPC:
78   case dwarf::DW_LANG_D:
79     if (dwarf::DWARF_VERSION >= 4)
80       return 0;
81     break;
83   case dwarf::DW_LANG_Ada83:
84   case dwarf::DW_LANG_Ada95:
85   case dwarf::DW_LANG_Cobol74:
86   case dwarf::DW_LANG_Cobol85:
87   case dwarf::DW_LANG_Modula2:
88   case dwarf::DW_LANG_Pascal83:
89   case dwarf::DW_LANG_PLI:
90     if (dwarf::DWARF_VERSION >= 4)
91       return 1;
92     break;
93   }
95   return -1;
96 }
98 /// addFlag - Add a flag that is true.
99 void CompileUnit::addFlag(DIE *Die, uint16_t Attribute) {
100   if (DD->getDwarfVersion() >= 4)
101     Die->addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
102   else
103     Die->addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
106 /// addUInt - Add an unsigned integer attribute data and value.
107 ///
108 void CompileUnit::addUInt(DIE *Die, uint16_t Attribute,
109                           uint16_t Form, uint64_t Integer) {
110   if (!Form) Form = DIEInteger::BestForm(false, Integer);
111   DIEValue *Value = Integer == 1 ?
112     DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
113   Die->addValue(Attribute, Form, Value);
116 /// addSInt - Add an signed integer attribute data and value.
117 ///
118 void CompileUnit::addSInt(DIE *Die, uint16_t Attribute,
119                           uint16_t Form, int64_t Integer) {
120   if (!Form) Form = DIEInteger::BestForm(true, Integer);
121   DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
122   Die->addValue(Attribute, Form, Value);
125 /// addString - Add a string attribute data and value. We always emit a
126 /// reference to the string pool instead of immediate strings so that DIEs have
127 /// more predictable sizes. In the case of split dwarf we emit an index
128 /// into another table which gets us the static offset into the string
129 /// table.
130 void CompileUnit::addString(DIE *Die, uint16_t Attribute, StringRef String) {
131   DIEValue *Value;
132   uint16_t Form;
133   if (!DD->useSplitDwarf()) {
134     MCSymbol *Symb = DU->getStringPoolEntry(String);
135     if (Asm->needsRelocationsForDwarfStringPool())
136       Value = new (DIEValueAllocator) DIELabel(Symb);
137     else {
138       MCSymbol *StringPool = DU->getStringPoolSym();
139       Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
140     }
141     Form = dwarf::DW_FORM_strp;
142   } else {
143     unsigned idx = DU->getStringPoolIndex(String);
144     Value = new (DIEValueAllocator) DIEInteger(idx);
145     Form = dwarf::DW_FORM_GNU_str_index;
146   }
147   DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
148   Die->addValue(Attribute, Form, Str);
151 /// addLocalString - Add a string attribute data and value. This is guaranteed
152 /// to be in the local string pool instead of indirected.
153 void CompileUnit::addLocalString(DIE *Die, uint16_t Attribute,
154                                  StringRef String) {
155   MCSymbol *Symb = DU->getStringPoolEntry(String);
156   DIEValue *Value;
157   if (Asm->needsRelocationsForDwarfStringPool())
158     Value = new (DIEValueAllocator) DIELabel(Symb);
159   else {
160     MCSymbol *StringPool = DU->getStringPoolSym();
161     Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
162   }
163   Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
166 /// addExpr - Add a Dwarf expression attribute data and value.
167 ///
168 void CompileUnit::addExpr(DIE *Die, uint16_t Attribute, uint16_t Form,
169                           const MCExpr *Expr) {
170   DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
171   Die->addValue(Attribute, Form, Value);
174 /// addLabel - Add a Dwarf label attribute data and value.
175 ///
176 void CompileUnit::addLabel(DIE *Die, uint16_t Attribute, uint16_t Form,
177                            const MCSymbol *Label) {
178   DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
179   Die->addValue(Attribute, Form, Value);
182 /// addLabelAddress - Add a dwarf label attribute data and value using
183 /// DW_FORM_addr or DW_FORM_GNU_addr_index.
184 ///
185 void CompileUnit::addLabelAddress(DIE *Die, uint16_t Attribute,
186                                   MCSymbol *Label) {
187   if (Label)
188     DD->addArangeLabel(SymbolCU(this, Label));
190   if (!DD->useSplitDwarf()) {
191     if (Label != NULL) {
192       DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
193       Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
194     } else {
195       DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
196       Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
197     }
198   } else {
199     unsigned idx = DU->getAddrPoolIndex(Label);
200     DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
201     Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
202   }
205 /// addOpAddress - Add a dwarf op address data and value using the
206 /// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
207 ///
208 void CompileUnit::addOpAddress(DIE *Die, const MCSymbol *Sym) {
209   DD->addArangeLabel(SymbolCU(this, Sym));
210   if (!DD->useSplitDwarf()) {
211     addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
212     addLabel(Die, 0, dwarf::DW_FORM_udata, Sym);
213   } else {
214     addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
215     addUInt(Die, 0, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
216   }
219 /// addDelta - Add a label delta attribute data and value.
220 ///
221 void CompileUnit::addDelta(DIE *Die, uint16_t Attribute, uint16_t Form,
222                            const MCSymbol *Hi, const MCSymbol *Lo) {
223   DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
224   Die->addValue(Attribute, Form, Value);
227 /// addDIEEntry - Add a DIE attribute data and value.
228 ///
229 void CompileUnit::addDIEEntry(DIE *Die, uint16_t Attribute, uint16_t Form,
230                               DIE *Entry) {
231   Die->addValue(Attribute, Form, createDIEEntry(Entry));
234 /// addBlock - Add block data.
235 ///
236 void CompileUnit::addBlock(DIE *Die, uint16_t Attribute, uint16_t Form,
237                            DIEBlock *Block) {
238   Block->ComputeSize(Asm);
239   DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
240   Die->addValue(Attribute, Block->BestForm(), Block);
243 /// addSourceLine - Add location information to specified debug information
244 /// entry.
245 void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
246   // Verify variable.
247   if (!V.isVariable())
248     return;
250   unsigned Line = V.getLineNumber();
251   if (Line == 0)
252     return;
253   unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(),
254                                             V.getContext().getDirectory(),
255                                             getUniqueID());
256   assert(FileID && "Invalid file id");
257   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
258   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
261 /// addSourceLine - Add location information to specified debug information
262 /// entry.
263 void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
264   // Verify global variable.
265   if (!G.isGlobalVariable())
266     return;
268   unsigned Line = G.getLineNumber();
269   if (Line == 0)
270     return;
271   unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(),
272                                             getUniqueID());
273   assert(FileID && "Invalid file id");
274   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
275   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
278 /// addSourceLine - Add location information to specified debug information
279 /// entry.
280 void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
281   // Verify subprogram.
282   if (!SP.isSubprogram())
283     return;
285   // If the line number is 0, don't add it.
286   unsigned Line = SP.getLineNumber();
287   if (Line == 0)
288     return;
290   unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(),
291                                             SP.getDirectory(), getUniqueID());
292   assert(FileID && "Invalid file id");
293   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
294   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
297 /// addSourceLine - Add location information to specified debug information
298 /// entry.
299 void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
300   // Verify type.
301   if (!Ty.isType())
302     return;
304   unsigned Line = Ty.getLineNumber();
305   if (Line == 0)
306     return;
307   unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(),
308                                             Ty.getDirectory(), getUniqueID());
309   assert(FileID && "Invalid file id");
310   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
311   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
314 /// addSourceLine - Add location information to specified debug information
315 /// entry.
316 void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
317   // Verify type.
318   if (!Ty.isObjCProperty())
319     return;
321   unsigned Line = Ty.getLineNumber();
322   if (Line == 0)
323     return;
324   DIFile File = Ty.getFile();
325   unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
326                                             File.getDirectory(), getUniqueID());
327   assert(FileID && "Invalid file id");
328   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
329   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
332 /// addSourceLine - Add location information to specified debug information
333 /// entry.
334 void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
335   // Verify namespace.
336   if (!NS.Verify())
337     return;
339   unsigned Line = NS.getLineNumber();
340   if (Line == 0)
341     return;
342   StringRef FN = NS.getFilename();
344   unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory(),
345                                             getUniqueID());
346   assert(FileID && "Invalid file id");
347   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
348   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
351 /// addVariableAddress - Add DW_AT_location attribute for a
352 /// DbgVariable based on provided MachineLocation.
353 void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
354                                      MachineLocation Location) {
355   if (DV.variableHasComplexAddress())
356     addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
357   else if (DV.isBlockByrefVariable())
358     addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
359   else
360     addAddress(Die, dwarf::DW_AT_location, Location,
361                DV.getVariable().isIndirect());
364 /// addRegisterOp - Add register operand.
365 void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
366   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
367   unsigned DWReg = RI->getDwarfRegNum(Reg, false);
368   if (DWReg < 32)
369     addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
370   else {
371     addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
372     addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
373   }
376 /// addRegisterOffset - Add register offset.
377 void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
378                                     int64_t Offset) {
379   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
380   unsigned DWReg = RI->getDwarfRegNum(Reg, false);
381   const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
382   if (Reg == TRI->getFrameRegister(*Asm->MF))
383     // If variable offset is based in frame register then use fbreg.
384     addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
385   else if (DWReg < 32)
386     addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
387   else {
388     addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
389     addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
390   }
391   addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
394 /// addAddress - Add an address attribute to a die based on the location
395 /// provided.
396 void CompileUnit::addAddress(DIE *Die, uint16_t Attribute,
397                              const MachineLocation &Location, bool Indirect) {
398   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
400   if (Location.isReg() && !Indirect)
401     addRegisterOp(Block, Location.getReg());
402   else {
403     addRegisterOffset(Block, Location.getReg(), Location.getOffset());
404     if (Indirect && !Location.isReg()) {
405       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
406     }
407   }
409   // Now attach the location information to the DIE.
410   addBlock(Die, Attribute, 0, Block);
413 /// addComplexAddress - Start with the address based on the location provided,
414 /// and generate the DWARF information necessary to find the actual variable
415 /// given the extra address information encoded in the DIVariable, starting from
416 /// the starting location.  Add the DWARF information to the die.
417 ///
418 void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
419                                     uint16_t Attribute,
420                                     const MachineLocation &Location) {
421   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
422   unsigned N = DV.getNumAddrElements();
423   unsigned i = 0;
424   if (Location.isReg()) {
425     if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
426       // If first address element is OpPlus then emit
427       // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
428       addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
429       i = 2;
430     } else
431       addRegisterOp(Block, Location.getReg());
432   }
433   else
434     addRegisterOffset(Block, Location.getReg(), Location.getOffset());
436   for (;i < N; ++i) {
437     uint64_t Element = DV.getAddrElement(i);
438     if (Element == DIBuilder::OpPlus) {
439       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
440       addUInt(Block, 0, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
441     } else if (Element == DIBuilder::OpDeref) {
442       if (!Location.isReg())
443         addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
444     } else llvm_unreachable("unknown DIBuilder Opcode");
445   }
447   // Now attach the location information to the DIE.
448   addBlock(Die, Attribute, 0, Block);
451 /* Byref variables, in Blocks, are declared by the programmer as "SomeType
452    VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
453    gives the variable VarName either the struct, or a pointer to the struct, as
454    its type.  This is necessary for various behind-the-scenes things the
455    compiler needs to do with by-reference variables in Blocks.
457    However, as far as the original *programmer* is concerned, the variable
458    should still have type 'SomeType', as originally declared.
460    The function getBlockByrefType dives into the __Block_byref_x_VarName
461    struct to find the original type of the variable, which is then assigned to
462    the variable's Debug Information Entry as its real type.  So far, so good.
463    However now the debugger will expect the variable VarName to have the type
464    SomeType.  So we need the location attribute for the variable to be an
465    expression that explains to the debugger how to navigate through the
466    pointers and struct to find the actual variable of type SomeType.
468    The following function does just that.  We start by getting
469    the "normal" location for the variable. This will be the location
470    of either the struct __Block_byref_x_VarName or the pointer to the
471    struct __Block_byref_x_VarName.
473    The struct will look something like:
475    struct __Block_byref_x_VarName {
476      ... <various fields>
477      struct __Block_byref_x_VarName *forwarding;
478      ... <various other fields>
479      SomeType VarName;
480      ... <maybe more fields>
481    };
483    If we are given the struct directly (as our starting point) we
484    need to tell the debugger to:
486    1).  Add the offset of the forwarding field.
488    2).  Follow that pointer to get the real __Block_byref_x_VarName
489    struct to use (the real one may have been copied onto the heap).
491    3).  Add the offset for the field VarName, to find the actual variable.
493    If we started with a pointer to the struct, then we need to
494    dereference that pointer first, before the other steps.
495    Translating this into DWARF ops, we will need to append the following
496    to the current location description for the variable:
498    DW_OP_deref                    -- optional, if we start with a pointer
499    DW_OP_plus_uconst <forward_fld_offset>
500    DW_OP_deref
501    DW_OP_plus_uconst <varName_fld_offset>
503    That is what this function does.  */
505 /// addBlockByrefAddress - Start with the address based on the location
506 /// provided, and generate the DWARF information necessary to find the
507 /// actual Block variable (navigating the Block struct) based on the
508 /// starting location.  Add the DWARF information to the die.  For
509 /// more information, read large comment just above here.
510 ///
511 void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
512                                        uint16_t Attribute,
513                                        const MachineLocation &Location) {
514   DIType Ty = DV.getType();
515   DIType TmpTy = Ty;
516   uint16_t Tag = Ty.getTag();
517   bool isPointer = false;
519   StringRef varName = DV.getName();
521   if (Tag == dwarf::DW_TAG_pointer_type) {
522     DIDerivedType DTy = DIDerivedType(Ty);
523     TmpTy = DTy.getTypeDerivedFrom();
524     isPointer = true;
525   }
527   DICompositeType blockStruct = DICompositeType(TmpTy);
529   // Find the __forwarding field and the variable field in the __Block_byref
530   // struct.
531   DIArray Fields = blockStruct.getTypeArray();
532   DIDescriptor varField = DIDescriptor();
533   DIDescriptor forwardingField = DIDescriptor();
535   for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
536     DIDescriptor Element = Fields.getElement(i);
537     DIDerivedType DT = DIDerivedType(Element);
538     StringRef fieldName = DT.getName();
539     if (fieldName == "__forwarding")
540       forwardingField = Element;
541     else if (fieldName == varName)
542       varField = Element;
543   }
545   // Get the offsets for the forwarding field and the variable field.
546   unsigned forwardingFieldOffset =
547     DIDerivedType(forwardingField).getOffsetInBits() >> 3;
548   unsigned varFieldOffset =
549     DIDerivedType(varField).getOffsetInBits() >> 3;
551   // Decode the original location, and use that as the start of the byref
552   // variable's location.
553   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
555   if (Location.isReg())
556     addRegisterOp(Block, Location.getReg());
557   else
558     addRegisterOffset(Block, Location.getReg(), Location.getOffset());
560   // If we started with a pointer to the __Block_byref... struct, then
561   // the first thing we need to do is dereference the pointer (DW_OP_deref).
562   if (isPointer)
563     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
565   // Next add the offset for the '__forwarding' field:
566   // DW_OP_plus_uconst ForwardingFieldOffset.  Note there's no point in
567   // adding the offset if it's 0.
568   if (forwardingFieldOffset > 0) {
569     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
570     addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
571   }
573   // Now dereference the __forwarding field to get to the real __Block_byref
574   // struct:  DW_OP_deref.
575   addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
577   // Now that we've got the real __Block_byref... struct, add the offset
578   // for the variable's field to get to the location of the actual variable:
579   // DW_OP_plus_uconst varFieldOffset.  Again, don't add if it's 0.
580   if (varFieldOffset > 0) {
581     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
582     addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
583   }
585   // Now attach the location information to the DIE.
586   addBlock(Die, Attribute, 0, Block);
589 /// isTypeSigned - Return true if the type is signed.
590 static bool isTypeSigned(DIType Ty, int *SizeInBits) {
591   if (Ty.isDerivedType())
592     return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
593   if (Ty.isBasicType())
594     if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
595         || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
596       *SizeInBits = Ty.getSizeInBits();
597       return true;
598     }
599   return false;
602 /// addConstantValue - Add constant value entry in variable DIE.
603 void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
604                                    DIType Ty) {
605   // FIXME: This is a bit conservative/simple - it emits negative values at
606   // their maximum bit width which is a bit unfortunate (& doesn't prefer
607   // udata/sdata over dataN as suggested by the DWARF spec)
608   assert(MO.isImm() && "Invalid machine operand!");
609   int SizeInBits = -1;
610   bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
611   uint16_t Form;
613   // If we're a signed constant definitely use sdata.
614   if (SignedConstant) {
615     addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
616     return;
617   }
619   // Else use data for now unless it's larger than we can deal with.
620   switch (SizeInBits) {
621   case 8:
622     Form = dwarf::DW_FORM_data1;
623     break;
624   case 16:
625     Form = dwarf::DW_FORM_data2;
626     break;
627   case 32:
628     Form = dwarf::DW_FORM_data4;
629     break;
630   case 64:
631     Form = dwarf::DW_FORM_data8;
632     break;
633   default:
634     Form = dwarf::DW_FORM_udata;
635     addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
636     return;
637   }
638   addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
641 /// addConstantFPValue - Add constant value entry in variable DIE.
642 void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
643   assert (MO.isFPImm() && "Invalid machine operand!");
644   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
645   APFloat FPImm = MO.getFPImm()->getValueAPF();
647   // Get the raw data form of the floating point.
648   const APInt FltVal = FPImm.bitcastToAPInt();
649   const char *FltPtr = (const char*)FltVal.getRawData();
651   int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
652   bool LittleEndian = Asm->getDataLayout().isLittleEndian();
653   int Incr = (LittleEndian ? 1 : -1);
654   int Start = (LittleEndian ? 0 : NumBytes - 1);
655   int Stop = (LittleEndian ? NumBytes : -1);
657   // Output the constant to DWARF one byte at a time.
658   for (; Start != Stop; Start += Incr)
659     addUInt(Block, 0, dwarf::DW_FORM_data1,
660             (unsigned char)0xFF & FltPtr[Start]);
662   addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
665 /// addConstantFPValue - Add constant value entry in variable DIE.
666 void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
667   // Pass this down to addConstantValue as an unsigned bag of bits.
668   addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
671 /// addConstantValue - Add constant value entry in variable DIE.
672 void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
673                                    bool Unsigned) {
674   addConstantValue(Die, CI->getValue(), Unsigned);
677 // addConstantValue - Add constant value entry in variable DIE.
678 void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
679   unsigned CIBitWidth = Val.getBitWidth();
680   if (CIBitWidth <= 64) {
681     // If we're a signed constant definitely use sdata.
682     if (!Unsigned) {
683       addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
684               Val.getSExtValue());
685       return;
686     }
688     // Else use data for now unless it's larger than we can deal with.
689     uint16_t Form;
690     switch (CIBitWidth) {
691     case 8:
692       Form = dwarf::DW_FORM_data1;
693       break;
694     case 16:
695       Form = dwarf::DW_FORM_data2;
696       break;
697     case 32:
698       Form = dwarf::DW_FORM_data4;
699       break;
700     case 64:
701       Form = dwarf::DW_FORM_data8;
702       break;
703     default:
704       addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
705               Val.getZExtValue());
706       return;
707     }
708     addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
709     return;
710   }
712   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
714   // Get the raw data form of the large APInt.
715   const uint64_t *Ptr64 = Val.getRawData();
717   int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
718   bool LittleEndian = Asm->getDataLayout().isLittleEndian();
720   // Output the constant to DWARF one byte at a time.
721   for (int i = 0; i < NumBytes; i++) {
722     uint8_t c;
723     if (LittleEndian)
724       c = Ptr64[i / 8] >> (8 * (i & 7));
725     else
726       c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
727     addUInt(Block, 0, dwarf::DW_FORM_data1, c);
728   }
730   addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
733 /// addTemplateParams - Add template parameters into buffer.
734 void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
735   // Add template parameters.
736   for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
737     DIDescriptor Element = TParams.getElement(i);
738     if (Element.isTemplateTypeParameter())
739       Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
740                         DITemplateTypeParameter(Element)));
741     else if (Element.isTemplateValueParameter())
742       Buffer.addChild(getOrCreateTemplateValueParameterDIE(
743                         DITemplateValueParameter(Element)));
744   }
747 /// getOrCreateContextDIE - Get context owner's DIE.
748 DIE *CompileUnit::getOrCreateContextDIE(DIScope Context) {
749   if (Context.isType())
750     return getOrCreateTypeDIE(DIType(Context));
751   else if (Context.isNameSpace())
752     return getOrCreateNameSpace(DINameSpace(Context));
753   else if (Context.isSubprogram())
754     return getOrCreateSubprogramDIE(DISubprogram(Context));
755   else
756     return getDIE(Context);
759 /// addToContextOwner - Add Die into the list of its context owner's children.
760 void CompileUnit::addToContextOwner(DIE *Die, DIScope Context) {
761   assert(!Die->getParent());
762   if (DIE *ContextDIE = getOrCreateContextDIE(Context)) {
763     if (Die->getParent()) {
764       // While creating the context, if this is a type member, we will have
765       // added the child to the context already.
766       assert(Die->getParent() == ContextDIE);
767       return;
768     }
769     ContextDIE->addChild(Die);
770   } else
771     addDie(Die);
774 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
775 /// given DIType.
776 DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
777   DIType Ty(TyNode);
778   if (!Ty.isType())
779     return NULL;
780   DIE *TyDIE = getDIE(Ty);
781   if (TyDIE)
782     return TyDIE;
784   // Create new type.
785   TyDIE = new DIE(Ty.getTag());
786   insertDIE(Ty, TyDIE);
787   if (Ty.isBasicType())
788     constructTypeDIE(*TyDIE, DIBasicType(Ty));
789   else if (Ty.isCompositeType())
790     constructTypeDIE(*TyDIE, DICompositeType(Ty));
791   else {
792     assert(Ty.isDerivedType() && "Unknown kind of DIType");
793     constructTypeDIE(*TyDIE, DIDerivedType(Ty));
794   }
795   // If this is a named finished type then include it in the list of types
796   // for the accelerator tables.
797   if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
798     bool IsImplementation = 0;
799     if (Ty.isCompositeType()) {
800       DICompositeType CT(Ty);
801       // A runtime language of 0 actually means C/C++ and that any
802       // non-negative value is some version of Objective-C/C++.
803       IsImplementation = (CT.getRunTimeLang() == 0) ||
804         CT.isObjcClassComplete();
805     }
806     unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
807     addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
808   }
810   addToContextOwner(TyDIE, DD->resolve(Ty.getContext()));
811   return TyDIE;
814 /// addType - Add a new type attribute to the specified entity.
815 void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {
816   assert(Ty && "Trying to add a type that doesn't exist?");
818   // Check for pre-existence.
819   DIEEntry *Entry = getDIEEntry(Ty);
820   // If it exists then use the existing value.
821   if (Entry) {
822     Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
823     return;
824   }
826   // Construct type.
827   DIE *Buffer = getOrCreateTypeDIE(Ty);
829   // Set up proxy.
830   Entry = createDIEEntry(Buffer);
831   insertDIEEntry(Ty, Entry);
832   Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
834   // If this is a complete composite type then include it in the
835   // list of global types.
836   addGlobalType(Ty);
839 // Accelerator table mutators - add each name along with its companion
840 // DIE to the proper table while ensuring that the name that we're going
841 // to reference is in the string table. We do this since the names we
842 // add may not only be identical to the names in the DIE.
843 void CompileUnit::addAccelName(StringRef Name, DIE *Die) {
844   DU->getStringPoolEntry(Name);
845   std::vector<DIE *> &DIEs = AccelNames[Name];
846   DIEs.push_back(Die);
849 void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) {
850   DU->getStringPoolEntry(Name);
851   std::vector<DIE *> &DIEs = AccelObjC[Name];
852   DIEs.push_back(Die);
855 void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) {
856   DU->getStringPoolEntry(Name);
857   std::vector<DIE *> &DIEs = AccelNamespace[Name];
858   DIEs.push_back(Die);
861 void CompileUnit::addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) {
862   DU->getStringPoolEntry(Name);
863   std::vector<std::pair<DIE *, unsigned> > &DIEs = AccelTypes[Name];
864   DIEs.push_back(Die);
867 /// addGlobalName - Add a new global name to the compile unit.
868 void CompileUnit::addGlobalName(StringRef Name, DIE *Die) {
869   GlobalNames[Name] = Die;
872 /// addGlobalType - Add a new global type to the compile unit.
873 ///
874 void CompileUnit::addGlobalType(DIType Ty) {
875   DIScope Context = DD->resolve(Ty.getContext());
876   if (!Ty.getName().empty() && !Ty.isForwardDecl() &&
877       (!Context || Context.isCompileUnit() || Context.isFile() ||
878        Context.isNameSpace()))
879     if (DIEEntry *Entry = getDIEEntry(Ty))
880       GlobalTypes[Ty.getName()] = Entry->getEntry();
883 /// addPubTypes - Add subprogram argument types for pubtypes section.
884 void CompileUnit::addPubTypes(DISubprogram SP) {
885   DICompositeType SPTy = SP.getType();
886   uint16_t SPTag = SPTy.getTag();
887   if (SPTag != dwarf::DW_TAG_subroutine_type)
888     return;
890   DIArray Args = SPTy.getTypeArray();
891   for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
892     DIType ATy(Args.getElement(i));
893     if (!ATy.isType())
894       continue;
895     addGlobalType(ATy);
896   }
899 /// constructTypeDIE - Construct basic type die from DIBasicType.
900 void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
901   // Get core information.
902   StringRef Name = BTy.getName();
903   // Add name if not anonymous or intermediate type.
904   if (!Name.empty())
905     addString(&Buffer, dwarf::DW_AT_name, Name);
907   // An unspecified type only has a name attribute.
908   if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
909     return;
911   addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
912           BTy.getEncoding());
914   uint64_t Size = BTy.getSizeInBits() >> 3;
915   addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
918 /// constructTypeDIE - Construct derived type die from DIDerivedType.
919 void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
920   // Get core information.
921   StringRef Name = DTy.getName();
922   uint64_t Size = DTy.getSizeInBits() >> 3;
923   uint16_t Tag = Buffer.getTag();
925   // Map to main type, void will not have a type.
926   DIType FromTy = DTy.getTypeDerivedFrom();
927   if (FromTy)
928     addType(&Buffer, FromTy);
930   // Add name if not anonymous or intermediate type.
931   if (!Name.empty())
932     addString(&Buffer, dwarf::DW_AT_name, Name);
934   // Add size if non-zero (derived types might be zero-sized.)
935   if (Size && Tag != dwarf::DW_TAG_pointer_type)
936     addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
938   if (Tag == dwarf::DW_TAG_ptr_to_member_type)
939       addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
940                   getOrCreateTypeDIE(DD->resolve(DTy.getClassType())));
941   // Add source line info if available and TyDesc is not a forward declaration.
942   if (!DTy.isForwardDecl())
943     addSourceLine(&Buffer, DTy);
946 /// Return true if the type is appropriately scoped to be contained inside
947 /// its own type unit.
948 static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
949   DIScope Parent = DD->resolve(Ty.getContext());
950   while (Parent) {
951     // Don't generate a hash for anything scoped inside a function.
952     if (Parent.isSubprogram())
953       return false;
954     Parent = DD->resolve(Parent.getContext());
955   }
956   return true;
959 /// Return true if the type should be split out into a type unit.
960 static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
961   uint16_t Tag = CTy.getTag();
963   switch (Tag) {
964   case dwarf::DW_TAG_structure_type:
965   case dwarf::DW_TAG_union_type:
966   case dwarf::DW_TAG_enumeration_type:
967   case dwarf::DW_TAG_class_type:
968     // If this is a class, structure, union, or enumeration type
969     // that is a definition (not a declaration), and not scoped
970     // inside a function then separate this out as a type unit.
971     return !CTy.isForwardDecl() && isTypeUnitScoped(CTy, DD);
972   default:
973     return false;
974   }
977 /// constructTypeDIE - Construct type DIE from DICompositeType.
978 void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
979   // Get core information.
980   StringRef Name = CTy.getName();
982   uint64_t Size = CTy.getSizeInBits() >> 3;
983   uint16_t Tag = Buffer.getTag();
985   switch (Tag) {
986   case dwarf::DW_TAG_array_type:
987     constructArrayTypeDIE(Buffer, &CTy);
988     break;
989   case dwarf::DW_TAG_enumeration_type: {
990     DIArray Elements = CTy.getTypeArray();
992     // Add enumerators to enumeration type.
993     for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
994       DIE *ElemDie = NULL;
995       DIDescriptor Enum(Elements.getElement(i));
996       if (Enum.isEnumerator()) {
997         ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
998         Buffer.addChild(ElemDie);
999       }
1000     }
1001     DIType DTy = CTy.getTypeDerivedFrom();
1002     if (DTy) {
1003       addType(&Buffer, DTy);
1004       addFlag(&Buffer, dwarf::DW_AT_enum_class);
1005     }
1006   }
1007     break;
1008   case dwarf::DW_TAG_subroutine_type: {
1009     // Add return type. A void return won't have a type.
1010     DIArray Elements = CTy.getTypeArray();
1011     DIDescriptor RTy = Elements.getElement(0);
1012     if (RTy)
1013       addType(&Buffer, DIType(RTy));
1015     bool isPrototyped = true;
1016     // Add arguments.
1017     for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1018       DIDescriptor Ty = Elements.getElement(i);
1019       if (Ty.isUnspecifiedParameter()) {
1020         DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1021         Buffer.addChild(Arg);
1022         isPrototyped = false;
1023       } else {
1024         DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1025         addType(Arg, DIType(Ty));
1026         if (DIType(Ty).isArtificial())
1027           addFlag(Arg, dwarf::DW_AT_artificial);
1028         Buffer.addChild(Arg);
1029       }
1030     }
1031     // Add prototype flag if we're dealing with a C language and the
1032     // function has been prototyped.
1033     uint16_t Language = DICompileUnit(Node).getLanguage();
1034     if (isPrototyped &&
1035         (Language == dwarf::DW_LANG_C89 ||
1036          Language == dwarf::DW_LANG_C99 ||
1037          Language == dwarf::DW_LANG_ObjC))
1038       addFlag(&Buffer, dwarf::DW_AT_prototyped);
1039   }
1040     break;
1041   case dwarf::DW_TAG_structure_type:
1042   case dwarf::DW_TAG_union_type:
1043   case dwarf::DW_TAG_class_type: {
1044     // Add elements to structure type.
1045     DIArray Elements = CTy.getTypeArray();
1046     for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1047       DIDescriptor Element = Elements.getElement(i);
1048       DIE *ElemDie = NULL;
1049       if (Element.isSubprogram()) {
1050         DISubprogram SP(Element);
1051         ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
1052         if (SP.isProtected())
1053           addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1054                   dwarf::DW_ACCESS_protected);
1055         else if (SP.isPrivate())
1056           addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1057                   dwarf::DW_ACCESS_private);
1058         else
1059           addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1060             dwarf::DW_ACCESS_public);
1061         if (SP.isExplicit())
1062           addFlag(ElemDie, dwarf::DW_AT_explicit);
1063       } else if (Element.isDerivedType()) {
1064         DIDerivedType DDTy(Element);
1065         if (DDTy.getTag() == dwarf::DW_TAG_friend) {
1066           ElemDie = new DIE(dwarf::DW_TAG_friend);
1067           addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend);
1068         } else if (DDTy.isStaticMember())
1069           ElemDie = createStaticMemberDIE(DDTy);
1070         else
1071           ElemDie = createMemberDIE(DDTy);
1072         Buffer.addChild(ElemDie);
1073       } else if (Element.isObjCProperty()) {
1074         DIObjCProperty Property(Element);
1075         ElemDie = new DIE(Property.getTag());
1076         StringRef PropertyName = Property.getObjCPropertyName();
1077         addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
1078         addType(ElemDie, Property.getType());
1079         addSourceLine(ElemDie, Property);
1080         StringRef GetterName = Property.getObjCPropertyGetterName();
1081         if (!GetterName.empty())
1082           addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1083         StringRef SetterName = Property.getObjCPropertySetterName();
1084         if (!SetterName.empty())
1085           addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1086         unsigned PropertyAttributes = 0;
1087         if (Property.isReadOnlyObjCProperty())
1088           PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1089         if (Property.isReadWriteObjCProperty())
1090           PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1091         if (Property.isAssignObjCProperty())
1092           PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1093         if (Property.isRetainObjCProperty())
1094           PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1095         if (Property.isCopyObjCProperty())
1096           PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1097         if (Property.isNonAtomicObjCProperty())
1098           PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1099         if (PropertyAttributes)
1100           addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
1101                  PropertyAttributes);
1103         DIEEntry *Entry = getDIEEntry(Element);
1104         if (!Entry) {
1105           Entry = createDIEEntry(ElemDie);
1106           insertDIEEntry(Element, Entry);
1107         }
1108         Buffer.addChild(ElemDie);
1109       } else
1110         continue;
1111     }
1113     if (CTy.isAppleBlockExtension())
1114       addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
1116     DICompositeType ContainingType(DD->resolve(CTy.getContainingType()));
1117     if (DIDescriptor(ContainingType).isCompositeType())
1118       addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1119                   getOrCreateTypeDIE(DIType(ContainingType)));
1121     if (CTy.isObjcClassComplete())
1122       addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
1124     // Add template parameters to a class, structure or union types.
1125     // FIXME: The support isn't in the metadata for this yet.
1126     if (Tag == dwarf::DW_TAG_class_type ||
1127         Tag == dwarf::DW_TAG_structure_type ||
1128         Tag == dwarf::DW_TAG_union_type)
1129       addTemplateParams(Buffer, CTy.getTemplateParams());
1131     break;
1132   }
1133   default:
1134     break;
1135   }
1137   // Add name if not anonymous or intermediate type.
1138   if (!Name.empty())
1139     addString(&Buffer, dwarf::DW_AT_name, Name);
1141   if (Tag == dwarf::DW_TAG_enumeration_type ||
1142       Tag == dwarf::DW_TAG_class_type ||
1143       Tag == dwarf::DW_TAG_structure_type ||
1144       Tag == dwarf::DW_TAG_union_type) {
1145     // Add size if non-zero (derived types might be zero-sized.)
1146     // TODO: Do we care about size for enum forward declarations?
1147     if (Size)
1148       addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1149     else if (!CTy.isForwardDecl())
1150       // Add zero size if it is not a forward declaration.
1151       addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1153     // If we're a forward decl, say so.
1154     if (CTy.isForwardDecl())
1155       addFlag(&Buffer, dwarf::DW_AT_declaration);
1157     // Add source line info if available.
1158     if (!CTy.isForwardDecl())
1159       addSourceLine(&Buffer, CTy);
1161     // No harm in adding the runtime language to the declaration.
1162     unsigned RLang = CTy.getRunTimeLang();
1163     if (RLang)
1164       addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1165               dwarf::DW_FORM_data1, RLang);
1166   }
1167   // If this is a type applicable to a type unit it then add it to the
1168   // list of types we'll compute a hash for later.
1169   if (shouldCreateTypeUnit(CTy, DD))
1170     DD->addTypeUnitType(&Buffer);
1173 /// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
1174 /// for the given DITemplateTypeParameter.
1175 DIE *
1176 CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1177   DIE *ParamDIE = getDIE(TP);
1178   if (ParamDIE)
1179     return ParamDIE;
1181   ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
1182   // Add the type if it exists, it could be void and therefore no type.
1183   if (TP.getType())
1184     addType(ParamDIE, TP.getType());
1185   if (!TP.getName().empty())
1186     addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
1187   return ParamDIE;
1190 /// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
1191 /// for the given DITemplateValueParameter.
1192 DIE *
1193 CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter VP) {
1194   DIE *ParamDIE = getDIE(VP);
1195   if (ParamDIE)
1196     return ParamDIE;
1198   ParamDIE = new DIE(VP.getTag());
1200   // Add the type if there is one, template template and template parameter
1201   // packs will not have a type.
1202   if (VP.getType())
1203     addType(ParamDIE, VP.getType());
1204   if (!VP.getName().empty())
1205     addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1206   if (Value *Val = VP.getValue()) {
1207     if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
1208       addConstantValue(ParamDIE, CI, VP.getType().isUnsignedDIType());
1209     else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1210       // For declaration non-type template parameters (such as global values and
1211       // functions)
1212       DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1213       addOpAddress(Block, Asm->Mang->getSymbol(GV));
1214       // Emit DW_OP_stack_value to use the address as the immediate value of the
1215       // parameter, rather than a pointer to it.
1216       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1217       addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block);
1218     } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
1219       assert(isa<MDString>(Val));
1220       addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1221                 cast<MDString>(Val)->getString());
1222     } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
1223       assert(isa<MDNode>(Val));
1224       DIArray A(cast<MDNode>(Val));
1225       addTemplateParams(*ParamDIE, A);
1226     }
1227   }
1229   return ParamDIE;
1232 /// getOrCreateNameSpace - Create a DIE for DINameSpace.
1233 DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
1234   DIE *NDie = getDIE(NS);
1235   if (NDie)
1236     return NDie;
1237   NDie = new DIE(dwarf::DW_TAG_namespace);
1238   insertDIE(NS, NDie);
1239   if (!NS.getName().empty()) {
1240     addString(NDie, dwarf::DW_AT_name, NS.getName());
1241     addAccelNamespace(NS.getName(), NDie);
1242     addGlobalName(NS.getName(), NDie);
1243   } else
1244     addAccelNamespace("(anonymous namespace)", NDie);
1245   addSourceLine(NDie, NS);
1246   addToContextOwner(NDie, NS.getContext());
1247   return NDie;
1250 /// getOrCreateSubprogramDIE - Create new DIE using SP.
1251 DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
1252   // Construct the context before querying for the existence of the DIE in case
1253   // such construction creates the DIE (as is the case for member function
1254   // declarations).
1255   DIE *ContextDIE = getOrCreateContextDIE(SP.getContext());
1256   if (!ContextDIE)
1257     ContextDIE = CUDie.get();
1259   DIE *SPDie = getDIE(SP);
1260   if (SPDie)
1261     return SPDie;
1263   SPDie = new DIE(dwarf::DW_TAG_subprogram);
1265   // DW_TAG_inlined_subroutine may refer to this DIE.
1266   insertDIE(SP, SPDie);
1268   DISubprogram SPDecl = SP.getFunctionDeclaration();
1269   DIE *DeclDie = NULL;
1270   if (SPDecl.isSubprogram()) {
1271     DeclDie = getOrCreateSubprogramDIE(SPDecl);
1272   }
1274   // Add to context owner.
1275   ContextDIE->addChild(SPDie);
1277   // Add function template parameters.
1278   addTemplateParams(*SPDie, SP.getTemplateParams());
1280   // If this DIE is going to refer declaration info using AT_specification
1281   // then there is no need to add other attributes.
1282   if (DeclDie) {
1283     // Refer function declaration directly.
1284     addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1285                 DeclDie);
1287     return SPDie;
1288   }
1290   // Add the linkage name if we have one.
1291   StringRef LinkageName = SP.getLinkageName();
1292   if (!LinkageName.empty())
1293     addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
1294               GlobalValue::getRealLinkageName(LinkageName));
1296   // Constructors and operators for anonymous aggregates do not have names.
1297   if (!SP.getName().empty())
1298     addString(SPDie, dwarf::DW_AT_name, SP.getName());
1300   addSourceLine(SPDie, SP);
1302   // Add the prototype if we have a prototype and we have a C like
1303   // language.
1304   uint16_t Language = DICompileUnit(Node).getLanguage();
1305   if (SP.isPrototyped() &&
1306       (Language == dwarf::DW_LANG_C89 ||
1307        Language == dwarf::DW_LANG_C99 ||
1308        Language == dwarf::DW_LANG_ObjC))
1309     addFlag(SPDie, dwarf::DW_AT_prototyped);
1311   // Add Return Type. A void return type will not have a type.
1312   DICompositeType SPTy = SP.getType();
1313   assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1314          "the type of a subprogram should be a subroutine");
1316   DIArray Args = SPTy.getTypeArray();
1317   if (Args.getElement(0))
1318     addType(SPDie, DIType(Args.getElement(0)));
1320   unsigned VK = SP.getVirtuality();
1321   if (VK) {
1322     addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
1323     DIEBlock *Block = getDIEBlock();
1324     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1325     addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1326     addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1327     ContainingTypeMap.insert(std::make_pair(SPDie,
1328                                     DD->resolve(SP.getContainingType())));
1329   }
1331   if (!SP.isDefinition()) {
1332     addFlag(SPDie, dwarf::DW_AT_declaration);
1334     // Add arguments. Do not add arguments for subprogram definition. They will
1335     // be handled while processing variables.
1336     for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
1337       DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1338       DIType ATy = DIType(Args.getElement(i));
1339       addType(Arg, ATy);
1340       if (ATy.isArtificial())
1341         addFlag(Arg, dwarf::DW_AT_artificial);
1342       SPDie->addChild(Arg);
1343     }
1344   }
1346   if (SP.isArtificial())
1347     addFlag(SPDie, dwarf::DW_AT_artificial);
1349   if (!SP.isLocalToUnit())
1350     addFlag(SPDie, dwarf::DW_AT_external);
1352   if (SP.isOptimized())
1353     addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
1355   if (unsigned isa = Asm->getISAEncoding()) {
1356     addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1357   }
1359   return SPDie;
1362 // Return const expression if value is a GEP to access merged global
1363 // constant. e.g.
1364 // i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1365 static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1366   const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1367   if (!CE || CE->getNumOperands() != 3 ||
1368       CE->getOpcode() != Instruction::GetElementPtr)
1369     return NULL;
1371   // First operand points to a global struct.
1372   Value *Ptr = CE->getOperand(0);
1373   if (!isa<GlobalValue>(Ptr) ||
1374       !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1375     return NULL;
1377   // Second operand is zero.
1378   const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1379   if (!CI || !CI->isZero())
1380     return NULL;
1382   // Third operand is offset.
1383   if (!isa<ConstantInt>(CE->getOperand(2)))
1384     return NULL;
1386   return CE;
1389 /// createGlobalVariableDIE - create global variable DIE.
1390 void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
1391   // Check for pre-existence.
1392   if (getDIE(N))
1393     return;
1395   DIGlobalVariable GV(N);
1396   if (!GV.isGlobalVariable())
1397     return;
1399   DIScope GVContext = GV.getContext();
1400   DIType GTy = GV.getType();
1402   // If this is a static data member definition, some attributes belong
1403   // to the declaration DIE.
1404   DIE *VariableDIE = NULL;
1405   bool IsStaticMember = false;
1406   DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1407   if (SDMDecl.Verify()) {
1408     assert(SDMDecl.isStaticMember() && "Expected static member decl");
1409     // We need the declaration DIE that is in the static member's class.
1410     // But that class might not exist in the DWARF yet.
1411     // Creating the class will create the static member decl DIE.
1412     getOrCreateContextDIE(DD->resolve(SDMDecl.getContext()));
1413     VariableDIE = getDIE(SDMDecl);
1414     assert(VariableDIE && "Static member decl has no context?");
1415     IsStaticMember = true;
1416   }
1418   // If this is not a static data member definition, create the variable
1419   // DIE and add the initial set of attributes to it.
1420   if (!VariableDIE) {
1421     VariableDIE = new DIE(GV.getTag());
1422     // Add to map.
1423     insertDIE(N, VariableDIE);
1425     // Add name and type.
1426     addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1427     addType(VariableDIE, GTy);
1429     // Add scoping info.
1430     if (!GV.isLocalToUnit()) {
1431       addFlag(VariableDIE, dwarf::DW_AT_external);
1432       addGlobalName(GV.getName(), VariableDIE);
1433     }
1435     // Add line number info.
1436     addSourceLine(VariableDIE, GV);
1437     // Add to context owner.
1438     addToContextOwner(VariableDIE, GVContext);
1439   }
1441   // Add location.
1442   bool addToAccelTable = false;
1443   DIE *VariableSpecDIE = NULL;
1444   bool isGlobalVariable = GV.getGlobal() != NULL;
1445   if (isGlobalVariable) {
1446     addToAccelTable = true;
1447     DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1448     const MCSymbol *Sym = Asm->Mang->getSymbol(GV.getGlobal());
1449     if (GV.getGlobal()->isThreadLocal()) {
1450       // FIXME: Make this work with -gsplit-dwarf.
1451       unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1452       assert((PointerSize == 4 || PointerSize == 8) &&
1453              "Add support for other sizes if necessary");
1454       const MCExpr *Expr =
1455           Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
1456       // Based on GCC's support for TLS:
1457       if (!DD->useSplitDwarf()) {
1458         // 1) Start with a constNu of the appropriate pointer size
1459         addUInt(Block, 0, dwarf::DW_FORM_data1,
1460                 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
1461         // 2) containing the (relocated) address of the TLS variable
1462         addExpr(Block, 0, dwarf::DW_FORM_udata, Expr);
1463       } else {
1464         addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
1465         addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
1466       }
1467       // 3) followed by a custom OP to tell the debugger about TLS (presumably)
1468       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_lo_user);
1469     } else
1470       addOpAddress(Block, Sym);
1471     // Do not create specification DIE if context is either compile unit
1472     // or a subprogram.
1473     if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
1474         !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
1475       // Create specification DIE.
1476       VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1477       addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1478                   dwarf::DW_FORM_ref4, VariableDIE);
1479       addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1480       // A static member's declaration is already flagged as such.
1481       if (!SDMDecl.Verify())
1482         addFlag(VariableDIE, dwarf::DW_AT_declaration);
1483       addDie(VariableSpecDIE);
1484     } else {
1485       addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1486     }
1487     // Add the linkage name.
1488     StringRef LinkageName = GV.getLinkageName();
1489     if (!LinkageName.empty())
1490       // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1491       // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1492       // TAG_variable.
1493       addString(IsStaticMember && VariableSpecDIE ?
1494                 VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
1495                 GlobalValue::getRealLinkageName(LinkageName));
1496   } else if (const ConstantInt *CI =
1497              dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
1498     // AT_const_value was added when the static member was created. To avoid
1499     // emitting AT_const_value multiple times, we only add AT_const_value when
1500     // it is not a static member.
1501     if (!IsStaticMember)
1502       addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
1503   } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
1504     addToAccelTable = true;
1505     // GV is a merged global.
1506     DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1507     Value *Ptr = CE->getOperand(0);
1508     addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
1509     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1510     SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
1511     addUInt(Block, 0, dwarf::DW_FORM_udata,
1512                    Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
1513     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1514     addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1515   }
1517   if (addToAccelTable) {
1518     DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1519     addAccelName(GV.getName(), AddrDIE);
1521     // If the linkage name is different than the name, go ahead and output
1522     // that as well into the name table.
1523     if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1524       addAccelName(GV.getLinkageName(), AddrDIE);
1525   }
1528 /// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1529 void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1530                                        DIE *IndexTy) {
1531   DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1532   addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1534   // The LowerBound value defines the lower bounds which is typically zero for
1535   // C/C++. The Count value is the number of elements.  Values are 64 bit. If
1536   // Count == -1 then the array is unbounded and we do not emit
1537   // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1538   // Count == 0, then the array has zero elements in which case we do not emit
1539   // an upper bound.
1540   int64_t LowerBound = SR.getLo();
1541   int64_t DefaultLowerBound = getDefaultLowerBound();
1542   int64_t Count = SR.getCount();
1544   if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
1545     addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1547   if (Count != -1 && Count != 0)
1548     // FIXME: An unbounded array should reference the expression that defines
1549     // the array.
1550     addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
1552   Buffer.addChild(DW_Subrange);
1555 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1556 void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1557                                         DICompositeType *CTy) {
1558   if (CTy->isVector())
1559     addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
1561   // Emit the element type.
1562   addType(&Buffer, CTy->getTypeDerivedFrom());
1564   // Get an anonymous type for index type.
1565   // FIXME: This type should be passed down from the front end
1566   // as different languages may have different sizes for indexes.
1567   DIE *IdxTy = getIndexTyDie();
1568   if (!IdxTy) {
1569     // Construct an anonymous type for index type.
1570     IdxTy = new DIE(dwarf::DW_TAG_base_type);
1571     addString(IdxTy, dwarf::DW_AT_name, "int");
1572     addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1573     addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1574             dwarf::DW_ATE_signed);
1575     addDie(IdxTy);
1576     setIndexTyDie(IdxTy);
1577   }
1579   // Add subranges to array type.
1580   DIArray Elements = CTy->getTypeArray();
1581   for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1582     DIDescriptor Element = Elements.getElement(i);
1583     if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1584       constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1585   }
1588 /// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1589 DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1590   DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1591   StringRef Name = ETy.getName();
1592   addString(Enumerator, dwarf::DW_AT_name, Name);
1593   int64_t Value = ETy.getEnumValue();
1594   addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1595   return Enumerator;
1598 /// constructContainingTypeDIEs - Construct DIEs for types that contain
1599 /// vtables.
1600 void CompileUnit::constructContainingTypeDIEs() {
1601   for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1602          CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1603     DIE *SPDie = CI->first;
1604     const MDNode *N = CI->second;
1605     if (!N) continue;
1606     DIE *NDie = getDIE(N);
1607     if (!NDie) continue;
1608     addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1609   }
1612 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
1613 DIE *CompileUnit::constructVariableDIE(DbgVariable *DV,
1614                                        bool isScopeAbstract) {
1615   StringRef Name = DV->getName();
1617   // Define variable debug information entry.
1618   DIE *VariableDie = new DIE(DV->getTag());
1619   DbgVariable *AbsVar = DV->getAbstractVariable();
1620   DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
1621   if (AbsDIE)
1622     addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1623                             dwarf::DW_FORM_ref4, AbsDIE);
1624   else {
1625     if (!Name.empty())
1626       addString(VariableDie, dwarf::DW_AT_name, Name);
1627     addSourceLine(VariableDie, DV->getVariable());
1628     addType(VariableDie, DV->getType());
1629   }
1631   if (DV->isArtificial())
1632     addFlag(VariableDie, dwarf::DW_AT_artificial);
1634   if (isScopeAbstract) {
1635     DV->setDIE(VariableDie);
1636     return VariableDie;
1637   }
1639   // Add variable address.
1641   unsigned Offset = DV->getDotDebugLocOffset();
1642   if (Offset != ~0U) {
1643     addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1644              Asm->GetTempSymbol("debug_loc", Offset));
1645     DV->setDIE(VariableDie);
1646     return VariableDie;
1647   }
1649   // Check if variable is described by a DBG_VALUE instruction.
1650   if (const MachineInstr *DVInsn = DV->getMInsn()) {
1651     assert(DVInsn->getNumOperands() == 3);
1652     if (DVInsn->getOperand(0).isReg()) {
1653       const MachineOperand RegOp = DVInsn->getOperand(0);
1654       // If the second operand is an immediate, this is an indirect value.
1655       if (DVInsn->getOperand(1).isImm()) {
1656         MachineLocation Location(RegOp.getReg(), DVInsn->getOperand(1).getImm());
1657         addVariableAddress(*DV, VariableDie, Location);
1658       } else if (RegOp.getReg())
1659         addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
1660     } else if (DVInsn->getOperand(0).isImm())
1661       addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
1662     else if (DVInsn->getOperand(0).isFPImm())
1663       addConstantFPValue(VariableDie, DVInsn->getOperand(0));
1664     else if (DVInsn->getOperand(0).isCImm())
1665       addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
1666                        DV->getType().isUnsignedDIType());
1668     DV->setDIE(VariableDie);
1669     return VariableDie;
1670   } else {
1671     // .. else use frame index.
1672     int FI = DV->getFrameIndex();
1673     if (FI != ~0) {
1674       unsigned FrameReg = 0;
1675       const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
1676       int Offset =
1677         TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1678       MachineLocation Location(FrameReg, Offset);
1679       addVariableAddress(*DV, VariableDie, Location);
1680     }
1681   }
1683   DV->setDIE(VariableDie);
1684   return VariableDie;
1687 /// createMemberDIE - Create new member DIE.
1688 DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1689   DIE *MemberDie = new DIE(DT.getTag());
1690   StringRef Name = DT.getName();
1691   if (!Name.empty())
1692     addString(MemberDie, dwarf::DW_AT_name, Name);
1694   addType(MemberDie, DT.getTypeDerivedFrom());
1696   addSourceLine(MemberDie, DT);
1698   DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1699   addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1701   uint64_t Size = DT.getSizeInBits();
1702   uint64_t FieldSize = DT.getOriginalTypeSize();
1704   if (Size != FieldSize) {
1705     // Handle bitfield.
1706     addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1707     addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1709     uint64_t Offset = DT.getOffsetInBits();
1710     uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1711     uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1712     uint64_t FieldOffset = (HiMark - FieldSize);
1713     Offset -= FieldOffset;
1715     // Maybe we need to work from the other end.
1716     if (Asm->getDataLayout().isLittleEndian())
1717       Offset = FieldSize - (Offset + Size);
1718     addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1720     // Here WD_AT_data_member_location points to the anonymous
1721     // field that includes this bit field.
1722     addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1724   } else
1725     // This is not a bitfield.
1726     addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1728   if (DT.getTag() == dwarf::DW_TAG_inheritance
1729       && DT.isVirtual()) {
1731     // For C++, virtual base classes are not at fixed offset. Use following
1732     // expression to extract appropriate offset from vtable.
1733     // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1735     DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1736     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1737     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1738     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1739     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1740     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1741     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1742     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1744     addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1745              VBaseLocationDie);
1746   } else
1747     addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1749   if (DT.isProtected())
1750     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1751             dwarf::DW_ACCESS_protected);
1752   else if (DT.isPrivate())
1753     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1754             dwarf::DW_ACCESS_private);
1755   // Otherwise C++ member and base classes are considered public.
1756   else
1757     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1758             dwarf::DW_ACCESS_public);
1759   if (DT.isVirtual())
1760     addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
1761             dwarf::DW_VIRTUALITY_virtual);
1763   // Objective-C properties.
1764   if (MDNode *PNode = DT.getObjCProperty())
1765     if (DIEEntry *PropertyDie = getDIEEntry(PNode))
1766       MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
1767                           PropertyDie);
1769   if (DT.isArtificial())
1770     addFlag(MemberDie, dwarf::DW_AT_artificial);
1772   return MemberDie;
1775 /// createStaticMemberDIE - Create new DIE for C++ static member.
1776 DIE *CompileUnit::createStaticMemberDIE(const DIDerivedType DT) {
1777   if (!DT.Verify())
1778     return NULL;
1780   DIE *StaticMemberDIE = new DIE(DT.getTag());
1781   DIType Ty = DT.getTypeDerivedFrom();
1783   addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1784   addType(StaticMemberDIE, Ty);
1785   addSourceLine(StaticMemberDIE, DT);
1786   addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1787   addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1789   // FIXME: We could omit private if the parent is a class_type, and
1790   // public if the parent is something else.
1791   if (DT.isProtected())
1792     addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1793             dwarf::DW_ACCESS_protected);
1794   else if (DT.isPrivate())
1795     addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1796             dwarf::DW_ACCESS_private);
1797   else
1798     addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1799             dwarf::DW_ACCESS_public);
1801   if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
1802     addConstantValue(StaticMemberDIE, CI, Ty.isUnsignedDIType());
1803   if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1804     addConstantFPValue(StaticMemberDIE, CFP);
1806   insertDIE(DT, StaticMemberDIE);
1807   return StaticMemberDIE;