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

This commit is contained in:
Marcelo Lopez Ruiz 2017-03-13 20:53:13 -07:00 коммит произвёл GitHub
Родитель 7a24bac9b5
Коммит 057c354b8b
4 изменённых файлов: 96 добавлений и 6 удалений

Просмотреть файл

@ -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);
}