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; 335b676ce7932cf60d4fd6d101323d8d54b8395804Chris Lattnerclass ConstantInt; 345b676ce7932cf60d4fd6d101323d8d54b8395804Chris Lattnerclass ConstantFP; 35381afae68f3edd5cca65835003dacd73aca5da55Nick Lewyckyclass DbgVariable; 360310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendlingclass MachineFrameInfo; 370310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendlingclass MachineModuleInfo; 38a43098d388131dd0757aa72fd0e7db3587293906Devang Patelclass MachineOperand; 39af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattnerclass MCAsmInfo; 4074e41f982100b225936d75047dccbe5f1988b1d0Chris Lattnerclass DIEAbbrev; 4174e41f982100b225936d75047dccbe5f1988b1d0Chris Lattnerclass DIE; 4274e41f982100b225936d75047dccbe5f1988b1d0Chris Lattnerclass DIEBlock; 4374e41f982100b225936d75047dccbe5f1988b1d0Chris Lattnerclass DIEEntry; 440310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 450310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling//===----------------------------------------------------------------------===// 460310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling/// SrcLineInfo - This class is used to record source line correspondence. 470310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling/// 48381afae68f3edd5cca65835003dacd73aca5da55Nick Lewyckyclass SrcLineInfo { 490310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling unsigned Line; // Source line number. 500310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling unsigned Column; // Source column. 510310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling unsigned SourceID; // Source ID number. 5225b68c6770b7ba044ad37e0aed4f1c414f3b5209Chris Lattner MCSymbol *Label; // Label in code ID number. 530310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendlingpublic: 5425b68c6770b7ba044ad37e0aed4f1c414f3b5209Chris Lattner SrcLineInfo(unsigned L, unsigned C, unsigned S, MCSymbol *label) 5525b68c6770b7ba044ad37e0aed4f1c414f3b5209Chris Lattner : Line(L), Column(C), SourceID(S), Label(label) {} 560310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 570310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling // Accessors 580310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling unsigned getLine() const { return Line; } 590310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling unsigned getColumn() const { return Column; } 600310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling unsigned getSourceID() const { return SourceID; } 6125b68c6770b7ba044ad37e0aed4f1c414f3b5209Chris Lattner MCSymbol *getLabel() const { return Label; } 620310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling}; 630310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 646c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel/// DotDebugLocEntry - This struct describes location entries emitted in 656c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel/// .debug_loc section. 666c3ea9012e40a95d45592a15c63895d09ece5052Devang Pateltypedef struct DotDebugLocEntry { 676c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel const MCSymbol *Begin; 686c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel const MCSymbol *End; 696c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel MachineLocation Loc; 70c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel const MDNode *Variable; 716c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel bool Merged; 72c432907eca615dfea2de3c467f4087f00203b2d6Devang Patel bool Constant; 7380efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel enum EntryType { 7480efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel E_Location, 7580efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel E_Integer, 7680efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel E_ConstantFP, 7780efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel E_ConstantInt 7880efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel }; 7980efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel enum EntryType EntryKind; 8080efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel 8180efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel union { 8280efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel int64_t Int; 8380efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel const ConstantFP *CFP; 8480efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel const ConstantInt *CIP; 8580efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel } Constants; 86c432907eca615dfea2de3c467f4087f00203b2d6Devang Patel DotDebugLocEntry() 87c432907eca615dfea2de3c467f4087f00203b2d6Devang Patel : Begin(0), End(0), Variable(0), Merged(false), 8880efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel Constant(false) { Constants.Int = 0;} 89c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel DotDebugLocEntry(const MCSymbol *B, const MCSymbol *E, MachineLocation &L, 90c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel const MDNode *V) 91c432907eca615dfea2de3c467f4087f00203b2d6Devang Patel : Begin(B), End(E), Loc(L), Variable(V), Merged(false), 9280efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel Constant(false) { Constants.Int = 0; EntryKind = E_Location; } 93c432907eca615dfea2de3c467f4087f00203b2d6Devang Patel DotDebugLocEntry(const MCSymbol *B, const MCSymbol *E, int64_t i) 94c432907eca615dfea2de3c467f4087f00203b2d6Devang Patel : Begin(B), End(E), Variable(0), Merged(false), 9580efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel Constant(true) { Constants.Int = i; EntryKind = E_Integer; } 9680efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel DotDebugLocEntry(const MCSymbol *B, const MCSymbol *E, const ConstantFP *FPtr) 9780efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel : Begin(B), End(E), Variable(0), Merged(false), 9880efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel Constant(true) { Constants.CFP = FPtr; EntryKind = E_ConstantFP; } 9980efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel DotDebugLocEntry(const MCSymbol *B, const MCSymbol *E, const ConstantInt *IPtr) 10080efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel : Begin(B), End(E), Variable(0), Merged(false), 10180efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel Constant(true) { Constants.CIP = IPtr; EntryKind = E_ConstantInt; } 102c432907eca615dfea2de3c467f4087f00203b2d6Devang Patel 1036c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel /// Empty entries are also used as a trigger to emit temp label. Such 1046c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel /// labels are referenced is used to find debug_loc offset for a given DIE. 1056c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel bool isEmpty() { return Begin == 0 && End == 0; } 1066c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel bool isMerged() { return Merged; } 1076c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel void Merge(DotDebugLocEntry *Next) { 1086c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel if (!(Begin && Loc == Next->Loc && End == Next->Begin)) 1096c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel return; 1106c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel Next->Begin = Begin; 1116c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel Merged = true; 1126c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel } 11380efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel bool isLocation() const { return EntryKind == E_Location; } 11480efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel bool isInt() const { return EntryKind == E_Integer; } 11580efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel bool isConstantFP() const { return EntryKind == E_ConstantFP; } 11680efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel bool isConstantInt() const { return EntryKind == E_ConstantInt; } 11780efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel int64_t getInt() { return Constants.Int; } 11880efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel const ConstantFP *getConstantFP() { return Constants.CFP; } 11980efd4e96b0be13e80c26acd737c287d39b9c00fDevang Patel const ConstantInt *getConstantInt() { return Constants.CIP; } 1206c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel} DotDebugLocEntry; 1216c3ea9012e40a95d45592a15c63895d09ece5052Devang Patel 1223cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel//===----------------------------------------------------------------------===// 1233cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel/// DbgVariable - This class is used to track local variable information. 1243cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel/// 1253cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patelclass DbgVariable { 1263cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIVariable Var; // Variable Descriptor. 1273cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIE *TheDIE; // Variable DIE. 1283cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel unsigned DotDebugLocOffset; // Offset in DotDebugLocEntries. 1295a1a67cd3f35b82bcae5dc5dce6ffd9b9549a5c0Devang Patel DbgVariable *AbsVar; // Corresponding Abstract variable, if any. 130ff9dd0ac55bc7eb06e7ba8cccf255e64757863ccDevang Patel const MachineInstr *MInsn; // DBG_VALUE instruction of the variable. 131ff9dd0ac55bc7eb06e7ba8cccf255e64757863ccDevang Patel int FrameIndex; 1323cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patelpublic: 1333cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel // AbsVar may be NULL. 1345a1a67cd3f35b82bcae5dc5dce6ffd9b9549a5c0Devang Patel DbgVariable(DIVariable V, DbgVariable *AV) 135ff9dd0ac55bc7eb06e7ba8cccf255e64757863ccDevang Patel : Var(V), TheDIE(0), DotDebugLocOffset(~0U), AbsVar(AV), MInsn(0), 136c890b19226673d7004eaff7433834b2e5223bdeaDevang Patel FrameIndex(~0) {} 1373cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 1383cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel // Accessors. 1393cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIVariable getVariable() const { return Var; } 1403cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void setDIE(DIE *D) { TheDIE = D; } 1413cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIE *getDIE() const { return TheDIE; } 1423cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void setDotDebugLocOffset(unsigned O) { DotDebugLocOffset = O; } 1433cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel unsigned getDotDebugLocOffset() const { return DotDebugLocOffset; } 1443cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel StringRef getName() const { return Var.getName(); } 1455a1a67cd3f35b82bcae5dc5dce6ffd9b9549a5c0Devang Patel DbgVariable *getAbstractVariable() const { return AbsVar; } 146ff9dd0ac55bc7eb06e7ba8cccf255e64757863ccDevang Patel const MachineInstr *getMInsn() const { return MInsn; } 147ff9dd0ac55bc7eb06e7ba8cccf255e64757863ccDevang Patel void setMInsn(const MachineInstr *M) { MInsn = M; } 148ff9dd0ac55bc7eb06e7ba8cccf255e64757863ccDevang Patel int getFrameIndex() const { return FrameIndex; } 149ff9dd0ac55bc7eb06e7ba8cccf255e64757863ccDevang Patel void setFrameIndex(int FI) { FrameIndex = FI; } 15059bc4093d5009ecda4a4f70ed04c78502e28474fDevang Patel // Translate tag to proper Dwarf tag. 15159bc4093d5009ecda4a4f70ed04c78502e28474fDevang Patel unsigned getTag() const { 15259bc4093d5009ecda4a4f70ed04c78502e28474fDevang Patel if (Var.getTag() == dwarf::DW_TAG_arg_variable) 15359bc4093d5009ecda4a4f70ed04c78502e28474fDevang Patel return dwarf::DW_TAG_formal_parameter; 15459bc4093d5009ecda4a4f70ed04c78502e28474fDevang Patel 15559bc4093d5009ecda4a4f70ed04c78502e28474fDevang Patel return dwarf::DW_TAG_variable; 15659bc4093d5009ecda4a4f70ed04c78502e28474fDevang Patel } 157a098c506a24a5f1a4e7c7344b53b2e586801a415Devang Patel /// isArtificial - Return true if DbgVariable is artificial. 158a098c506a24a5f1a4e7c7344b53b2e586801a415Devang Patel bool isArtificial() const { 159a098c506a24a5f1a4e7c7344b53b2e586801a415Devang Patel if (Var.isArtificial()) 160a098c506a24a5f1a4e7c7344b53b2e586801a415Devang Patel return true; 161a098c506a24a5f1a4e7c7344b53b2e586801a415Devang Patel if (Var.getTag() == dwarf::DW_TAG_arg_variable 162a098c506a24a5f1a4e7c7344b53b2e586801a415Devang Patel && getType().isArtificial()) 163a098c506a24a5f1a4e7c7344b53b2e586801a415Devang Patel return true; 164a098c506a24a5f1a4e7c7344b53b2e586801a415Devang Patel return false; 165a098c506a24a5f1a4e7c7344b53b2e586801a415Devang Patel } 1663cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel bool variableHasComplexAddress() const { 1673cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel assert(Var.Verify() && "Invalid complex DbgVariable!"); 1683cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel return Var.hasComplexAddress(); 1693cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel } 1703cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel bool isBlockByrefVariable() const { 1713cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel assert(Var.Verify() && "Invalid complex DbgVariable!"); 1723cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel return Var.isBlockByrefVariable(); 1733cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel } 1743cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel unsigned getNumAddrElements() const { 1753cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel assert(Var.Verify() && "Invalid complex DbgVariable!"); 1763cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel return Var.getNumAddrElements(); 1773cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel } 1783cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel uint64_t getAddrElement(unsigned i) const { 1793cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel return Var.getAddrElement(i); 1803cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel } 1813cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIType getType() const; 1823cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel}; 1833cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 184d38fee8ddc6597555904b82b6471a446cc5fe183Chris Lattnerclass DwarfDebug { 185d38fee8ddc6597555904b82b6471a446cc5fe183Chris Lattner /// Asm - Target of Dwarf emission. 186d38fee8ddc6597555904b82b6471a446cc5fe183Chris Lattner AsmPrinter *Asm; 187105d69759312a9544ec55954b3fb59bdb7e224dfChris Lattner 188d38fee8ddc6597555904b82b6471a446cc5fe183Chris Lattner /// MMI - Collected machine module information. 189d38fee8ddc6597555904b82b6471a446cc5fe183Chris Lattner MachineModuleInfo *MMI; 190d38fee8ddc6597555904b82b6471a446cc5fe183Chris Lattner 1910310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling //===--------------------------------------------------------------------===// 1920310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling // Attributes used to construct specific Dwarf sections. 1930310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling // 1940310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 195163a9f7c5f545414506364a94689e22d59533fe6Devang Patel CompileUnit *FirstCU; 19694c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 19794c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel /// Maps MDNode with its corresponding CompileUnit. 198163a9f7c5f545414506364a94689e22d59533fe6Devang Patel DenseMap <const MDNode *, CompileUnit *> CUMap; 1990310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 20094c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel /// Maps subprogram MDNode with its corresponding CompileUnit. 20194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel DenseMap <const MDNode *, CompileUnit *> SPMap; 20294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 2030310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// AbbreviationsSet - Used to uniquely define abbreviations. 2040310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 2050310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling FoldingSet<DIEAbbrev> AbbreviationsSet; 2060310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 2070310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// Abbreviations - A list of all the unique abbreviations in use. 2080310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 2090310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling std::vector<DIEAbbrev *> Abbreviations; 2100310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 21174612c250bac1f62a2b74c85411cf7180cd8cd78Benjamin Kramer /// SourceIdMap - Source id map, i.e. pair of source filename and directory, 21274612c250bac1f62a2b74c85411cf7180cd8cd78Benjamin Kramer /// separated by a zero byte, mapped to a unique id. 21374612c250bac1f62a2b74c85411cf7180cd8cd78Benjamin Kramer StringMap<unsigned> SourceIdMap; 2140310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 215bc733f54c0d344d72aadf2f925a08babfeb7ea6aChris Lattner /// StringPool - A String->Symbol mapping of strings used by indirect 216bc733f54c0d344d72aadf2f925a08babfeb7ea6aChris Lattner /// references. 217bc733f54c0d344d72aadf2f925a08babfeb7ea6aChris Lattner StringMap<std::pair<MCSymbol*, unsigned> > StringPool; 218bc733f54c0d344d72aadf2f925a08babfeb7ea6aChris Lattner unsigned NextStringPoolNumber; 219bc733f54c0d344d72aadf2f925a08babfeb7ea6aChris Lattner 2200310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// SectionMap - Provides a unique id per text section. 2210310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 222a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner UniqueVector<const MCSection*> SectionMap; 2230310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 2240478c15d1ecdbc53cf106419629479bcb2a0f4afDevang Patel /// CurrentFnArguments - List of Arguments (DbgValues) for current function. 2250478c15d1ecdbc53cf106419629479bcb2a0f4afDevang Patel SmallVector<DbgVariable *, 8> CurrentFnArguments; 2260478c15d1ecdbc53cf106419629479bcb2a0f4afDevang Patel 227bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel LexicalScopes LScopes; 2282ddefecfa063b99550bd1fc9fd53efe433be54fbDevang Patel 2298aa61477e3cbc6ebc399274042799a5cf09629a1Devang Patel /// AbstractSPDies - Collection of abstract subprogram DIEs. 2308aa61477e3cbc6ebc399274042799a5cf09629a1Devang Patel DenseMap<const MDNode *, DIE *> AbstractSPDies; 2318aa61477e3cbc6ebc399274042799a5cf09629a1Devang Patel 232bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel /// ScopeVariables - Collection of dbg variables of a scope. 233bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8> > ScopeVariables; 23453bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel 235bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel /// AbstractVariables - Collection on abstract variables. 236e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel DenseMap<const MDNode *, DbgVariable *> AbstractVariables; 23753bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel 238c3f5f783a2923e7842802d5cd1a932ee56c3bb45Devang Patel /// DotDebugLocEntries - Collection of DotDebugLocEntry. 239c3f5f783a2923e7842802d5cd1a932ee56c3bb45Devang Patel SmallVector<DotDebugLocEntry, 4> DotDebugLocEntries; 240c3f5f783a2923e7842802d5cd1a932ee56c3bb45Devang Patel 24120b2b788b4f3914757789fe1ee835b70759ce4ecNick Lewycky /// InlinedSubprogramDIEs - Collection of subprogram DIEs that are marked 24253bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel /// (at the end of the module) as DW_AT_inline. 24353bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel SmallPtrSet<DIE *, 4> InlinedSubprogramDIEs; 24453bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel 2450310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// InlineInfo - Keep track of inlined functions and their location. This 24661cafd14491ff7d8183c1593edb7725e8732de38Eric Christopher /// information is used to populate the debug_inlined section. 247c3f5f783a2923e7842802d5cd1a932ee56c3bb45Devang Patel typedef std::pair<const MCSymbol *, DIE *> InlineInfoLabels; 248e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> > InlineInfo; 249e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel SmallVector<const MDNode *, 4> InlinedSPNodes; 2500310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 2514a1cad673c5bf0812099c6c8f551fe6af967c2b3Devang Patel // ProcessedSPNodes - This is a collection of subprogram MDNodes that 2524a1cad673c5bf0812099c6c8f551fe6af967c2b3Devang Patel // are processed to create DIEs. 2534a1cad673c5bf0812099c6c8f551fe6af967c2b3Devang Patel SmallPtrSet<const MDNode *, 16> ProcessedSPNodes; 2544a1cad673c5bf0812099c6c8f551fe6af967c2b3Devang Patel 255eac9c07fde0620a3b19cc923c0e80397530b26b0Devang Patel /// LabelsBeforeInsn - Maps instruction with label emitted before 2561c246358a062bc3537c1286c6b9314d56854a257Devang Patel /// instruction. 257eac9c07fde0620a3b19cc923c0e80397530b26b0Devang Patel DenseMap<const MachineInstr *, MCSymbol *> LabelsBeforeInsn; 2581c246358a062bc3537c1286c6b9314d56854a257Devang Patel 259eac9c07fde0620a3b19cc923c0e80397530b26b0Devang Patel /// LabelsAfterInsn - Maps instruction with label emitted after 2601c246358a062bc3537c1286c6b9314d56854a257Devang Patel /// instruction. 261eac9c07fde0620a3b19cc923c0e80397530b26b0Devang Patel DenseMap<const MachineInstr *, MCSymbol *> LabelsAfterInsn; 2621c246358a062bc3537c1286c6b9314d56854a257Devang Patel 263adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen /// UserVariables - Every user variable mentioned by a DBG_VALUE instruction 264adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen /// in order of appearance. 265adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen SmallVector<const MDNode*, 8> UserVariables; 266b2b31a6f93f5329c86e41c04ec8c33799d012f9eDevang Patel 267adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen /// DbgValues - For each user variable, keep a list of DBG_VALUE 268adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen /// instructions in order. The list can also contain normal instructions that 269adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen /// clobber the previous DBG_VALUE. 270adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen typedef DenseMap<const MDNode*, SmallVector<const MachineInstr*, 4> > 271adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen DbgValueHistoryMap; 272adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen DbgValueHistoryMap DbgValues; 27328cf1156c93afabedc69fe7b73aa92ce85e323a5Jakob Stoklund Olesen 274f2548caaa8b290aa598bf49c27dff72f7751ba5cDevang Patel SmallVector<const MCSymbol *, 8> DebugRangeSymbols; 275c04d54527e1d7e8b50cefcde7563bcbc7425e978Devang Patel 276553881bddcdeb66c0ae06bf9f62ca63b9f29b2e8Devang Patel /// Previous instruction's location information. This is used to determine 277553881bddcdeb66c0ae06bf9f62ca63b9f29b2e8Devang Patel /// label location to indicate scope boundries in dwarf debug info. 278de4845c163a5847c82d7ce10ed0c320098bce6e0Chris Lattner DebugLoc PrevInstLoc; 279f2548caaa8b290aa598bf49c27dff72f7751ba5cDevang Patel MCSymbol *PrevLabel; 280553881bddcdeb66c0ae06bf9f62ca63b9f29b2e8Devang Patel 2814243e67bd5eeae930060824d4290f8071a66e28fDevang Patel /// PrologEndLoc - This location indicates end of function prologue and 2824243e67bd5eeae930060824d4290f8071a66e28fDevang Patel /// beginning of function body. 2834243e67bd5eeae930060824d4290f8071a66e28fDevang Patel DebugLoc PrologEndLoc; 2844243e67bd5eeae930060824d4290f8071a66e28fDevang Patel 2850310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling struct FunctionDebugFrameInfo { 2860310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling unsigned Number; 2870310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling std::vector<MachineMove> Moves; 2880310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 2890310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling FunctionDebugFrameInfo(unsigned Num, const std::vector<MachineMove> &M) 2900310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling : Number(Num), Moves(M) {} 2910310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling }; 2920310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 2930310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling std::vector<FunctionDebugFrameInfo> DebugFrames; 2940310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 2953cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel // DIEValueAllocator - All DIEValues are allocated through this allocator. 2963cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel BumpPtrAllocator DIEValueAllocator; 2973cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 2989c69e28553c5c344666aebce266694cf2d73e8d5Chris Lattner // Section Symbols: these are assembler temporary labels that are emitted at 2999c69e28553c5c344666aebce266694cf2d73e8d5Chris Lattner // the beginning of each supported dwarf section. These are used to form 3009c69e28553c5c344666aebce266694cf2d73e8d5Chris Lattner // section offsets and are created by EmitSectionLabels. 301f2b04232006142eb7933972fb21d9ffb9b8c2646Rafael Espindola MCSymbol *DwarfInfoSectionSym, *DwarfAbbrevSectionSym; 302f2548caaa8b290aa598bf49c27dff72f7751ba5cDevang Patel MCSymbol *DwarfStrSectionSym, *TextSectionSym, *DwarfDebugRangeSectionSym; 303c3f5f783a2923e7842802d5cd1a932ee56c3bb45Devang Patel MCSymbol *DwarfDebugLocSectionSym; 304c3f5f783a2923e7842802d5cd1a932ee56c3bb45Devang Patel MCSymbol *FunctionBeginSym, *FunctionEndSym; 305ca76f6f57cc50fcdbdb661ea80f7ffd42220fdbeDevang Patel 3066c1a703e5418b2ba9d7b47b0c9345e9928ea5a68Nick Lewycky // As an optimization, there is no need to emit an entry in the directory 3076c1a703e5418b2ba9d7b47b0c9345e9928ea5a68Nick Lewycky // table for the same directory as DW_at_comp_dir. 3086c1a703e5418b2ba9d7b47b0c9345e9928ea5a68Nick Lewycky StringRef CompilationDir; 3096c1a703e5418b2ba9d7b47b0c9345e9928ea5a68Nick Lewycky 310e62dfcf4b3fcf5397737713b222ab1655df10e03Devang Patelprivate: 3110310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3122c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// assignAbbrevNumber - Define a unique number for the abbreviation. 3130310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3142c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void assignAbbrevNumber(DIEAbbrev &Abbrev); 3150310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 316bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel void addScopeVariable(LexicalScope *LS, DbgVariable *Var); 31753bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel 31853bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel /// findAbstractVariable - Find abstract variable associated with Var. 31926c1e56f13b08ce3233b8f2e1c3e208af7b1ad1fDevang Patel DbgVariable *findAbstractVariable(DIVariable &Var, DebugLoc Loc); 32053bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel 3212c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// updateSubprogramScopeDIE - Find DIE for the given subprogram and 3222c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes. 3232c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// If there are global variables in this scope then create and insert 3242c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// DIEs for these variables. 325d30243402bf5db25e8b947bd3de2677d0f6c9637Devang Patel DIE *updateSubprogramScopeDIE(CompileUnit *SPCU, const MDNode *SPNode); 3260310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3272c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// constructLexicalScope - Construct new DW_TAG_lexical_block 3282c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels. 329d30243402bf5db25e8b947bd3de2677d0f6c9637Devang Patel DIE *constructLexicalScopeDIE(CompileUnit *TheCU, LexicalScope *Scope); 3302c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel 3312c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// constructInlinedScopeDIE - This scope represents inlined body of 3322c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// a function. Construct DIE to represent this concrete inlined copy 3332c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// of the function. 334d30243402bf5db25e8b947bd3de2677d0f6c9637Devang Patel DIE *constructInlinedScopeDIE(CompileUnit *TheCU, LexicalScope *Scope); 3350310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3362c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// constructVariableDIE - Construct a DIE for the given DbgVariable. 337bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel DIE *constructVariableDIE(DbgVariable *DV, LexicalScope *S); 3382c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel 3392c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// constructScopeDIE - Construct a DIE for this scope. 340d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel DIE *constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope); 3412c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel 342fa070b01753e2d547539dca4e9d55459c652dc9cChris Lattner /// EmitSectionLabels - Emit initial Dwarf sections with a label at 343fa070b01753e2d547539dca4e9d55459c652dc9cChris Lattner /// the start of each one. 344fa070b01753e2d547539dca4e9d55459c652dc9cChris Lattner void EmitSectionLabels(); 3450310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 346024170f859112518adb5796060607574bf1e6015Nick Lewycky /// emitDIE - Recursively Emits a debug information entry. 3470310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3482c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void emitDIE(DIE *Die); 3490310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3502c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// computeSizeAndOffset - Compute the size and offset of a DIE. 3510310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3522c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel unsigned computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last); 3530310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3542c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// computeSizeAndOffsets - Compute the size and offset of all the DIEs. 3550310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3562c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void computeSizeAndOffsets(); 3570310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3588a24114b169376901a0b9e804a5aa7eb4416a985Devang Patel /// EmitDebugInfo - Emit the debug info section. 3590310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3602c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void emitDebugInfo(); 3610310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3622c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// emitAbbreviations - Emit the abbreviation section. 3630310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3642c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void emitAbbreviations() const; 3650310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3662c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// emitEndOfLineMatrix - Emit the last address of the section and the end of 3670310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// the line matrix. 3680310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3692c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void emitEndOfLineMatrix(unsigned SectionEnd); 3700310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 37109ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher /// emitAccelNames - Emit visible names into a hashed accelerator table 37209ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher /// section. 37309ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher void emitAccelNames(); 37409ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher 37509ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher /// emitAccelObjC - Emit objective C classes and categories into a hashed 37609ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher /// accelerator table section. 37709ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher void emitAccelObjC(); 37809ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher 37909ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher /// emitAccelNamespace - Emit namespace dies into a hashed accelerator 38009ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher /// table. 38109ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher void emitAccelNamespaces(); 38209ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher 38309ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher /// emitAccelTypes() - Emit type dies into a hashed accelerator table. 384dfa30e1ab243990eda4732a6dffb91e965e7a755Eric Christopher /// 38509ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher void emitAccelTypes(); 38609ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher 387193f720f118f52eb05de172d936a440f335c1469Devang Patel /// emitDebugPubTypes - Emit visible types into a debug pubtypes section. 388193f720f118f52eb05de172d936a440f335c1469Devang Patel /// 389193f720f118f52eb05de172d936a440f335c1469Devang Patel void emitDebugPubTypes(); 390193f720f118f52eb05de172d936a440f335c1469Devang Patel 3912c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// emitDebugStr - Emit visible names into a debug str section. 3920310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3932c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void emitDebugStr(); 3940310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3952c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// emitDebugLoc - Emit visible names into a debug loc section. 3960310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3972c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void emitDebugLoc(); 3980310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 3990310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// EmitDebugARanges - Emit visible names into a debug aranges section. 4000310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 4010310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling void EmitDebugARanges(); 4020310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 4032c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// emitDebugRanges - Emit visible names into a debug ranges section. 4040310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 4052c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void emitDebugRanges(); 4060310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 4072c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// emitDebugMacInfo - Emit visible names into a debug macinfo section. 4080310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 4092c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void emitDebugMacInfo(); 4100310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 4112c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel /// emitDebugInlineInfo - Emit inline info using following format. 4120310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// Section Header: 4130310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 1. length of section 4140310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 2. Dwarf version number 4150310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3. address size. 4160310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 4170310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// Entries (one "entry" for each function that was inlined): 4180310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 4190310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 1. offset into __debug_str section for MIPS linkage name, if exists; 4200310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// otherwise offset into __debug_str for regular function name. 4210310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 2. offset into __debug_str section for regular function name. 4220310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 3. an unsigned LEB128 number indicating the number of distinct inlining 4230310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// instances for the function. 4240310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// 425024170f859112518adb5796060607574bf1e6015Nick Lewycky /// The rest of the entry consists of a {die_offset, low_pc} pair for each 4260310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling /// inlined instance; the die_offset points to the inlined_subroutine die in 427024170f859112518adb5796060607574bf1e6015Nick Lewycky /// the __debug_info section, and the low_pc is the starting address for the 428024170f859112518adb5796060607574bf1e6015Nick Lewycky /// inlining instance. 4292c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel void emitDebugInlineInfo(); 430f0fb987903d0885e7da456e3d6f4a094efaccdc2Bill Wendling 431163a9f7c5f545414506364a94689e22d59533fe6Devang Patel /// constructCompileUnit - Create new CompileUnit for the given 432163a9f7c5f545414506364a94689e22d59533fe6Devang Patel /// metadata node with tag DW_TAG_compile_unit. 43394c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel CompileUnit *constructCompileUnit(const MDNode *N); 434163a9f7c5f545414506364a94689e22d59533fe6Devang Patel 435163a9f7c5f545414506364a94689e22d59533fe6Devang Patel /// construct SubprogramDIE - Construct subprogram DIE. 4363655a21b15e135927826eeb1917b42299ac95d67Devang Patel void constructSubprogramDIE(CompileUnit *TheCU, const MDNode *N); 437f0fb987903d0885e7da456e3d6f4a094efaccdc2Bill Wendling 438c608784dc8a668abbb96e7a471e6341c1fda669fChris Lattner /// recordSourceLine - Register a source line with debug info. Returns the 439c608784dc8a668abbb96e7a471e6341c1fda669fChris Lattner /// unique label that was emitted and which provides correspondence to 440c608784dc8a668abbb96e7a471e6341c1fda669fChris Lattner /// the source line list. 4414243e67bd5eeae930060824d4290f8071a66e28fDevang Patel void recordSourceLine(unsigned Line, unsigned Col, const MDNode *Scope, 4424243e67bd5eeae930060824d4290f8071a66e28fDevang Patel unsigned Flags); 4432b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner 444024170f859112518adb5796060607574bf1e6015Nick Lewycky /// identifyScopeMarkers() - Indentify instructions that are marking the 445024170f859112518adb5796060607574bf1e6015Nick Lewycky /// beginning of or ending of a scope. 446e37b0c6c25262b6c9ef4f1595b18e77f299b5035Devang Patel void identifyScopeMarkers(); 4476122a4d1c0c73c1d2d5754c50c68d1dc4ae6f70fDevang Patel 4480478c15d1ecdbc53cf106419629479bcb2a0f4afDevang Patel /// addCurrentFnArgument - If Var is an current function argument that add 4490478c15d1ecdbc53cf106419629479bcb2a0f4afDevang Patel /// it in CurrentFnArguments list. 4500478c15d1ecdbc53cf106419629479bcb2a0f4afDevang Patel bool addCurrentFnArgument(const MachineFunction *MF, 451bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel DbgVariable *Var, LexicalScope *Scope); 4520478c15d1ecdbc53cf106419629479bcb2a0f4afDevang Patel 453bf47fdb91c3bc7c26fb7eb6096ca3657c69bd26fDevang Patel /// collectVariableInfo - Populate LexicalScope entries with variables' info. 45478e127d81b58de8663f8328dc1cdbd1f31a759fdDevang Patel void collectVariableInfo(const MachineFunction *, 45578e127d81b58de8663f8328dc1cdbd1f31a759fdDevang Patel SmallPtrSet<const MDNode *, 16> &ProcessedVars); 4562b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner 457ee43286ca9b6ae68d3419e23e51925cd1a6808aaDevang Patel /// collectVariableInfoFromMMITable - Collect variable information from 458ee43286ca9b6ae68d3419e23e51925cd1a6808aaDevang Patel /// side table maintained by MMI. 459ee43286ca9b6ae68d3419e23e51925cd1a6808aaDevang Patel void collectVariableInfoFromMMITable(const MachineFunction * MF, 460ee43286ca9b6ae68d3419e23e51925cd1a6808aaDevang Patel SmallPtrSet<const MDNode *, 16> &P); 461adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen 462adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen /// requestLabelBeforeInsn - Ensure that a label will be emitted before MI. 463adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen void requestLabelBeforeInsn(const MachineInstr *MI) { 464adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen LabelsBeforeInsn.insert(std::make_pair(MI, (MCSymbol*)0)); 465adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen } 466adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen 467adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen /// getLabelBeforeInsn - Return Label preceding the instruction. 468adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen const MCSymbol *getLabelBeforeInsn(const MachineInstr *MI); 469adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen 470adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen /// requestLabelAfterInsn - Ensure that a label will be emitted after MI. 471adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen void requestLabelAfterInsn(const MachineInstr *MI) { 472adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen LabelsAfterInsn.insert(std::make_pair(MI, (MCSymbol*)0)); 473adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen } 474adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen 475adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen /// getLabelAfterInsn - Return Label immediately following the instruction. 476adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen const MCSymbol *getLabelAfterInsn(const MachineInstr *MI); 477adb877d62e5ac88db037d91bcd2e9f7dc2c4cd7aJakob Stoklund Olesen 4782b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattnerpublic: 4792b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner //===--------------------------------------------------------------------===// 4802b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner // Main entry points. 4812b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner // 4822b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner DwarfDebug(AsmPrinter *A, Module *M); 4832b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner ~DwarfDebug(); 4842b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner 48502e603f87a9745768a05411e16c47c558d2cbd6eDevang Patel /// collectInfoFromNamedMDNodes - Collect debug info from named mdnodes such 48602e603f87a9745768a05411e16c47c558d2cbd6eDevang Patel /// as llvm.dbg.enum and llvm.dbg.ty 48702e603f87a9745768a05411e16c47c558d2cbd6eDevang Patel void collectInfoFromNamedMDNodes(Module *M); 48802e603f87a9745768a05411e16c47c558d2cbd6eDevang Patel 48902e603f87a9745768a05411e16c47c558d2cbd6eDevang Patel /// collectLegacyDebugInfo - Collect debug info using DebugInfoFinder. 490024170f859112518adb5796060607574bf1e6015Nick Lewycky /// FIXME - Remove this when DragonEgg switches to DIBuilder. 49102e603f87a9745768a05411e16c47c558d2cbd6eDevang Patel bool collectLegacyDebugInfo(Module *M); 49202e603f87a9745768a05411e16c47c558d2cbd6eDevang Patel 4932b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner /// beginModule - Emit all Dwarf sections that should come prior to the 4942b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner /// content. 4952b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner void beginModule(Module *M); 4962b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner 4972b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner /// endModule - Emit all Dwarf sections that should come after the content. 4982b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner /// 4992b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner void endModule(); 5002b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner 5012b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner /// beginFunction - Gather pre-function debug information. Assumes being 5022b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner /// emitted immediately after the function entry point. 5032b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner void beginFunction(const MachineFunction *MF); 5042b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner 5052b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner /// endFunction - Gather and emit post-function debug information. 5062b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner /// 5072b1b3312e043858e89b0b1eddc2f839bef892c8dChris Lattner void endFunction(const MachineFunction *MF); 5080310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 509cbbe287f8adc82a90827f036e048bb53d1573fedDevang Patel /// beginInstruction - Process beginning of an instruction. 510cbbe287f8adc82a90827f036e048bb53d1573fedDevang Patel void beginInstruction(const MachineInstr *MI); 51153bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel 512cbbe287f8adc82a90827f036e048bb53d1573fedDevang Patel /// endInstruction - Prcess end of an instruction. 513cbbe287f8adc82a90827f036e048bb53d1573fedDevang Patel void endInstruction(const MachineInstr *MI); 5143cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 5153cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// GetOrCreateSourceID - Look up the source id with the given directory and 5163cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// source file names. If none currently exists, create a new id and insert it 5173cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// in the SourceIds map. 5183cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel unsigned GetOrCreateSourceID(StringRef DirName, StringRef FullName); 5193cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 5203cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// createSubprogramDIE - Create new DIE using SP. 5213cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIE *createSubprogramDIE(DISubprogram SP); 522390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky 523390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky /// getStringPool - returns the entry into the start of the pool. 524390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky MCSymbol *getStringPool(); 525390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky 526390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky /// getStringPoolEntry - returns an entry into the string pool with the given 527390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky /// string text. 528390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky MCSymbol *getStringPoolEntry(StringRef Str); 52953bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel}; 5300310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling} // End of namespace llvm 5310310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling 5320310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling#endif 533