Home | History | Annotate | Download | only in AsmPrinter
      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 writing dwarf compile unit.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #define DEBUG_TYPE "dwarfdebug"
     15 
     16 #include "DwarfCompileUnit.h"
     17 #include "DwarfDebug.h"
     18 #include "llvm/Constants.h"
     19 #include "llvm/Analysis/DIBuilder.h"
     20 #include "llvm/Target/TargetData.h"
     21 #include "llvm/Target/TargetFrameLowering.h"
     22 #include "llvm/Target/TargetMachine.h"
     23 #include "llvm/Target/TargetRegisterInfo.h"
     24 #include "llvm/ADT/APFloat.h"
     25 #include "llvm/Support/ErrorHandling.h"
     26 
     27 using namespace llvm;
     28 
     29 /// CompileUnit - Compile unit constructor.
     30 CompileUnit::CompileUnit(unsigned I, DIE *D, AsmPrinter *A, DwarfDebug *DW)
     31   : ID(I), CUDie(D), Asm(A), DD(DW), IndexTyDie(0) {
     32   DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
     33 }
     34 
     35 /// ~CompileUnit - Destructor for compile unit.
     36 CompileUnit::~CompileUnit() {
     37   for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
     38     DIEBlocks[j]->~DIEBlock();
     39 }
     40 
     41 /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
     42 /// information entry.
     43 DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
     44   DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
     45   return Value;
     46 }
     47 
     48 /// addUInt - Add an unsigned integer attribute data and value.
     49 ///
     50 void CompileUnit::addUInt(DIE *Die, unsigned Attribute,
     51                           unsigned Form, uint64_t Integer) {
     52   if (!Form) Form = DIEInteger::BestForm(false, Integer);
     53   DIEValue *Value = Integer == 1 ?
     54     DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
     55   Die->addValue(Attribute, Form, Value);
     56 }
     57 
     58 /// addSInt - Add an signed integer attribute data and value.
     59 ///
     60 void CompileUnit::addSInt(DIE *Die, unsigned Attribute,
     61                           unsigned Form, int64_t Integer) {
     62   if (!Form) Form = DIEInteger::BestForm(true, Integer);
     63   DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
     64   Die->addValue(Attribute, Form, Value);
     65 }
     66 
     67 /// addString - Add a string attribute data and value. DIEString only
     68 /// keeps string reference.
     69 void CompileUnit::addString(DIE *Die, unsigned Attribute, unsigned Form,
     70                             StringRef String) {
     71   DIEValue *Value = new (DIEValueAllocator) DIEString(String);
     72   Die->addValue(Attribute, Form, Value);
     73 }
     74 
     75 /// addLabel - Add a Dwarf label attribute data and value.
     76 ///
     77 void CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
     78                            const MCSymbol *Label) {
     79   DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
     80   Die->addValue(Attribute, Form, Value);
     81 }
     82 
     83 /// addDelta - Add a label delta attribute data and value.
     84 ///
     85 void CompileUnit::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
     86                            const MCSymbol *Hi, const MCSymbol *Lo) {
     87   DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
     88   Die->addValue(Attribute, Form, Value);
     89 }
     90 
     91 /// addDIEEntry - Add a DIE attribute data and value.
     92 ///
     93 void CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
     94                               DIE *Entry) {
     95   Die->addValue(Attribute, Form, createDIEEntry(Entry));
     96 }
     97 
     98 
     99 /// addBlock - Add block data.
    100 ///
    101 void CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
    102                            DIEBlock *Block) {
    103   Block->ComputeSize(Asm);
    104   DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
    105   Die->addValue(Attribute, Block->BestForm(), Block);
    106 }
    107 
    108 /// addSourceLine - Add location information to specified debug information
    109 /// entry.
    110 void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
    111   // Verify variable.
    112   if (!V.Verify())
    113     return;
    114 
    115   unsigned Line = V.getLineNumber();
    116   if (Line == 0)
    117     return;
    118   unsigned FileID = DD->GetOrCreateSourceID(V.getContext().getFilename(),
    119                                             V.getContext().getDirectory());
    120   assert(FileID && "Invalid file id");
    121   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
    122   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
    123 }
    124 
    125 /// addSourceLine - Add location information to specified debug information
    126 /// entry.
    127 void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
    128   // Verify global variable.
    129   if (!G.Verify())
    130     return;
    131 
    132   unsigned Line = G.getLineNumber();
    133   if (Line == 0)
    134     return;
    135   unsigned FileID = DD->GetOrCreateSourceID(G.getContext().getFilename(),
    136                                             G.getContext().getDirectory());
    137   assert(FileID && "Invalid file id");
    138   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
    139   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
    140 }
    141 
    142 /// addSourceLine - Add location information to specified debug information
    143 /// entry.
    144 void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
    145   // Verify subprogram.
    146   if (!SP.Verify())
    147     return;
    148   // If the line number is 0, don't add it.
    149   if (SP.getLineNumber() == 0)
    150     return;
    151 
    152   unsigned Line = SP.getLineNumber();
    153   if (!SP.getContext().Verify())
    154     return;
    155   unsigned FileID = DD->GetOrCreateSourceID(SP.getFilename(), SP.getDirectory());
    156   assert(FileID && "Invalid file id");
    157   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
    158   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
    159 }
    160 
    161 /// addSourceLine - Add location information to specified debug information
    162 /// entry.
    163 void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
    164   // Verify type.
    165   if (!Ty.Verify())
    166     return;
    167 
    168   unsigned Line = Ty.getLineNumber();
    169   if (Line == 0 || !Ty.getContext().Verify())
    170     return;
    171   unsigned FileID = DD->GetOrCreateSourceID(Ty.getFilename(), Ty.getDirectory());
    172   assert(FileID && "Invalid file id");
    173   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
    174   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
    175 }
    176 
    177 /// addSourceLine - Add location information to specified debug information
    178 /// entry.
    179 void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
    180   // Verify namespace.
    181   if (!NS.Verify())
    182     return;
    183 
    184   unsigned Line = NS.getLineNumber();
    185   if (Line == 0)
    186     return;
    187   StringRef FN = NS.getFilename();
    188 
    189   unsigned FileID = DD->GetOrCreateSourceID(FN, NS.getDirectory());
    190   assert(FileID && "Invalid file id");
    191   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
    192   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
    193 }
    194 
    195 /// addVariableAddress - Add DW_AT_location attribute for a
    196 /// DbgVariable based on provided MachineLocation.
    197 void CompileUnit::addVariableAddress(DbgVariable *&DV, DIE *Die,
    198                                      MachineLocation Location) {
    199   if (DV->variableHasComplexAddress())
    200     addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
    201   else if (DV->isBlockByrefVariable())
    202     addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
    203   else
    204     addAddress(Die, dwarf::DW_AT_location, Location);
    205 }
    206 
    207 /// addRegisterOp - Add register operand.
    208 void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
    209   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
    210   unsigned DWReg = RI->getDwarfRegNum(Reg, false);
    211   if (DWReg < 32)
    212     addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
    213   else {
    214     addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
    215     addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
    216   }
    217 }
    218 
    219 /// addRegisterOffset - Add register offset.
    220 void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
    221                                     int64_t Offset) {
    222   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
    223   unsigned DWReg = RI->getDwarfRegNum(Reg, false);
    224   const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
    225   if (Reg == TRI->getFrameRegister(*Asm->MF))
    226     // If variable offset is based in frame register then use fbreg.
    227     addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
    228   else if (DWReg < 32)
    229     addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
    230   else {
    231     addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
    232     addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
    233   }
    234   addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
    235 }
    236 
    237 /// addAddress - Add an address attribute to a die based on the location
    238 /// provided.
    239 void CompileUnit::addAddress(DIE *Die, unsigned Attribute,
    240                              const MachineLocation &Location) {
    241   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
    242 
    243   if (Location.isReg())
    244     addRegisterOp(Block, Location.getReg());
    245   else
    246     addRegisterOffset(Block, Location.getReg(), Location.getOffset());
    247 
    248   // Now attach the location information to the DIE.
    249   addBlock(Die, Attribute, 0, Block);
    250 }
    251 
    252 /// addComplexAddress - Start with the address based on the location provided,
    253 /// and generate the DWARF information necessary to find the actual variable
    254 /// given the extra address information encoded in the DIVariable, starting from
    255 /// the starting location.  Add the DWARF information to the die.
    256 ///
    257 void CompileUnit::addComplexAddress(DbgVariable *&DV, DIE *Die,
    258                                     unsigned Attribute,
    259                                     const MachineLocation &Location) {
    260   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
    261   unsigned N = DV->getNumAddrElements();
    262   unsigned i = 0;
    263   if (Location.isReg()) {
    264     if (N >= 2 && DV->getAddrElement(0) == DIBuilder::OpPlus) {
    265       // If first address element is OpPlus then emit
    266       // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
    267       addRegisterOffset(Block, Location.getReg(), DV->getAddrElement(1));
    268       i = 2;
    269     } else
    270       addRegisterOp(Block, Location.getReg());
    271   }
    272   else
    273     addRegisterOffset(Block, Location.getReg(), Location.getOffset());
    274 
    275   for (;i < N; ++i) {
    276     uint64_t Element = DV->getAddrElement(i);
    277     if (Element == DIBuilder::OpPlus) {
    278       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
    279       addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
    280     } else if (Element == DIBuilder::OpDeref) {
    281       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
    282     } else llvm_unreachable("unknown DIBuilder Opcode");
    283   }
    284 
    285   // Now attach the location information to the DIE.
    286   addBlock(Die, Attribute, 0, Block);
    287 }
    288 
    289 /* Byref variables, in Blocks, are declared by the programmer as "SomeType
    290    VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
    291    gives the variable VarName either the struct, or a pointer to the struct, as
    292    its type.  This is necessary for various behind-the-scenes things the
    293    compiler needs to do with by-reference variables in Blocks.
    294 
    295    However, as far as the original *programmer* is concerned, the variable
    296    should still have type 'SomeType', as originally declared.
    297 
    298    The function getBlockByrefType dives into the __Block_byref_x_VarName
    299    struct to find the original type of the variable, which is then assigned to
    300    the variable's Debug Information Entry as its real type.  So far, so good.
    301    However now the debugger will expect the variable VarName to have the type
    302    SomeType.  So we need the location attribute for the variable to be an
    303    expression that explains to the debugger how to navigate through the
    304    pointers and struct to find the actual variable of type SomeType.
    305 
    306    The following function does just that.  We start by getting
    307    the "normal" location for the variable. This will be the location
    308    of either the struct __Block_byref_x_VarName or the pointer to the
    309    struct __Block_byref_x_VarName.
    310 
    311    The struct will look something like:
    312 
    313    struct __Block_byref_x_VarName {
    314      ... <various fields>
    315      struct __Block_byref_x_VarName *forwarding;
    316      ... <various other fields>
    317      SomeType VarName;
    318      ... <maybe more fields>
    319    };
    320 
    321    If we are given the struct directly (as our starting point) we
    322    need to tell the debugger to:
    323 
    324    1).  Add the offset of the forwarding field.
    325 
    326    2).  Follow that pointer to get the real __Block_byref_x_VarName
    327    struct to use (the real one may have been copied onto the heap).
    328 
    329    3).  Add the offset for the field VarName, to find the actual variable.
    330 
    331    If we started with a pointer to the struct, then we need to
    332    dereference that pointer first, before the other steps.
    333    Translating this into DWARF ops, we will need to append the following
    334    to the current location description for the variable:
    335 
    336    DW_OP_deref                    -- optional, if we start with a pointer
    337    DW_OP_plus_uconst <forward_fld_offset>
    338    DW_OP_deref
    339    DW_OP_plus_uconst <varName_fld_offset>
    340 
    341    That is what this function does.  */
    342 
    343 /// addBlockByrefAddress - Start with the address based on the location
    344 /// provided, and generate the DWARF information necessary to find the
    345 /// actual Block variable (navigating the Block struct) based on the
    346 /// starting location.  Add the DWARF information to the die.  For
    347 /// more information, read large comment just above here.
    348 ///
    349 void CompileUnit::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
    350                                        unsigned Attribute,
    351                                        const MachineLocation &Location) {
    352   DIType Ty = DV->getType();
    353   DIType TmpTy = Ty;
    354   unsigned Tag = Ty.getTag();
    355   bool isPointer = false;
    356 
    357   StringRef varName = DV->getName();
    358 
    359   if (Tag == dwarf::DW_TAG_pointer_type) {
    360     DIDerivedType DTy = DIDerivedType(Ty);
    361     TmpTy = DTy.getTypeDerivedFrom();
    362     isPointer = true;
    363   }
    364 
    365   DICompositeType blockStruct = DICompositeType(TmpTy);
    366 
    367   // Find the __forwarding field and the variable field in the __Block_byref
    368   // struct.
    369   DIArray Fields = blockStruct.getTypeArray();
    370   DIDescriptor varField = DIDescriptor();
    371   DIDescriptor forwardingField = DIDescriptor();
    372 
    373   for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
    374     DIDescriptor Element = Fields.getElement(i);
    375     DIDerivedType DT = DIDerivedType(Element);
    376     StringRef fieldName = DT.getName();
    377     if (fieldName == "__forwarding")
    378       forwardingField = Element;
    379     else if (fieldName == varName)
    380       varField = Element;
    381   }
    382 
    383   // Get the offsets for the forwarding field and the variable field.
    384   unsigned forwardingFieldOffset =
    385     DIDerivedType(forwardingField).getOffsetInBits() >> 3;
    386   unsigned varFieldOffset =
    387     DIDerivedType(varField).getOffsetInBits() >> 3;
    388 
    389   // Decode the original location, and use that as the start of the byref
    390   // variable's location.
    391   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
    392   unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
    393   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
    394 
    395   if (Location.isReg()) {
    396     if (Reg < 32)
    397       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
    398     else {
    399       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
    400       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
    401     }
    402   } else {
    403     if (Reg < 32)
    404       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
    405     else {
    406       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
    407       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
    408     }
    409 
    410     addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
    411   }
    412 
    413   // If we started with a pointer to the __Block_byref... struct, then
    414   // the first thing we need to do is dereference the pointer (DW_OP_deref).
    415   if (isPointer)
    416     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
    417 
    418   // Next add the offset for the '__forwarding' field:
    419   // DW_OP_plus_uconst ForwardingFieldOffset.  Note there's no point in
    420   // adding the offset if it's 0.
    421   if (forwardingFieldOffset > 0) {
    422     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
    423     addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
    424   }
    425 
    426   // Now dereference the __forwarding field to get to the real __Block_byref
    427   // struct:  DW_OP_deref.
    428   addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
    429 
    430   // Now that we've got the real __Block_byref... struct, add the offset
    431   // for the variable's field to get to the location of the actual variable:
    432   // DW_OP_plus_uconst varFieldOffset.  Again, don't add if it's 0.
    433   if (varFieldOffset > 0) {
    434     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
    435     addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
    436   }
    437 
    438   // Now attach the location information to the DIE.
    439   addBlock(Die, Attribute, 0, Block);
    440 }
    441 
    442 /// addConstantValue - Add constant value entry in variable DIE.
    443 bool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
    444                                    DIType Ty) {
    445   assert (MO.isImm() && "Invalid machine operand!");
    446   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
    447   unsigned form = dwarf::DW_FORM_udata;
    448   switch (Ty.getSizeInBits()) {
    449     case 8: form = dwarf::DW_FORM_data1; break;
    450     case 16: form = dwarf::DW_FORM_data2; break;
    451     case 32: form = dwarf::DW_FORM_data4; break;
    452     case 64: form = dwarf::DW_FORM_data8; break;
    453     default: break;
    454   }
    455 
    456   DIBasicType BTy(Ty);
    457   if (BTy.Verify() &&
    458       (BTy.getEncoding()  == dwarf::DW_ATE_signed
    459        || BTy.getEncoding() == dwarf::DW_ATE_signed_char))
    460     addSInt(Block, 0, form, MO.getImm());
    461   else
    462     addUInt(Block, 0, form, MO.getImm());
    463 
    464   addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
    465   return true;
    466 }
    467 
    468 /// addConstantFPValue - Add constant value entry in variable DIE.
    469 bool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
    470   assert (MO.isFPImm() && "Invalid machine operand!");
    471   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
    472   APFloat FPImm = MO.getFPImm()->getValueAPF();
    473 
    474   // Get the raw data form of the floating point.
    475   const APInt FltVal = FPImm.bitcastToAPInt();
    476   const char *FltPtr = (const char*)FltVal.getRawData();
    477 
    478   int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
    479   bool LittleEndian = Asm->getTargetData().isLittleEndian();
    480   int Incr = (LittleEndian ? 1 : -1);
    481   int Start = (LittleEndian ? 0 : NumBytes - 1);
    482   int Stop = (LittleEndian ? NumBytes : -1);
    483 
    484   // Output the constant to DWARF one byte at a time.
    485   for (; Start != Stop; Start += Incr)
    486     addUInt(Block, 0, dwarf::DW_FORM_data1,
    487             (unsigned char)0xFF & FltPtr[Start]);
    488 
    489   addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
    490   return true;
    491 }
    492 
    493 /// addConstantValue - Add constant value entry in variable DIE.
    494 bool CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
    495                                    bool Unsigned) {
    496   unsigned CIBitWidth = CI->getBitWidth();
    497   if (CIBitWidth <= 64) {
    498     unsigned form = 0;
    499     switch (CIBitWidth) {
    500     case 8: form = dwarf::DW_FORM_data1; break;
    501     case 16: form = dwarf::DW_FORM_data2; break;
    502     case 32: form = dwarf::DW_FORM_data4; break;
    503     case 64: form = dwarf::DW_FORM_data8; break;
    504     default:
    505       form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata;
    506     }
    507     if (Unsigned)
    508       addUInt(Die, dwarf::DW_AT_const_value, form, CI->getZExtValue());
    509     else
    510       addSInt(Die, dwarf::DW_AT_const_value, form, CI->getSExtValue());
    511     return true;
    512   }
    513 
    514   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
    515 
    516   // Get the raw data form of the large APInt.
    517   const APInt Val = CI->getValue();
    518   const char *Ptr = (const char*)Val.getRawData();
    519 
    520   int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
    521   bool LittleEndian = Asm->getTargetData().isLittleEndian();
    522   int Incr = (LittleEndian ? 1 : -1);
    523   int Start = (LittleEndian ? 0 : NumBytes - 1);
    524   int Stop = (LittleEndian ? NumBytes : -1);
    525 
    526   // Output the constant to DWARF one byte at a time.
    527   for (; Start != Stop; Start += Incr)
    528     addUInt(Block, 0, dwarf::DW_FORM_data1,
    529             (unsigned char)0xFF & Ptr[Start]);
    530 
    531   addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
    532   return true;
    533 }
    534 
    535 /// addTemplateParams - Add template parameters in buffer.
    536 void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
    537   // Add template parameters.
    538   for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
    539     DIDescriptor Element = TParams.getElement(i);
    540     if (Element.isTemplateTypeParameter())
    541       Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
    542                         DITemplateTypeParameter(Element)));
    543     else if (Element.isTemplateValueParameter())
    544       Buffer.addChild(getOrCreateTemplateValueParameterDIE(
    545                         DITemplateValueParameter(Element)));
    546   }
    547 
    548 }
    549 /// addToContextOwner - Add Die into the list of its context owner's children.
    550 void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
    551   if (Context.isType()) {
    552     DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
    553     ContextDIE->addChild(Die);
    554   } else if (Context.isNameSpace()) {
    555     DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
    556     ContextDIE->addChild(Die);
    557   } else if (Context.isSubprogram()) {
    558     DIE *ContextDIE = DD->createSubprogramDIE(DISubprogram(Context));
    559     ContextDIE->addChild(Die);
    560   } else if (DIE *ContextDIE = getDIE(Context))
    561     ContextDIE->addChild(Die);
    562   else
    563     addDie(Die);
    564 }
    565 
    566 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
    567 /// given DIType.
    568 DIE *CompileUnit::getOrCreateTypeDIE(DIType Ty) {
    569   DIE *TyDIE = getDIE(Ty);
    570   if (TyDIE)
    571     return TyDIE;
    572 
    573   // Create new type.
    574   TyDIE = new DIE(dwarf::DW_TAG_base_type);
    575   insertDIE(Ty, TyDIE);
    576   if (Ty.isBasicType())
    577     constructTypeDIE(*TyDIE, DIBasicType(Ty));
    578   else if (Ty.isCompositeType())
    579     constructTypeDIE(*TyDIE, DICompositeType(Ty));
    580   else {
    581     assert(Ty.isDerivedType() && "Unknown kind of DIType");
    582     constructTypeDIE(*TyDIE, DIDerivedType(Ty));
    583   }
    584 
    585   addToContextOwner(TyDIE, Ty.getContext());
    586   return TyDIE;
    587 }
    588 
    589 /// addType - Add a new type attribute to the specified entity.
    590 void CompileUnit::addType(DIE *Entity, DIType Ty) {
    591   if (!Ty.Verify())
    592     return;
    593 
    594   // Check for pre-existence.
    595   DIEEntry *Entry = getDIEEntry(Ty);
    596   // If it exists then use the existing value.
    597   if (Entry) {
    598     Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
    599     return;
    600   }
    601 
    602   // Construct type.
    603   DIE *Buffer = getOrCreateTypeDIE(Ty);
    604 
    605   // Set up proxy.
    606   Entry = createDIEEntry(Buffer);
    607   insertDIEEntry(Ty, Entry);
    608   Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
    609 
    610   // If this is a complete composite type then include it in the
    611   // list of global types.
    612   addGlobalType(Ty);
    613 }
    614 
    615 /// addGlobalType - Add a new global type to the compile unit.
    616 ///
    617 void CompileUnit::addGlobalType(DIType Ty) {
    618   DIDescriptor Context = Ty.getContext();
    619   if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
    620       && (Context.isCompileUnit() || Context.isFile() || Context.isNameSpace()))
    621     if (DIEEntry *Entry = getDIEEntry(Ty))
    622       GlobalTypes[Ty.getName()] = Entry->getEntry();
    623 }
    624 
    625 /// addPubTypes - Add type for pubtypes section.
    626 void CompileUnit::addPubTypes(DISubprogram SP) {
    627   DICompositeType SPTy = SP.getType();
    628   unsigned SPTag = SPTy.getTag();
    629   if (SPTag != dwarf::DW_TAG_subroutine_type)
    630     return;
    631 
    632   DIArray Args = SPTy.getTypeArray();
    633   for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
    634     DIType ATy(Args.getElement(i));
    635     if (!ATy.Verify())
    636       continue;
    637     addGlobalType(ATy);
    638   }
    639 }
    640 
    641 /// constructTypeDIE - Construct basic type die from DIBasicType.
    642 void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
    643   // Get core information.
    644   StringRef Name = BTy.getName();
    645   Buffer.setTag(dwarf::DW_TAG_base_type);
    646   addUInt(&Buffer, dwarf::DW_AT_encoding,  dwarf::DW_FORM_data1,
    647           BTy.getEncoding());
    648 
    649   // Add name if not anonymous or intermediate type.
    650   if (!Name.empty())
    651     addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
    652   uint64_t Size = BTy.getSizeInBits() >> 3;
    653   addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
    654 }
    655 
    656 /// constructTypeDIE - Construct derived type die from DIDerivedType.
    657 void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
    658   // Get core information.
    659   StringRef Name = DTy.getName();
    660   uint64_t Size = DTy.getSizeInBits() >> 3;
    661   unsigned Tag = DTy.getTag();
    662 
    663   // FIXME - Workaround for templates.
    664   if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
    665 
    666   Buffer.setTag(Tag);
    667 
    668   // Map to main type, void will not have a type.
    669   DIType FromTy = DTy.getTypeDerivedFrom();
    670   addType(&Buffer, FromTy);
    671 
    672   // Add name if not anonymous or intermediate type.
    673   if (!Name.empty())
    674     addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
    675 
    676   // Add size if non-zero (derived types might be zero-sized.)
    677   if (Size)
    678     addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
    679 
    680   // Add source line info if available and TyDesc is not a forward declaration.
    681   if (!DTy.isForwardDecl())
    682     addSourceLine(&Buffer, DTy);
    683 }
    684 
    685 /// constructTypeDIE - Construct type DIE from DICompositeType.
    686 void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
    687   // Get core information.
    688   StringRef Name = CTy.getName();
    689 
    690   uint64_t Size = CTy.getSizeInBits() >> 3;
    691   unsigned Tag = CTy.getTag();
    692   Buffer.setTag(Tag);
    693 
    694   switch (Tag) {
    695   case dwarf::DW_TAG_vector_type:
    696   case dwarf::DW_TAG_array_type:
    697     constructArrayTypeDIE(Buffer, &CTy);
    698     break;
    699   case dwarf::DW_TAG_enumeration_type: {
    700     DIArray Elements = CTy.getTypeArray();
    701 
    702     // Add enumerators to enumeration type.
    703     for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
    704       DIE *ElemDie = NULL;
    705       DIDescriptor Enum(Elements.getElement(i));
    706       if (Enum.isEnumerator()) {
    707         ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
    708         Buffer.addChild(ElemDie);
    709       }
    710     }
    711   }
    712     break;
    713   case dwarf::DW_TAG_subroutine_type: {
    714     // Add return type.
    715     DIArray Elements = CTy.getTypeArray();
    716     DIDescriptor RTy = Elements.getElement(0);
    717     addType(&Buffer, DIType(RTy));
    718 
    719     bool isPrototyped = true;
    720     // Add arguments.
    721     for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
    722       DIDescriptor Ty = Elements.getElement(i);
    723       if (Ty.isUnspecifiedParameter()) {
    724         DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
    725         Buffer.addChild(Arg);
    726         isPrototyped = false;
    727       } else {
    728         DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
    729         addType(Arg, DIType(Ty));
    730         Buffer.addChild(Arg);
    731       }
    732     }
    733     // Add prototype flag.
    734     if (isPrototyped)
    735       addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
    736   }
    737     break;
    738   case dwarf::DW_TAG_structure_type:
    739   case dwarf::DW_TAG_union_type:
    740   case dwarf::DW_TAG_class_type: {
    741     // Add elements to structure type.
    742     DIArray Elements = CTy.getTypeArray();
    743 
    744     // A forward struct declared type may not have elements available.
    745     unsigned N = Elements.getNumElements();
    746     if (N == 0)
    747       break;
    748 
    749     // Add elements to structure type.
    750     for (unsigned i = 0; i < N; ++i) {
    751       DIDescriptor Element = Elements.getElement(i);
    752       DIE *ElemDie = NULL;
    753       if (Element.isSubprogram()) {
    754         DISubprogram SP(Element);
    755         ElemDie = DD->createSubprogramDIE(DISubprogram(Element));
    756         if (SP.isProtected())
    757           addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
    758                   dwarf::DW_ACCESS_protected);
    759         else if (SP.isPrivate())
    760           addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
    761                   dwarf::DW_ACCESS_private);
    762         else
    763           addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
    764             dwarf::DW_ACCESS_public);
    765         if (SP.isExplicit())
    766           addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
    767       }
    768       else if (Element.isVariable()) {
    769         DIVariable DV(Element);
    770         ElemDie = new DIE(dwarf::DW_TAG_variable);
    771         addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
    772                   DV.getName());
    773         addType(ElemDie, DV.getType());
    774         addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
    775         addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
    776         addSourceLine(ElemDie, DV);
    777       } else if (Element.isDerivedType())
    778         ElemDie = createMemberDIE(DIDerivedType(Element));
    779       else
    780         continue;
    781       Buffer.addChild(ElemDie);
    782     }
    783 
    784     if (CTy.isAppleBlockExtension())
    785       addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
    786 
    787     unsigned RLang = CTy.getRunTimeLang();
    788     if (RLang)
    789       addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
    790               dwarf::DW_FORM_data1, RLang);
    791 
    792     DICompositeType ContainingType = CTy.getContainingType();
    793     if (DIDescriptor(ContainingType).isCompositeType())
    794       addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
    795                   getOrCreateTypeDIE(DIType(ContainingType)));
    796     else {
    797       DIDescriptor Context = CTy.getContext();
    798       addToContextOwner(&Buffer, Context);
    799     }
    800 
    801     if (CTy.isObjcClassComplete())
    802       addUInt(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type,
    803               dwarf::DW_FORM_flag, 1);
    804 
    805     if (Tag == dwarf::DW_TAG_class_type)
    806       addTemplateParams(Buffer, CTy.getTemplateParams());
    807 
    808     break;
    809   }
    810   default:
    811     break;
    812   }
    813 
    814   // Add name if not anonymous or intermediate type.
    815   if (!Name.empty())
    816     addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
    817 
    818   if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
    819       || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
    820     {
    821     // Add size if non-zero (derived types might be zero-sized.)
    822     if (Size)
    823       addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
    824     else {
    825       // Add zero size if it is not a forward declaration.
    826       if (CTy.isForwardDecl())
    827         addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
    828       else
    829         addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
    830     }
    831 
    832     // Add source line info if available.
    833     if (!CTy.isForwardDecl())
    834       addSourceLine(&Buffer, CTy);
    835   }
    836 }
    837 
    838 /// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
    839 /// for the given DITemplateTypeParameter.
    840 DIE *
    841 CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
    842   DIE *ParamDIE = getDIE(TP);
    843   if (ParamDIE)
    844     return ParamDIE;
    845 
    846   ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
    847   addType(ParamDIE, TP.getType());
    848   addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TP.getName());
    849   return ParamDIE;
    850 }
    851 
    852 /// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
    853 /// for the given DITemplateValueParameter.
    854 DIE *
    855 CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) {
    856   DIE *ParamDIE = getDIE(TPV);
    857   if (ParamDIE)
    858     return ParamDIE;
    859 
    860   ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
    861   addType(ParamDIE, TPV.getType());
    862   if (!TPV.getName().empty())
    863     addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TPV.getName());
    864   addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
    865           TPV.getValue());
    866   return ParamDIE;
    867 }
    868 
    869 /// getOrCreateNameSpace - Create a DIE for DINameSpace.
    870 DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
    871   DIE *NDie = getDIE(NS);
    872   if (NDie)
    873     return NDie;
    874   NDie = new DIE(dwarf::DW_TAG_namespace);
    875   insertDIE(NS, NDie);
    876   if (!NS.getName().empty())
    877     addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
    878   addSourceLine(NDie, NS);
    879   addToContextOwner(NDie, NS.getContext());
    880   return NDie;
    881 }
    882 
    883 /// constructSubrangeDIE - Construct subrange DIE from DISubrange.
    884 void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
    885   DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
    886   addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
    887   int64_t L = SR.getLo();
    888   int64_t H = SR.getHi();
    889 
    890   // The L value defines the lower bounds which is typically zero for C/C++. The
    891   // H value is the upper bounds.  Values are 64 bit.  H - L + 1 is the size
    892   // of the array. If L > H then do not emit DW_AT_lower_bound and
    893   // DW_AT_upper_bound attributes. If L is zero and H is also zero then the
    894   // array has one element and in such case do not emit lower bound.
    895 
    896   if (L > H) {
    897     Buffer.addChild(DW_Subrange);
    898     return;
    899   }
    900   if (L)
    901     addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
    902   addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
    903   Buffer.addChild(DW_Subrange);
    904 }
    905 
    906 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
    907 void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
    908                                         DICompositeType *CTy) {
    909   Buffer.setTag(dwarf::DW_TAG_array_type);
    910   if (CTy->getTag() == dwarf::DW_TAG_vector_type)
    911     addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
    912 
    913   // Emit derived type.
    914   addType(&Buffer, CTy->getTypeDerivedFrom());
    915   DIArray Elements = CTy->getTypeArray();
    916 
    917   // Get an anonymous type for index type.
    918   DIE *IdxTy = getIndexTyDie();
    919   if (!IdxTy) {
    920     // Construct an anonymous type for index type.
    921     IdxTy = new DIE(dwarf::DW_TAG_base_type);
    922     addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
    923     addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
    924             dwarf::DW_ATE_signed);
    925     addDie(IdxTy);
    926     setIndexTyDie(IdxTy);
    927   }
    928 
    929   // Add subranges to array type.
    930   for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
    931     DIDescriptor Element = Elements.getElement(i);
    932     if (Element.getTag() == dwarf::DW_TAG_subrange_type)
    933       constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
    934   }
    935 }
    936 
    937 /// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
    938 DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
    939   DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
    940   StringRef Name = ETy.getName();
    941   addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
    942   int64_t Value = ETy.getEnumValue();
    943   addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
    944   return Enumerator;
    945 }
    946 
    947 /// createMemberDIE - Create new member DIE.
    948 DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
    949   DIE *MemberDie = new DIE(DT.getTag());
    950   StringRef Name = DT.getName();
    951   if (!Name.empty())
    952     addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
    953 
    954   addType(MemberDie, DT.getTypeDerivedFrom());
    955 
    956   addSourceLine(MemberDie, DT);
    957 
    958   DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
    959   addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
    960 
    961   uint64_t Size = DT.getSizeInBits();
    962   uint64_t FieldSize = DT.getOriginalTypeSize();
    963 
    964   if (Size != FieldSize) {
    965     // Handle bitfield.
    966     addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
    967     addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
    968 
    969     uint64_t Offset = DT.getOffsetInBits();
    970     uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
    971     uint64_t HiMark = (Offset + FieldSize) & AlignMask;
    972     uint64_t FieldOffset = (HiMark - FieldSize);
    973     Offset -= FieldOffset;
    974 
    975     // Maybe we need to work from the other end.
    976     if (Asm->getTargetData().isLittleEndian())
    977       Offset = FieldSize - (Offset + Size);
    978     addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
    979 
    980     // Here WD_AT_data_member_location points to the anonymous
    981     // field that includes this bit field.
    982     addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
    983 
    984   } else
    985     // This is not a bitfield.
    986     addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
    987 
    988   if (DT.getTag() == dwarf::DW_TAG_inheritance
    989       && DT.isVirtual()) {
    990 
    991     // For C++, virtual base classes are not at fixed offset. Use following
    992     // expression to extract appropriate offset from vtable.
    993     // BaseAddr = ObAddr + *((*ObAddr) - Offset)
    994 
    995     DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
    996     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
    997     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
    998     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
    999     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
   1000     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
   1001     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
   1002     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
   1003 
   1004     addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
   1005              VBaseLocationDie);
   1006   } else
   1007     addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
   1008 
   1009   if (DT.isProtected())
   1010     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
   1011             dwarf::DW_ACCESS_protected);
   1012   else if (DT.isPrivate())
   1013     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
   1014             dwarf::DW_ACCESS_private);
   1015   // Otherwise C++ member and base classes are considered public.
   1016   else if (DT.getCompileUnit().getLanguage() == dwarf::DW_LANG_C_plus_plus)
   1017     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
   1018             dwarf::DW_ACCESS_public);
   1019   if (DT.isVirtual())
   1020     addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
   1021             dwarf::DW_VIRTUALITY_virtual);
   1022 
   1023   // Objective-C properties.
   1024   StringRef PropertyName = DT.getObjCPropertyName();
   1025   if (!PropertyName.empty()) {
   1026     addString(MemberDie, dwarf::DW_AT_APPLE_property_name, dwarf::DW_FORM_string,
   1027               PropertyName);
   1028     StringRef GetterName = DT.getObjCPropertyGetterName();
   1029     if (!GetterName.empty())
   1030       addString(MemberDie, dwarf::DW_AT_APPLE_property_getter,
   1031                 dwarf::DW_FORM_string, GetterName);
   1032     StringRef SetterName = DT.getObjCPropertySetterName();
   1033     if (!SetterName.empty())
   1034       addString(MemberDie, dwarf::DW_AT_APPLE_property_setter,
   1035                 dwarf::DW_FORM_string, SetterName);
   1036     unsigned PropertyAttributes = 0;
   1037     if (DT.isReadOnlyObjCProperty())
   1038       PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
   1039     if (DT.isReadWriteObjCProperty())
   1040       PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
   1041     if (DT.isAssignObjCProperty())
   1042       PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
   1043     if (DT.isRetainObjCProperty())
   1044       PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
   1045     if (DT.isCopyObjCProperty())
   1046       PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
   1047     if (DT.isNonAtomicObjCProperty())
   1048       PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
   1049     if (PropertyAttributes)
   1050       addUInt(MemberDie, dwarf::DW_AT_APPLE_property_attribute, 0,
   1051               PropertyAttributes);
   1052   }
   1053   return MemberDie;
   1054 }
   1055