DwarfDebug.h revision a098c506a24a5f1a4e7c7344b53b2e586801a415
10310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling//===-- llvm/CodeGen/DwarfDebug.h - Dwarf Debug Framework ------*- C++ -*--===// 20310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling// 30310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling// The LLVM Compiler Infrastructure 40310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling// 50310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling// This file is distributed under the University of Illinois Open Source 60310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling// License. See LICENSE.TXT for details. 70310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling// 80310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling//===----------------------------------------------------------------------===// 90310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling// 100310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling// This file contains support for writing dwarf debug info into asm files. 110310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling// 120310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling//===----------------------------------------------------------------------===// 130310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 140310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling#ifndef CODEGEN_ASMPRINTER_DWARFDEBUG_H__ 150310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling#define CODEGEN_ASMPRINTER_DWARFDEBUG_H__ 160310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 170310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling#include "llvm/CodeGen/AsmPrinter.h" 18bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel#include "llvm/CodeGen/LexicalScopes.h" 192d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng#include "llvm/MC/MachineLocation.h" 203cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel#include "llvm/Analysis/DebugInfo.h" 21d2c4f19a9fd13790ee48ce182c1163476e2cd762Chris Lattner#include "DIE.h" 22622b02601bafdf40d103d67951fae88f409c4641Devang Patel#include "llvm/ADT/DenseMap.h" 230310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling#include "llvm/ADT/FoldingSet.h" 2474e41f982100b225936d75047dccbe5f1988b1d0Chris Lattner#include "llvm/ADT/SmallPtrSet.h" 250310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling#include "llvm/ADT/StringMap.h" 260310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling#include "llvm/ADT/UniqueVector.h" 2774e41f982100b225936d75047dccbe5f1988b1d0Chris Lattner#include "llvm/Support/Allocator.h" 2812ea76563276b656b4bcf7ff38a404c10b0a675fBenjamin Kramer#include "llvm/Support/DebugLoc.h" 290310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 300310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendlingnamespace llvm { 310310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 320310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendlingclass CompileUnit; 330310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendlingclass DbgConcreteScope; 34381afae68f3edd5cca65835003dacd73aca5da55Nick Lewyckyclass DbgVariable; 350310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendlingclass MachineFrameInfo; 360310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendlingclass MachineModuleInfo; 37a43098d388131dd0757aa72fd0e7db3587293906Devang Patelclass MachineOperand; 38af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattnerclass MCAsmInfo; 3974e41f982100b225936d75047dccbe5f1988b1d0Chris Lattnerclass DIEAbbrev; 4074e41f982100b225936d75047dccbe5f1988b1d0Chris Lattnerclass DIE; 4174e41f982100b225936d75047dccbe5f1988b1d0Chris Lattnerclass DIEBlock; 4274e41f982100b225936d75047dccbe5f1988b1d0Chris Lattnerclass DIEEntry; 430310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 440310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling//===----------------------------------------------------------------------===// 450310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling/// SrcLineInfo - This class is used to record source line correspondence. 460310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling/// 47381afae68f3edd5cca65835003dacd73aca5da55Nick Lewyckyclass SrcLineInfo { 480310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling unsigned Line; // Source line number. 490310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling unsigned Column; // Source column. 500310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling unsigned SourceID; // Source ID number. 5125b68c6770b7ba044ad37e0aed4f1c414f3b5209Chris Lattner MCSymbol *Label; // Label in code ID number. 520310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendlingpublic: 5325b68c6770b7ba044ad37e0aed4f1c414f3b5209Chris Lattner SrcLineInfo(unsigned L, unsigned C, unsigned S, MCSymbol *label) 5425b68c6770b7ba044ad37e0aed4f1c414f3b5209Chris Lattner : Line(L), Column(C), SourceID(S), Label(label) {} 550310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 560310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling // Accessors 570310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling unsigned getLine() const { return Line; } 580310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling unsigned getColumn() const { return Column; } 590310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling unsigned getSourceID() const { return SourceID; } 6025b68c6770b7ba044ad37e0aed4f1c414f3b5209Chris Lattner MCSymbol *getLabel() const { return Label; } 610310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling}; 620310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 636c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel/// DotDebugLocEntry - This struct describes location entries emitted in 646c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel/// .debug_loc section. 656c3ea9012e40a95d45592a15c63895d09ece5052Devang Pateltypedef struct DotDebugLocEntry { 666c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel const MCSymbol *Begin; 676c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel const MCSymbol *End; 686c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel MachineLocation Loc; 69c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel const MDNode *Variable; 706c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel bool Merged; 71c432907eca615dfea2de3c467f4087f00203b2d6Devang Patel bool Constant; 7280efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel enum EntryType { 7380efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel E_Location, 7480efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel E_Integer, 7580efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel E_ConstantFP, 7680efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel E_ConstantInt 7780efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel }; 7880efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel enum EntryType EntryKind; 7980efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel 8080efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel union { 8180efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel int64_t Int; 8280efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel const ConstantFP *CFP; 8380efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel const ConstantInt *CIP; 8480efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel } Constants; 85c432907eca615dfea2de3c467f4087f00203b2d6Devang Patel DotDebugLocEntry() 86c432907eca615dfea2de3c467f4087f00203b2d6Devang Patel : Begin(0), End(0), Variable(0), Merged(false), 8780efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel Constant(false) { Constants.Int = 0;} 88c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel DotDebugLocEntry(const MCSymbol *B, const MCSymbol *E, MachineLocation &L, 89c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel const MDNode *V) 90c432907eca615dfea2de3c467f4087f00203b2d6Devang Patel : Begin(B), End(E), Loc(L), Variable(V), Merged(false), 9180efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel Constant(false) { Constants.Int = 0; EntryKind = E_Location; } 92c432907eca615dfea2de3c467f4087f00203b2d6Devang Patel DotDebugLocEntry(const MCSymbol *B, const MCSymbol *E, int64_t i) 93c432907eca615dfea2de3c467f4087f00203b2d6Devang Patel : Begin(B), End(E), Variable(0), Merged(false), 9480efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel Constant(true) { Constants.Int = i; EntryKind = E_Integer; } 9580efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel DotDebugLocEntry(const MCSymbol *B, const MCSymbol *E, const ConstantFP *FPtr) 9680efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel : Begin(B), End(E), Variable(0), Merged(false), 9780efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel Constant(true) { Constants.CFP = FPtr; EntryKind = E_ConstantFP; } 9880efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel DotDebugLocEntry(const MCSymbol *B, const MCSymbol *E, const ConstantInt *IPtr) 9980efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel : Begin(B), End(E), Variable(0), Merged(false), 10080efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel Constant(true) { Constants.CIP = IPtr; EntryKind = E_ConstantInt; } 101c432907eca615dfea2de3c467f4087f00203b2d6Devang Patel 1026c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel /// Empty entries are also used as a trigger to emit temp label. Such 1036c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel /// labels are referenced is used to find debug_loc offset for a given DIE. 1046c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel bool isEmpty() { return Begin == 0 && End == 0; } 1056c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel bool isMerged() { return Merged; } 1066c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel void Merge(DotDebugLocEntry *Next) { 1076c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel if (!(Begin && Loc == Next->Loc && End == Next->Begin)) 1086c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel return; 1096c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel Next->Begin = Begin; 1106c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel Merged = true; 1116c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel } 11280efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel bool isLocation() const { return EntryKind == E_Location; } 11380efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel bool isInt() const { return EntryKind == E_Integer; } 11480efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel bool isConstantFP() const { return EntryKind == E_ConstantFP; } 11580efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel bool isConstantInt() const { return EntryKind == E_ConstantInt; } 11680efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel int64_t getInt() { return Constants.Int; } 11780efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel const ConstantFP *getConstantFP() { return Constants.CFP; } 11880efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel const ConstantInt *getConstantInt() { return Constants.CIP; } 1196c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel} DotDebugLocEntry; 1206c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel 1213cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel//===----------------------------------------------------------------------===// 1223cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel/// DbgVariable - This class is used to track local variable information. 1233cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel/// 1243cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patelclass DbgVariable { 1253cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIVariable Var; // Variable Descriptor. 1263cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIE *TheDIE; // Variable DIE. 1273cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel unsigned DotDebugLocOffset; // Offset in DotDebugLocEntries. 1283cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patelpublic: 1293cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel // AbsVar may be NULL. 1303cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DbgVariable(DIVariable V) : Var(V), TheDIE(0), DotDebugLocOffset(~0U) {} 1313cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 1323cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel // Accessors. 1333cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIVariable getVariable() const { return Var; } 1343cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void setDIE(DIE *D) { TheDIE = D; } 1353cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIE *getDIE() const { return TheDIE; } 1363cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void setDotDebugLocOffset(unsigned O) { DotDebugLocOffset = O; } 1373cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel unsigned getDotDebugLocOffset() const { return DotDebugLocOffset; } 1383cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel StringRef getName() const { return Var.getName(); } 13959bc4093d5009ecda4a4f70ed04c78502e28474fDevang Patel // Translate tag to proper Dwarf tag. 14059bc4093d5009ecda4a4f70ed04c78502e28474fDevang Patel unsigned getTag() const { 14159bc4093d5009ecda4a4f70ed04c78502e28474fDevang Patel if (Var.getTag() == dwarf::DW_TAG_arg_variable) 14259bc4093d5009ecda4a4f70ed04c78502e28474fDevang Patel return dwarf::DW_TAG_formal_parameter; 14359bc4093d5009ecda4a4f70ed04c78502e28474fDevang Patel 14459bc4093d5009ecda4a4f70ed04c78502e28474fDevang Patel return dwarf::DW_TAG_variable; 14559bc4093d5009ecda4a4f70ed04c78502e28474fDevang Patel } 146a098c506a24a5f1a4e7c7344b53b2e586801a415Devang Patel /// isArtificial - Return true if DbgVariable is artificial. 147a098c506a24a5f1a4e7c7344b53b2e586801a415Devang Patel bool isArtificial() const { 148a098c506a24a5f1a4e7c7344b53b2e586801a415Devang Patel if (Var.isArtificial()) 149a098c506a24a5f1a4e7c7344b53b2e586801a415Devang Patel return true; 150a098c506a24a5f1a4e7c7344b53b2e586801a415Devang Patel if (Var.getTag() == dwarf::DW_TAG_arg_variable 151a098c506a24a5f1a4e7c7344b53b2e586801a415Devang Patel && getType().isArtificial()) 152a098c506a24a5f1a4e7c7344b53b2e586801a415Devang Patel return true; 153a098c506a24a5f1a4e7c7344b53b2e586801a415Devang Patel return false; 154a098c506a24a5f1a4e7c7344b53b2e586801a415Devang Patel } 1553cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel bool variableHasComplexAddress() const { 1563cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel assert(Var.Verify() && "Invalid complex DbgVariable!"); 1573cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel return Var.hasComplexAddress(); 1583cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel } 1593cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel bool isBlockByrefVariable() const { 1603cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel assert(Var.Verify() && "Invalid complex DbgVariable!"); 1613cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel return Var.isBlockByrefVariable(); 1623cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel } 1633cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel unsigned getNumAddrElements() const { 1643cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel assert(Var.Verify() && "Invalid complex DbgVariable!"); 1653cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel return Var.getNumAddrElements(); 1663cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel } 1673cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel uint64_t getAddrElement(unsigned i) const { 1683cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel return Var.getAddrElement(i); 1693cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel } 1703cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIType getType() const; 1713cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel}; 1723cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 173d38fee8ddc6597555904b82b6471a446cc5fe183Chris Lattnerclass DwarfDebug { 174d38fee8ddc6597555904b82b6471a446cc5fe183Chris Lattner /// Asm - Target of Dwarf emission. 175d38fee8ddc6597555904b82b6471a446cc5fe183Chris Lattner AsmPrinter *Asm; 176105d69759312a9544ec55954b3fb59bdb7e224dfChris Lattner 177d38fee8ddc6597555904b82b6471a446cc5fe183Chris Lattner /// MMI - Collected machine module information. 178d38fee8ddc6597555904b82b6471a446cc5fe183Chris Lattner MachineModuleInfo *MMI; 179d38fee8ddc6597555904b82b6471a446cc5fe183Chris Lattner 1800310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling //===--------------------------------------------------------------------===// 1810310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling // Attributes used to construct specific Dwarf sections. 1820310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling // 1830310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 184163a9f7c5f545414506364a94689e22d59533fe6Devang Patel CompileUnit *FirstCU; 185163a9f7c5f545414506364a94689e22d59533fe6Devang Patel DenseMap <const MDNode *, CompileUnit *> CUMap; 1860310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 1870310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// AbbreviationsSet - Used to uniquely define abbreviations. 1880310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 1890310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling FoldingSet<DIEAbbrev> AbbreviationsSet; 1900310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 1910310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// Abbreviations - A list of all the unique abbreviations in use. 1920310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 1930310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling std::vector<DIEAbbrev *> Abbreviations; 1940310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 1950310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// SourceIdMap - Source id map, i.e. pair of directory id and source file 1960310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// id mapped to a unique id. 1975c0556341e29246e697c73844a5f9b1e14474715Rafael Espindola StringMap<unsigned> SourceIdMap; 1980310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 199bc733f54c0d344d72aadf2f925a08babfeb7ea6aChris Lattner /// StringPool - A String->Symbol mapping of strings used by indirect 200bc733f54c0d344d72aadf2f925a08babfeb7ea6aChris Lattner /// references. 201bc733f54c0d344d72aadf2f925a08babfeb7ea6aChris Lattner StringMap<std::pair<MCSymbol*, unsigned> > StringPool; 202bc733f54c0d344d72aadf2f925a08babfeb7ea6aChris Lattner unsigned NextStringPoolNumber; 203bc733f54c0d344d72aadf2f925a08babfeb7ea6aChris Lattner 204bc733f54c0d344d72aadf2f925a08babfeb7ea6aChris Lattner MCSymbol *getStringPoolEntry(StringRef Str); 2050310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 2060310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// SectionMap - Provides a unique id per text section. 2070310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 208a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner UniqueVector<const MCSection*> SectionMap; 2090310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 2100478c15d1ecdbc53cf106419629479bcb2a0f4afDevang Patel /// CurrentFnArguments - List of Arguments (DbgValues) for current function. 2110478c15d1ecdbc53cf106419629479bcb2a0f4afDevang Patel SmallVector<DbgVariable *, 8> CurrentFnArguments; 2120478c15d1ecdbc53cf106419629479bcb2a0f4afDevang Patel 213bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel LexicalScopes LScopes; 2142ddefecfa063b99550bd1fc9fd53efe433be54fbDevang Patel 2158aa61477e3cbc6ebc399274042799a5cf09629a1Devang Patel /// AbstractSPDies - Collection of abstract subprogram DIEs. 2168aa61477e3cbc6ebc399274042799a5cf09629a1Devang Patel DenseMap<const MDNode *, DIE *> AbstractSPDies; 2178aa61477e3cbc6ebc399274042799a5cf09629a1Devang Patel 218bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel /// ScopeVariables - Collection of dbg variables of a scope. 219bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8> > ScopeVariables; 22053bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel 221bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel /// AbstractVariables - Collection on abstract variables. 222e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel DenseMap<const MDNode *, DbgVariable *> AbstractVariables; 22353bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel 22426c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel /// DbgVariableToFrameIndexMap - Tracks frame index used to find 22526c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel /// variable's value. 22626c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel DenseMap<const DbgVariable *, int> DbgVariableToFrameIndexMap; 22726c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel 22826c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel /// DbgVariableToDbgInstMap - Maps DbgVariable to corresponding DBG_VALUE 22926c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel /// machine instruction. 23026c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel DenseMap<const DbgVariable *, const MachineInstr *> DbgVariableToDbgInstMap; 23126c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel 232c3f5f783a2923e7842802d5cd1a932ee56c3bb45Devang Patel /// DotDebugLocEntries - Collection of DotDebugLocEntry. 233c3f5f783a2923e7842802d5cd1a932ee56c3bb45Devang Patel SmallVector<DotDebugLocEntry, 4> DotDebugLocEntries; 234c3f5f783a2923e7842802d5cd1a932ee56c3bb45Devang Patel 235c3f5f783a2923e7842802d5cd1a932ee56c3bb45Devang Patel /// UseDotDebugLocEntry - DW_AT_location attributes for the DIEs in this set 236c3f5f783a2923e7842802d5cd1a932ee56c3bb45Devang Patel /// idetifies corresponding .debug_loc entry offset. 237c3f5f783a2923e7842802d5cd1a932ee56c3bb45Devang Patel SmallPtrSet<const DIE *, 4> UseDotDebugLocEntry; 238c3f5f783a2923e7842802d5cd1a932ee56c3bb45Devang Patel 23926c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel /// VarToAbstractVarMap - Maps DbgVariable with corresponding Abstract 24026c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel /// DbgVariable, if any. 24126c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel DenseMap<const DbgVariable *, const DbgVariable *> VarToAbstractVarMap; 24226c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel 24353bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel /// InliendSubprogramDIEs - Collection of subprgram DIEs that are marked 24453bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel /// (at the end of the module) as DW_AT_inline. 24553bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel SmallPtrSet<DIE *, 4> InlinedSubprogramDIEs; 24653bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel 2470310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// InlineInfo - Keep track of inlined functions and their location. This 2480310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// information is used to populate debug_inlined section. 249c3f5f783a2923e7842802d5cd1a932ee56c3bb45Devang Patel typedef std::pair<const MCSymbol *, DIE *> InlineInfoLabels; 250e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> > InlineInfo; 251e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel SmallVector<const MDNode *, 4> InlinedSPNodes; 2520310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 2534a1cad673c5bf0812099c6c8f551fe6af967c2b3Devang Patel // ProcessedSPNodes - This is a collection of subprogram MDNodes that 2544a1cad673c5bf0812099c6c8f551fe6af967c2b3Devang Patel // are processed to create DIEs. 2554a1cad673c5bf0812099c6c8f551fe6af967c2b3Devang Patel SmallPtrSet<const MDNode *, 16> ProcessedSPNodes; 2564a1cad673c5bf0812099c6c8f551fe6af967c2b3Devang Patel 257eac9c07fde0620a3b19cc923c0e80397530b26b0Devang Patel /// LabelsBeforeInsn - Maps instruction with label emitted before 2581c246358a062bc3537c1286c6b9314d56854a257Devang Patel /// instruction. 259eac9c07fde0620a3b19cc923c0e80397530b26b0Devang Patel DenseMap<const MachineInstr *, MCSymbol *> LabelsBeforeInsn; 2601c246358a062bc3537c1286c6b9314d56854a257Devang Patel 261eac9c07fde0620a3b19cc923c0e80397530b26b0Devang Patel /// LabelsAfterInsn - Maps instruction with label emitted after 2621c246358a062bc3537c1286c6b9314d56854a257Devang Patel /// instruction. 263eac9c07fde0620a3b19cc923c0e80397530b26b0Devang Patel DenseMap<const MachineInstr *, MCSymbol *> LabelsAfterInsn; 2641c246358a062bc3537c1286c6b9314d56854a257Devang Patel 265adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen /// UserVariables - Every user variable mentioned by a DBG_VALUE instruction 266adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen /// in order of appearance. 267adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen SmallVector<const MDNode*, 8> UserVariables; 268b2b31a6f93f5329c86e41c04ec8c33799d012f9eDevang Patel 269adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen /// DbgValues - For each user variable, keep a list of DBG_VALUE 270adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen /// instructions in order. The list can also contain normal instructions that 271adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen /// clobber the previous DBG_VALUE. 272adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen typedef DenseMap<const MDNode*, SmallVector<const MachineInstr*, 4> > 273adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen DbgValueHistoryMap; 274adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen DbgValueHistoryMap DbgValues; 27528cf1156c93afabedc69fe7b73aa92ce85e323a5Jakob Stoklund Olesen 276f2548caaa8b290aa598bf49c27dff72f7751ba5cDevang Patel SmallVector<const MCSymbol *, 8> DebugRangeSymbols; 277c04d54527e1d7e8b50cefcde7563bcbc7425e978Devang Patel 278553881bddcdeb66c0ae06bf9f62ca63b9f29b2e8Devang Patel /// Previous instruction's location information. This is used to determine 279553881bddcdeb66c0ae06bf9f62ca63b9f29b2e8Devang Patel /// label location to indicate scope boundries in dwarf debug info. 280de4845c163a5847c82d7ce10ed0c320098bce6e0Chris Lattner DebugLoc PrevInstLoc; 281f2548caaa8b290aa598bf49c27dff72f7751ba5cDevang Patel MCSymbol *PrevLabel; 282553881bddcdeb66c0ae06bf9f62ca63b9f29b2e8Devang Patel 2834243e67bd5eeae930060824d4290f8071a66e28fDevang Patel /// PrologEndLoc - This location indicates end of function prologue and 2844243e67bd5eeae930060824d4290f8071a66e28fDevang Patel /// beginning of function body. 2854243e67bd5eeae930060824d4290f8071a66e28fDevang Patel DebugLoc PrologEndLoc; 2864243e67bd5eeae930060824d4290f8071a66e28fDevang Patel 2870310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling struct FunctionDebugFrameInfo { 2880310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling unsigned Number; 2890310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling std::vector<MachineMove> Moves; 2900310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 2910310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling FunctionDebugFrameInfo(unsigned Num, const std::vector<MachineMove> &M) 2920310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling : Number(Num), Moves(M) {} 2930310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling }; 2940310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 2950310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling std::vector<FunctionDebugFrameInfo> DebugFrames; 2960310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 2973cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel // DIEValueAllocator - All DIEValues are allocated through this allocator. 2983cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel BumpPtrAllocator DIEValueAllocator; 2993cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 3009c69e28553c5c344666aebce266694cf2d73e8d5Chris Lattner // Section Symbols: these are assembler temporary labels that are emitted at 3019c69e28553c5c344666aebce266694cf2d73e8d5Chris Lattner // the beginning of each supported dwarf section. These are used to form 3029c69e28553c5c344666aebce266694cf2d73e8d5Chris Lattner // section offsets and are created by EmitSectionLabels. 303f2b04232006142eb7933972fb21d9ffb9b8c2646Rafael Espindola MCSymbol *DwarfInfoSectionSym, *DwarfAbbrevSectionSym; 304f2548caaa8b290aa598bf49c27dff72f7751ba5cDevang Patel MCSymbol *DwarfStrSectionSym, *TextSectionSym, *DwarfDebugRangeSectionSym; 305c3f5f783a2923e7842802d5cd1a932ee56c3bb45Devang Patel MCSymbol *DwarfDebugLocSectionSym; 306c3f5f783a2923e7842802d5cd1a932ee56c3bb45Devang Patel MCSymbol *FunctionBeginSym, *FunctionEndSym; 307ca76f6f57cc50fcdbdb661ea80f7ffd42220fdbeDevang Patel 308e62dfcf4b3fcf5397737713b222ab1655df10e03Devang Patelprivate: 3090310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3102c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// assignAbbrevNumber - Define a unique number for the abbreviation. 3110310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3122c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void assignAbbrevNumber(DIEAbbrev &Abbrev); 3130310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 314bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel void addScopeVariable(LexicalScope *LS, DbgVariable *Var); 31553bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel 31653bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel /// findAbstractVariable - Find abstract variable associated with Var. 31726c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel DbgVariable *findAbstractVariable(DIVariable &Var, DebugLoc Loc); 31853bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel 3192c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// updateSubprogramScopeDIE - Find DIE for the given subprogram and 3202c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes. 3212c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// If there are global variables in this scope then create and insert 3222c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// DIEs for these variables. 323e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel DIE *updateSubprogramScopeDIE(const MDNode *SPNode); 3240310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3252c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// constructLexicalScope - Construct new DW_TAG_lexical_block 3262c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels. 327bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel DIE *constructLexicalScopeDIE(LexicalScope *Scope); 3282c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel 3292c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// constructInlinedScopeDIE - This scope represents inlined body of 3302c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// a function. Construct DIE to represent this concrete inlined copy 3312c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// of the function. 332bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel DIE *constructInlinedScopeDIE(LexicalScope *Scope); 3330310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3342c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// constructVariableDIE - Construct a DIE for the given DbgVariable. 335bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel DIE *constructVariableDIE(DbgVariable *DV, LexicalScope *S); 3362c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel 3372c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// constructScopeDIE - Construct a DIE for this scope. 338bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel DIE *constructScopeDIE(LexicalScope *Scope); 3392c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel 340fa070b01753e2d547539dca4e9d55459c652dc9cChris Lattner /// EmitSectionLabels - Emit initial Dwarf sections with a label at 341fa070b01753e2d547539dca4e9d55459c652dc9cChris Lattner /// the start of each one. 342fa070b01753e2d547539dca4e9d55459c652dc9cChris Lattner void EmitSectionLabels(); 3430310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3442c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// emitDIE - Recusively Emits a debug information entry. 3450310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3462c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void emitDIE(DIE *Die); 3470310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3482c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// computeSizeAndOffset - Compute the size and offset of a DIE. 3490310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3502c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel unsigned computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last); 3510310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3522c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// computeSizeAndOffsets - Compute the size and offset of all the DIEs. 3530310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3542c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void computeSizeAndOffsets(); 3550310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3568a24114b169376901a0b9e804a5aa7eb4416a985Devang Patel /// EmitDebugInfo - Emit the debug info section. 3570310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3582c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void emitDebugInfo(); 3590310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3602c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// emitAbbreviations - Emit the abbreviation section. 3610310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3622c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void emitAbbreviations() const; 3630310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3642c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// emitEndOfLineMatrix - Emit the last address of the section and the end of 3650310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// the line matrix. 3660310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3672c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void emitEndOfLineMatrix(unsigned SectionEnd); 3680310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3692c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// emitDebugPubNames - Emit visible names into a debug pubnames section. 3700310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3712c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void emitDebugPubNames(); 3720310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 373193f720f118f52eb05de172d936a440f335c1469Devang Patel /// emitDebugPubTypes - Emit visible types into a debug pubtypes section. 374193f720f118f52eb05de172d936a440f335c1469Devang Patel /// 375193f720f118f52eb05de172d936a440f335c1469Devang Patel void emitDebugPubTypes(); 376193f720f118f52eb05de172d936a440f335c1469Devang Patel 3772c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// emitDebugStr - Emit visible names into a debug str section. 3780310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3792c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void emitDebugStr(); 3800310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3812c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// emitDebugLoc - Emit visible names into a debug loc section. 3820310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3832c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void emitDebugLoc(); 3840310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3850310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// EmitDebugARanges - Emit visible names into a debug aranges section. 3860310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3870310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling void EmitDebugARanges(); 3880310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3892c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// emitDebugRanges - Emit visible names into a debug ranges section. 3900310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3912c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void emitDebugRanges(); 3920310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3932c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// emitDebugMacInfo - Emit visible names into a debug macinfo section. 3940310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3952c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void emitDebugMacInfo(); 3960310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3972c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// emitDebugInlineInfo - Emit inline info using following format. 3980310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// Section Header: 3990310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 1. length of section 4000310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 2. Dwarf version number 4010310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3. address size. 4020310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 4030310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// Entries (one "entry" for each function that was inlined): 4040310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 4050310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 1. offset into __debug_str section for MIPS linkage name, if exists; 4060310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// otherwise offset into __debug_str for regular function name. 4070310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 2. offset into __debug_str section for regular function name. 4080310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3. an unsigned LEB128 number indicating the number of distinct inlining 4090310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// instances for the function. 4100310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 4110310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// The rest of the entry consists of a {die_offset, low_pc} pair for each 4120310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// inlined instance; the die_offset points to the inlined_subroutine die in 4130310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// the __debug_info section, and the low_pc is the starting address for the 4140310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// inlining instance. 4152c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void emitDebugInlineInfo(); 416f0fb987903d0885e7da456e3d6f4a094efaccdc2Bill Wendling 417163a9f7c5f545414506364a94689e22d59533fe6Devang Patel /// constructCompileUnit - Create new CompileUnit for the given 418163a9f7c5f545414506364a94689e22d59533fe6Devang Patel /// metadata node with tag DW_TAG_compile_unit. 419e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel void constructCompileUnit(const MDNode *N); 420f0fb987903d0885e7da456e3d6f4a094efaccdc2Bill Wendling 421163a9f7c5f545414506364a94689e22d59533fe6Devang Patel /// getCompielUnit - Get CompileUnit DIE. 422163a9f7c5f545414506364a94689e22d59533fe6Devang Patel CompileUnit *getCompileUnit(const MDNode *N) const; 423163a9f7c5f545414506364a94689e22d59533fe6Devang Patel 424163a9f7c5f545414506364a94689e22d59533fe6Devang Patel /// constructGlobalVariableDIE - Construct global variable DIE. 425e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel void constructGlobalVariableDIE(const MDNode *N); 426f0fb987903d0885e7da456e3d6f4a094efaccdc2Bill Wendling 427163a9f7c5f545414506364a94689e22d59533fe6Devang Patel /// construct SubprogramDIE - Construct subprogram DIE. 428e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel void constructSubprogramDIE(const MDNode *N); 429f0fb987903d0885e7da456e3d6f4a094efaccdc2Bill Wendling 430c608784dc8a668abbb96e7a471e6341c1fda669fChris Lattner /// recordSourceLine - Register a source line with debug info. Returns the 431c608784dc8a668abbb96e7a471e6341c1fda669fChris Lattner /// unique label that was emitted and which provides correspondence to 432c608784dc8a668abbb96e7a471e6341c1fda669fChris Lattner /// the source line list. 4334243e67bd5eeae930060824d4290f8071a66e28fDevang Patel void recordSourceLine(unsigned Line, unsigned Col, const MDNode *Scope, 4344243e67bd5eeae930060824d4290f8071a66e28fDevang Patel unsigned Flags); 4352b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner 43626c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel /// recordVariableFrameIndex - Record a variable's index. 43726c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel void recordVariableFrameIndex(const DbgVariable *V, int Index); 43826c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel 43926c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel /// findVariableFrameIndex - Return true if frame index for the variable 44026c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel /// is found. Update FI to hold value of the index. 44126c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel bool findVariableFrameIndex(const DbgVariable *V, int *FI); 44226c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel 443e37b0c6c25262b6c9ef4f1595b18e77f299b5035Devang Patel /// identifyScopeMarkers() - Indentify instructions that are marking 444e37b0c6c25262b6c9ef4f1595b18e77f299b5035Devang Patel /// beginning of or end of a scope. 445e37b0c6c25262b6c9ef4f1595b18e77f299b5035Devang Patel void identifyScopeMarkers(); 4466122a4d1c0c73c1d2d5754c50c68d1dc4ae6f70fDevang Patel 4470478c15d1ecdbc53cf106419629479bcb2a0f4afDevang Patel /// addCurrentFnArgument - If Var is an current function argument that add 4480478c15d1ecdbc53cf106419629479bcb2a0f4afDevang Patel /// it in CurrentFnArguments list. 4490478c15d1ecdbc53cf106419629479bcb2a0f4afDevang Patel bool addCurrentFnArgument(const MachineFunction *MF, 450bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel DbgVariable *Var, LexicalScope *Scope); 4510478c15d1ecdbc53cf106419629479bcb2a0f4afDevang Patel 452bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel /// collectVariableInfo - Populate LexicalScope entries with variables' info. 45378e127d81b58de8663f8328dc1cdbd1f31a759fdDevang Patel void collectVariableInfo(const MachineFunction *, 45478e127d81b58de8663f8328dc1cdbd1f31a759fdDevang Patel SmallPtrSet<const MDNode *, 16> &ProcessedVars); 4552b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner 456ee43286ca9b6ae68d3419e23e51925cd1a6808aaDevang Patel /// collectVariableInfoFromMMITable - Collect variable information from 457ee43286ca9b6ae68d3419e23e51925cd1a6808aaDevang Patel /// side table maintained by MMI. 458ee43286ca9b6ae68d3419e23e51925cd1a6808aaDevang Patel void collectVariableInfoFromMMITable(const MachineFunction * MF, 459ee43286ca9b6ae68d3419e23e51925cd1a6808aaDevang Patel SmallPtrSet<const MDNode *, 16> &P); 460adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen 461adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen /// requestLabelBeforeInsn - Ensure that a label will be emitted before MI. 462adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen void requestLabelBeforeInsn(const MachineInstr *MI) { 463adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen LabelsBeforeInsn.insert(std::make_pair(MI, (MCSymbol*)0)); 464adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen } 465adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen 466adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen /// getLabelBeforeInsn - Return Label preceding the instruction. 467adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen const MCSymbol *getLabelBeforeInsn(const MachineInstr *MI); 468adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen 469adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen /// requestLabelAfterInsn - Ensure that a label will be emitted after MI. 470adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen void requestLabelAfterInsn(const MachineInstr *MI) { 471adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen LabelsAfterInsn.insert(std::make_pair(MI, (MCSymbol*)0)); 472adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen } 473adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen 474adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen /// getLabelAfterInsn - Return Label immediately following the instruction. 475adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen const MCSymbol *getLabelAfterInsn(const MachineInstr *MI); 476adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen 4772b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattnerpublic: 4782b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner //===--------------------------------------------------------------------===// 4792b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner // Main entry points. 4802b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner // 4812b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner DwarfDebug(AsmPrinter *A, Module *M); 4822b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner ~DwarfDebug(); 4832b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner 4842b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner /// beginModule - Emit all Dwarf sections that should come prior to the 4852b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner /// content. 4862b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner void beginModule(Module *M); 4872b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner 4882b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner /// endModule - Emit all Dwarf sections that should come after the content. 4892b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner /// 4902b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner void endModule(); 4912b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner 4922b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner /// beginFunction - Gather pre-function debug information. Assumes being 4932b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner /// emitted immediately after the function entry point. 4942b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner void beginFunction(const MachineFunction *MF); 4952b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner 4962b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner /// endFunction - Gather and emit post-function debug information. 4972b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner /// 4982b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner void endFunction(const MachineFunction *MF); 4990310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 500cbbe287f8adc82a90827f036e048bb53d1573fedDevang Patel /// beginInstruction - Process beginning of an instruction. 501cbbe287f8adc82a90827f036e048bb53d1573fedDevang Patel void beginInstruction(const MachineInstr *MI); 50253bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel 503cbbe287f8adc82a90827f036e048bb53d1573fedDevang Patel /// endInstruction - Prcess end of an instruction. 504cbbe287f8adc82a90827f036e048bb53d1573fedDevang Patel void endInstruction(const MachineInstr *MI); 5053cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 5063cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// GetOrCreateSourceID - Look up the source id with the given directory and 5073cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// source file names. If none currently exists, create a new id and insert it 5083cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// in the SourceIds map. 5093cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel unsigned GetOrCreateSourceID(StringRef DirName, StringRef FullName); 5103cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 5113cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// createSubprogramDIE - Create new DIE using SP. 5123cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIE *createSubprogramDIE(DISubprogram SP); 51353bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel}; 5140310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling} // End of namespace llvm 5150310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 5160310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling#endif 517