Add support to dndxc for debug line lookup, restore CFG printer passes. (#130)
This commit is contained in:
Родитель
7a24bac9b5
Коммит
057c354b8b
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче