Browse Source

Add support to dndxc for debug line lookup, restore CFG printer passes. (#130)

Marcelo Lopez Ruiz 8 years ago
parent
commit
057c354b8b

+ 2 - 0
include/llvm/Analysis/CFGPrinter.h

@@ -122,9 +122,11 @@ struct DOTGraphTraits<const Function*> : public DefaultDOTGraphTraits {
 } // End llvm namespace
 
 namespace llvm {
+  class PassRegistry; // HLSL Change
   class FunctionPass;
   FunctionPass *createCFGPrinterPass ();
   FunctionPass *createCFGOnlyPrinterPass ();
+  void initializeCFGPrinterPasses(PassRegistry &Registry); // HLSL Change
 } // End llvm namespace
 
 #endif

+ 12 - 4
lib/Analysis/CFGPrinter.cpp

@@ -26,7 +26,7 @@ namespace {
   struct CFGViewer : public FunctionPass {
     static char ID; // Pass identifcation, replacement for typeid
     CFGViewer() : FunctionPass(ID) {
-      initializeCFGOnlyViewerPass(*PassRegistry::getPassRegistry());
+      // initializeCFGOnlyViewerPass(*PassRegistry::getPassRegistry()); // HLSL Change - initialize up front
     }
 
     bool runOnFunction(Function &F) override {
@@ -56,7 +56,7 @@ namespace {
   struct CFGOnlyViewer : public FunctionPass {
     static char ID; // Pass identifcation, replacement for typeid
     CFGOnlyViewer() : FunctionPass(ID) {
-      initializeCFGOnlyViewerPass(*PassRegistry::getPassRegistry());
+      // initializeCFGOnlyViewerPass(*PassRegistry::getPassRegistry()); // HLSL Change - initialize up front
     }
 
     bool runOnFunction(Function &F) override {
@@ -87,7 +87,7 @@ namespace {
   struct CFGPrinter : public FunctionPass {
     static char ID; // Pass identification, replacement for typeid
     CFGPrinter() : FunctionPass(ID) {
-      initializeCFGPrinterPass(*PassRegistry::getPassRegistry());
+      // initializeCFGPrinterPass(*PassRegistry::getPassRegistry()); // HLSL Change - initialize up front
     }
 
     bool runOnFunction(Function &F) override {
@@ -129,7 +129,7 @@ namespace {
   struct CFGOnlyPrinter : public FunctionPass {
     static char ID; // Pass identification, replacement for typeid
     CFGOnlyPrinter() : FunctionPass(ID) {
-      initializeCFGOnlyPrinterPass(*PassRegistry::getPassRegistry());
+      // initializeCFGOnlyPrinterPass(*PassRegistry::getPassRegistry()); // HLSL Change - initialize up front
     }
 
     bool runOnFunction(Function &F) override {
@@ -192,3 +192,11 @@ FunctionPass *llvm::createCFGOnlyPrinterPass () {
   return new CFGOnlyPrinter();
 }
 
+// HLSL Change Starts
+void llvm::initializeCFGPrinterPasses(PassRegistry &Registry) {
+  initializeCFGPrinterPass(Registry);
+  initializeCFGOnlyPrinterPass(Registry);
+  initializeCFGViewerPass(Registry);
+  initializeCFGOnlyViewerPass(Registry);
+}
+// HLSL Change Ends

+ 3 - 0
lib/HLSL/DxcOptimizer.cpp

@@ -31,6 +31,7 @@
 #include "llvm/IR/IRPrintingPasses.h"
 #include "llvm/IR/LegacyPassManager.h"
 #include "llvm/IR/Verifier.h"
+#include "llvm/Analysis/CFGPrinter.h"
 #include "llvm/Transforms/IPO/PassManagerBuilder.h"
 
 #include <algorithm>
@@ -130,6 +131,8 @@ HRESULT SetupRegistryPassForHLSL() {
     initializeTypeBasedAliasAnalysisPass(Registry);
     initializeVerifierLegacyPassPass(Registry);
     // INIT-PASSES:END
+    // Not schematized - exclusively for compiler authors.
+    initializeCFGPrinterPasses(Registry);
   }
   CATCH_CPP_RETURN_HRESULT();
   return S_OK;

+ 79 - 2
tools/clang/tools/dotnetc/EditorForm.cs

@@ -15,6 +15,7 @@ using System.Diagnostics;
 using System.Drawing;
 using System.Linq;
 using System.Text;
+using System.Text.RegularExpressions;
 using System.Windows.Forms;
 
 namespace MainNs
@@ -400,6 +401,7 @@ namespace MainNs
         {
             this.DisassemblyTextBox.Font = this.CodeBox.Font;
             this.ASTDumpBox.Font = this.CodeBox.Font;
+            SelectionHighlightData.ClearAnyFromRtb(this.CodeBox);
 
             var library = this.Library;
 
@@ -1073,6 +1075,65 @@ namespace MainNs
             font.BackColor = ColorToCOLORREF(color);
         }
 
+        private void HandleDebugMetadata(string dbgLine)
+        {
+            Regex lineRE = new Regex(@"line: (\d+)");
+            Match lineMatch = lineRE.Match(dbgLine);
+            if (!lineMatch.Success)
+            {
+                return;
+            }
+
+            int lineVal = Int32.Parse(lineMatch.Groups[1].Value) - 1;
+            int targetStart = this.CodeBox.GetFirstCharIndexFromLine(lineVal);
+            int targetEnd = this.CodeBox.GetFirstCharIndexFromLine(lineVal + 1);
+            var highlights = SelectionHighlightData.FromRtb(CodeBox);
+            highlights.ClearFromRtb(CodeBox);
+            highlights.Add(targetStart, targetEnd - targetStart);
+            highlights.ApplyToRtb(CodeBox, Color.Yellow);
+        }
+
+        private void HandleDebugTokenOnDisassemblyLine(RichTextBox rtb)
+        {
+            // Get the line.
+            string[] lines = rtb.Lines;
+            string line = lines[rtb.GetLineFromCharIndex(rtb.SelectionStart)];
+            Regex re = new Regex(@"!dbg !(\d+)");
+            Match m = re.Match(line);
+            if (!m.Success)
+            {
+                return;
+            }
+
+            string val = m.Groups[1].Value;
+            int dbgMetadata = Int32.Parse(val);
+            for (int dbgLineIndex = lines.Length - 1; dbgLineIndex >= 0;)
+            {
+                string dbgLine = lines[dbgLineIndex];
+                if (dbgLine.StartsWith("!"))
+                {
+                    int dbgIdx = Int32.Parse(dbgLine.Substring(1, dbgLine.IndexOf(' ') - 1));
+                    if (dbgIdx == dbgMetadata)
+                    {
+                        HandleDebugMetadata(dbgLine);
+                        return;
+                    }
+                    else if (dbgIdx < dbgMetadata)
+                    {
+                        return;
+                    }
+                    else
+                    {
+                        dbgLineIndex -= (dbgIdx - dbgMetadata);
+                    }
+                }
+                else
+                {
+                    --dbgLineIndex;
+                }
+            }
+        }
+
         private void DisassemblyTextBox_SelectionChanged(object sender, EventArgs e)
         {
             // We use [) ranges for selection
@@ -1081,10 +1142,17 @@ namespace MainNs
             SelectionExpandResult expand = SelectionExpandResult.Expand(rtb);
             if (expand.IsEmpty)
                 return;
-            if (data.SelectedToken == expand.Token)
+
+            string token = expand.Token;
+
+            if (token == "dbg")
+            {
+                HandleDebugTokenOnDisassemblyLine(rtb);
+            }
+
+            if (data.SelectedToken == token)
                 return;
             string text = expand.Text;
-            string token = expand.Token;
 
             // OK, time to do work.
             using (new RichTextBoxEditAction(rtb))
@@ -1287,6 +1355,7 @@ namespace MainNs
                 });
             rtb.SelectionChanged += DisassemblyTextBox_SelectionChanged;
             form.Controls.Add(rtb);
+            form.StartPosition = FormStartPosition.CenterParent;
             form.Show(this);
         }
 
@@ -1636,6 +1705,13 @@ namespace MainNs
                 return result;
             }
 
+            public static void ClearAnyFromRtb(RichTextBox rtb)
+            {
+                SelectionHighlightData data = (SelectionHighlightData)rtb.Tag;
+                if (data != null)
+                    data.ClearFromRtb(rtb);
+            }
+
             public void Add(int start, int length)
             {
                 this.StartLengthHighlights.Add(new Tuple<int, int>(start, length));
@@ -1809,6 +1885,7 @@ namespace MainNs
             form.Controls.Add(container);
             form.Controls.Add(statusBar);
             binaryView.Bytes = bytes;
+            form.StartPosition = FormStartPosition.CenterParent;
             form.Show(this);
         }