summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--polly/include/polly/ScopDetectionDiagnostic.h9
-rw-r--r--polly/include/polly/Support/ScopLocation.h35
-rw-r--r--polly/lib/Analysis/ScopDetection.cpp1
-rw-r--r--polly/lib/Analysis/ScopDetectionDiagnostic.cpp24
-rw-r--r--polly/lib/Analysis/ScopGraphPrinter.cpp15
-rw-r--r--polly/lib/CMakeLists.txt1
-rw-r--r--polly/lib/Exchange/JSONExporter.cpp11
-rw-r--r--polly/lib/Makefile1
-rw-r--r--polly/lib/Support/ScopLocation.cpp47
9 files changed, 111 insertions, 33 deletions
diff --git a/polly/include/polly/ScopDetectionDiagnostic.h b/polly/include/polly/ScopDetectionDiagnostic.h
index b62185974d8..9acb0446ec5 100644
--- a/polly/include/polly/ScopDetectionDiagnostic.h
+++ b/polly/include/polly/ScopDetectionDiagnostic.h
@@ -44,15 +44,6 @@ class Region;
namespace polly {
-/// @brief Get the location of a region from the debug info.
-///
-/// @param R The region to get debug info for.
-/// @param LineBegin The first line in the region.
-/// @param LineEnd The last line in the region.
-/// @param FileName The filename where the region was defined.
-void getDebugLocation(const Region *R, unsigned &LineBegin, unsigned &LineEnd,
- std::string &FileName);
-
class RejectLog;
/// @brief Emit optimization remarks about the rejected regions to the user.
///
diff --git a/polly/include/polly/Support/ScopLocation.h b/polly/include/polly/Support/ScopLocation.h
new file mode 100644
index 00000000000..83dc58e92ed
--- /dev/null
+++ b/polly/include/polly/Support/ScopLocation.h
@@ -0,0 +1,35 @@
+//=== ScopLocation.h -- Debug location helper for ScopDetection -*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Helper function for extracting region debug information.
+//
+//===----------------------------------------------------------------------===//
+//
+#ifndef POLLY_SCOP_LOCATION_H
+#define POLLY_SCOP_LOCATION_H
+
+#include <string>
+
+namespace llvm {
+class Region;
+}
+
+namespace polly {
+
+/// @brief Get the location of a region from the debug info.
+///
+/// @param R The region to get debug info for.
+/// @param LineBegin The first line in the region.
+/// @param LineEnd The last line in the region.
+/// @param FileName The filename where the region was defined.
+void getDebugLocation(const llvm::Region *R, unsigned &LineBegin,
+ unsigned &LineEnd, std::string &FileName);
+}
+
+#endif // POLLY_SCOP_LOCATION_H
diff --git a/polly/lib/Analysis/ScopDetection.cpp b/polly/lib/Analysis/ScopDetection.cpp
index a0385a66437..db04f0b0a88 100644
--- a/polly/lib/Analysis/ScopDetection.cpp
+++ b/polly/lib/Analysis/ScopDetection.cpp
@@ -51,6 +51,7 @@
#include "polly/ScopDetection.h"
#include "polly/Support/SCEVValidator.h"
#include "polly/Support/ScopHelper.h"
+#include "polly/Support/ScopLocation.h"
#include "polly/CodeGen/CodeGeneration.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/AliasAnalysis.h"
diff --git a/polly/lib/Analysis/ScopDetectionDiagnostic.cpp b/polly/lib/Analysis/ScopDetectionDiagnostic.cpp
index c7d2b338797..f5b57f0fc83 100644
--- a/polly/lib/Analysis/ScopDetectionDiagnostic.cpp
+++ b/polly/lib/Analysis/ScopDetectionDiagnostic.cpp
@@ -18,6 +18,7 @@
//
//===----------------------------------------------------------------------===//
#include "polly/ScopDetectionDiagnostic.h"
+#include "polly/Support/ScopLocation.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/AliasSetTracker.h"
@@ -60,29 +61,6 @@ template <typename T> std::string operator+(Twine LHS, const T &RHS) {
return LHS.concat(Buf).str();
}
-
-void getDebugLocation(const Region *R, unsigned &LineBegin, unsigned &LineEnd,
- std::string &FileName) {
- LineBegin = -1;
- LineEnd = 0;
-
- for (const BasicBlock *BB : R->blocks())
- for (const Instruction &Inst : *BB) {
- DebugLoc DL = Inst.getDebugLoc();
- if (!DL)
- continue;
-
- auto *Scope = cast<DIScope>(DL.getScope());
-
- if (FileName.empty())
- FileName = Scope->getFilename();
-
- unsigned NewLine = DL.getLine();
-
- LineBegin = std::min(LineBegin, NewLine);
- LineEnd = std::max(LineEnd, NewLine);
- }
-}
}
namespace llvm {
diff --git a/polly/lib/Analysis/ScopGraphPrinter.cpp b/polly/lib/Analysis/ScopGraphPrinter.cpp
index ca1013341c8..f39893ea8a4 100644
--- a/polly/lib/Analysis/ScopGraphPrinter.cpp
+++ b/polly/lib/Analysis/ScopGraphPrinter.cpp
@@ -16,6 +16,7 @@
#include "polly/LinkAllPasses.h"
#include "polly/ScopDetection.h"
+#include "polly/Support/ScopLocation.h"
#include "llvm/Analysis/DOTGraphTraitsPass.h"
#include "llvm/Analysis/RegionInfo.h"
#include "llvm/Analysis/RegionIterator.h"
@@ -112,9 +113,21 @@ struct DOTGraphTraits<ScopDetection *> : public DOTGraphTraits<RegionNode *> {
raw_ostream &O, unsigned depth = 0) {
O.indent(2 * depth) << "subgraph cluster_" << static_cast<const void *>(R)
<< " {\n";
+ unsigned LineBegin, LineEnd;
+ std::string FileName;
+
+ getDebugLocation(R, LineBegin, LineEnd, FileName);
+
+ std::string Location;
+ if (LineBegin != (unsigned)-1) {
+ Location = escapeString(FileName + ":" + std::to_string(LineBegin) + "-" +
+ std::to_string(LineEnd) + "\n");
+ }
+
std::string ErrorMessage = SD->regionIsInvalidBecause(R);
ErrorMessage = escapeString(ErrorMessage);
- O.indent(2 * (depth + 1)) << "label = \"" << ErrorMessage << "\";\n";
+ O.indent(2 * (depth + 1)) << "label = \"" << Location << ErrorMessage
+ << "\";\n";
if (SD->isMaxRegionInScop(*R)) {
O.indent(2 * (depth + 1)) << "style = filled;\n";
diff --git a/polly/lib/CMakeLists.txt b/polly/lib/CMakeLists.txt
index c91dc624cff..7b1c4a593cf 100644
--- a/polly/lib/CMakeLists.txt
+++ b/polly/lib/CMakeLists.txt
@@ -120,6 +120,7 @@ add_polly_library(Polly
Support/SCEVValidator.cpp
Support/RegisterPasses.cpp
Support/ScopHelper.cpp
+ Support/ScopLocation.cpp
${POLLY_JSON_FILES}
Transform/Canonicalization.cpp
Transform/CodePreparation.cpp
diff --git a/polly/lib/Exchange/JSONExporter.cpp b/polly/lib/Exchange/JSONExporter.cpp
index b9dcaadb9a4..3cedb039685 100644
--- a/polly/lib/Exchange/JSONExporter.cpp
+++ b/polly/lib/Exchange/JSONExporter.cpp
@@ -16,6 +16,7 @@
#include "polly/Options.h"
#include "polly/ScopInfo.h"
#include "polly/ScopPass.h"
+#include "polly/Support/ScopLocation.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/RegionInfo.h"
@@ -90,9 +91,19 @@ void JSONExporter::printScop(raw_ostream &OS, Scop &S) const { S.print(OS); }
Json::Value JSONExporter::getJSON(Scop &S) const {
Json::Value root;
+ unsigned LineBegin, LineEnd;
+ std::string FileName;
+
+ getDebugLocation(&S.getRegion(), LineBegin, LineEnd, FileName);
+ std::string Location;
+ if (LineBegin != (unsigned)-1)
+ Location = FileName + ":" + std::to_string(LineBegin) + "-" +
+ std::to_string(LineEnd);
root["name"] = S.getRegion().getNameStr();
root["context"] = S.getContextStr();
+ if (LineBegin != (unsigned)-1)
+ root["location"] = Location;
root["statements"];
for (Scop::iterator SI = S.begin(), SE = S.end(); SI != SE; ++SI) {
diff --git a/polly/lib/Makefile b/polly/lib/Makefile
index 263fa78d561..8e2ff1b4b36 100644
--- a/polly/lib/Makefile
+++ b/polly/lib/Makefile
@@ -116,6 +116,7 @@ SOURCES= Polly.cpp \
Support/SCEVValidator.cpp \
Support/RegisterPasses.cpp \
Support/ScopHelper.cpp \
+ Support/ScopLocation.cpp \
Analysis/DependenceInfo.cpp \
Analysis/ScopDetection.cpp \
Analysis/ScopDetectionDiagnostic.cpp \
diff --git a/polly/lib/Support/ScopLocation.cpp b/polly/lib/Support/ScopLocation.cpp
new file mode 100644
index 00000000000..ebf717dc709
--- /dev/null
+++ b/polly/lib/Support/ScopLocation.cpp
@@ -0,0 +1,47 @@
+//=== ScopLocation.cpp - Debug location for ScopDetection ----- -*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Helper function for extracting region debug information.
+//
+//===----------------------------------------------------------------------===//
+//
+#include "polly/Support/ScopLocation.h"
+
+#include "llvm/IR/BasicBlock.h"
+#include "llvm/IR/DebugInfo.h"
+#include "llvm/IR/DebugLoc.h"
+#include "llvm/Analysis/RegionInfo.h"
+
+using namespace llvm;
+
+namespace polly {
+
+void getDebugLocation(const Region *R, unsigned &LineBegin, unsigned &LineEnd,
+ std::string &FileName) {
+ LineBegin = -1;
+ LineEnd = 0;
+
+ for (const BasicBlock *BB : R->blocks())
+ for (const Instruction &Inst : *BB) {
+ DebugLoc DL = Inst.getDebugLoc();
+ if (!DL)
+ continue;
+
+ auto *Scope = cast<DIScope>(DL.getScope());
+
+ if (FileName.empty())
+ FileName = Scope->getFilename();
+
+ unsigned NewLine = DL.getLine();
+
+ LineBegin = std::min(LineBegin, NewLine);
+ LineEnd = std::max(LineEnd, NewLine);
+ }
+}
+}
OpenPOWER on IntegriCloud