diff src/codeview/debuginfo.d @ 1:4a9dcbd9e54f

-files of 0.13 beta -fixes so that it now compiles with the current dmd version
author marton@basel.hu
date Tue, 05 Apr 2011 20:44:01 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/codeview/debuginfo.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,354 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+
+module codeview.debuginfo;
+
+import container;
+import util;
+import codeview.coff;
+import codeview.codeview;
+
+import std.string;
+
+class SourceModule
+{
+    SourceFile[]        files;
+}
+
+class SourceFile
+{
+    SourceModule        source_module;
+    string              name;
+    SourceSegment[]     segments;
+    CodeBlock[][uint]   blocks_by_line;
+    uint[]              lines;
+}
+
+class SourceSegment
+{
+    SourceFile  file;
+    size_t      start,
+                end;
+}
+
+class CodeBlock
+{
+    size_t          start,
+                    end;
+    uint            line;
+    SourceSegment   segment;
+
+    this(size_t s, uint l, SourceSegment seg)
+    {
+        start = s;
+        line = l;
+        segment = seg;
+    }
+
+    /**********************************************************************************************
+        Check if block contains offset
+    **********************************************************************************************/
+    int opCmp(size_t offset)
+    {
+        if ( start > offset )
+            return 1;
+        if ( end <= offset )
+            return -1;
+        return 0;
+    }
+
+    /**********************************************************************************************
+        Compare by start address.
+    **********************************************************************************************/
+    int opCmp(ref CodeBlock cb)
+    {
+        if ( start > cb.start )
+            return 1;
+        if ( start < cb.start )
+            return -1;
+        return 0;
+    }
+
+    string toString()
+    {
+        return format("%s:%d 0x%x-0x%x in 0x%x-0x%x", segment.file.name, line, start, end, segment.start, segment.end);
+    }
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+abstract class DebugInfo
+{
+    SourceModule[]      source_modules;
+    AVLTree!(CodeBlock) codeblocks; /// contains all blocks from all modules
+
+    this()
+    {
+        codeblocks = new AVLTree!(CodeBlock);
+    }
+
+    size_t getCodeBase();
+    
+    void updateCodeblocks()
+    {
+        bool findEnd(AVLNode!(CodeBlock) n)
+        {
+            AVLNode!(CodeBlock) n2;
+            if ( n.findNext(n2) && (n2.value.segment is n.value.segment || n.value.segment.end == n.value.start) )
+                n.value.end = n2.value.start;
+            else
+                n.value.end = n.value.segment.end;
+            return true;
+        }
+        codeblocks.traverseDepthLeft(&findEnd);
+    }
+
+	/**********************************************************************************************
+
+    **********************************************************************************************/
+    CodeBlock findCodeBlockRel(uint address)
+    {
+        CodeBlock cb;
+        if ( !codeblocks.find(address, cb) )
+            return null;
+        return cb;
+    }
+
+    CodeBlock findCodeBlockAbs(uint address)
+    {
+        CodeBlock cb;
+        if ( !codeblocks.find(address-getCodeBase, cb) )
+            return null;
+        return cb;
+    }
+
+	/**********************************************************************************************
+        Find the source files that correspond to the given filepath.
+        That path can be relative to one of the search_paths.
+    **********************************************************************************************/
+	SourceFile[] findSrcFiles(string filepath, string[] search_paths)
+	{
+		string fullpath = getFullPath(filepath);
+		if ( fullpath is null )
+			return null;
+
+        SourceFile[] sfs;
+        foreach ( sm; source_modules )
+        {
+            foreach ( sf; sm.files )
+            {
+                foreach ( sp; search_paths )
+                {
+                    string path = getFullPath(sp~sf.name);
+                    if ( path !is null && icmp(path, fullpath) == 0 )
+                        sfs ~= sf;
+                }
+            }
+        }
+
+		return sfs;
+	}
+
+	/**********************************************************************************************
+        Find source files that contain the given substring in it's path.
+    **********************************************************************************************/
+	SourceFile[] findSrcFiles(string filename_substring)
+	{
+        SourceFile[] sfs;
+        foreach ( sm; source_modules )
+        {
+            foreach ( sf; sm.files )
+            {
+                if ( find(sf.name, filename_substring) >= 0 )
+                    sfs ~= sf;
+            }
+        }
+		return sfs;
+	}
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class ImageSet
+{
+	COFFImage[] images;
+    
+    void opCatAssign(COFFImage image)
+    {
+        images ~= image;
+    }
+
+    void remove(COFFImage image)
+    {
+        foreach ( i, img; images )
+        {
+            if ( img is image )
+            {
+                images = images[0..i]~images[i+1..$];
+                break;
+            }
+        }
+    }
+    
+	Location findLocation(uint vaddress)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto loc = img.codeView.findLocation(vaddress);
+                if ( loc !is null )
+                    return loc;
+            }
+        }
+        return null;
+    }
+
+    CodeBlock findCodeBlockAbs(uint address, out CodeView cv)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto cb = img.codeView.findCodeBlockAbs(address);
+                if ( cb !is null ) {
+                    cv = img.codeView;
+                    return cb;
+                }
+            }
+        }
+        return null;
+    }
+
+    CodeBlock findCodeBlockRel(uint address, out CodeView cv)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto cb = img.codeView.findCodeBlockRel(address);
+                if ( cb !is null ) {
+                    cv = img.codeView;
+                    return cb;
+                }
+            }
+        }
+        return null;
+    }
+
+	Module findModule(uint vaddress, out uint segment)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto mod = img.codeView.findModule(vaddress, segment);
+                if ( mod !is null )
+                    return mod;
+            }
+        }
+        return null;
+    }
+
+	string mangleCVtype(ushort cvtype)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto t = img.codeView.mangleCVtype(cvtype);
+                if ( t !is null )
+                    return t;
+            }
+        }
+        return null;
+    }
+
+	SourceFile[] findSrcFiles(string filename_substring)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto t = img.codeView.findSrcFiles(filename_substring);
+                if ( t !is null )
+                    return t;
+            }
+        }
+        return null;
+    }
+
+  	SourceFile[] findSrcFiles(string filepath, string[] search_paths)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto t = img.codeView.findSrcFiles(filepath, search_paths);
+                if ( t !is null )
+                    return t;
+            }
+        }
+        return null;
+    }
+
+	Location findSrcLine(SourceFile sf, uint min_line, size_t min_start=0)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto t = img.codeView.findSrcLine(sf, min_line, min_start);
+                if ( t !is null )
+                    return t;
+            }
+        }
+        return null;
+    }
+
+	Location findNextSrcLine(Location loc)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto t = img.codeView.findNextSrcLine(loc);
+                if ( t !is null )
+                    return t;
+            }
+        }
+        return null;
+    }
+
+	Location findPrevSrcLine(Location loc)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto t = img.codeView.findPrevSrcLine(loc);
+                if ( t !is null )
+                    return t;
+            }
+        }
+        return null;
+    }
+
+	ProcedureSymbol findProcedureSymbol(uint vaddress)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto t = img.codeView.findProcedureSymbol(vaddress);
+                if ( t !is null )
+                    return t;
+            }
+        }
+        return null;
+    }
+}