Index: include/polly/ScopDetectionDiagnostic.h =================================================================== --- include/polly/ScopDetectionDiagnostic.h +++ include/polly/ScopDetectionDiagnostic.h @@ -44,15 +44,6 @@ 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. /// Index: include/polly/Support/ScopLocation.h =================================================================== --- /dev/null +++ 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 + +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 Index: lib/Analysis/ScopDetection.cpp =================================================================== --- lib/Analysis/ScopDetection.cpp +++ 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" Index: lib/Analysis/ScopDetectionDiagnostic.cpp =================================================================== --- lib/Analysis/ScopDetectionDiagnostic.cpp +++ 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 @@ 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(DL.getScope()); - - if (FileName.empty()) - FileName = Scope->getFilename(); - - unsigned NewLine = DL.getLine(); - - LineBegin = std::min(LineBegin, NewLine); - LineEnd = std::max(LineEnd, NewLine); - } -} } namespace llvm { Index: lib/Analysis/ScopGraphPrinter.cpp =================================================================== --- lib/Analysis/ScopGraphPrinter.cpp +++ 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 @@ raw_ostream &O, unsigned depth = 0) { O.indent(2 * depth) << "subgraph cluster_" << static_cast(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"; Index: lib/CMakeLists.txt =================================================================== --- lib/CMakeLists.txt +++ lib/CMakeLists.txt @@ -120,6 +120,7 @@ Support/SCEVValidator.cpp Support/RegisterPasses.cpp Support/ScopHelper.cpp + Support/ScopLocation.cpp ${POLLY_JSON_FILES} Transform/Canonicalization.cpp Transform/CodePreparation.cpp Index: lib/Exchange/JSONExporter.cpp =================================================================== --- lib/Exchange/JSONExporter.cpp +++ 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 @@ 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) { Index: lib/Makefile =================================================================== --- lib/Makefile +++ lib/Makefile @@ -116,6 +116,7 @@ Support/SCEVValidator.cpp \ Support/RegisterPasses.cpp \ Support/ScopHelper.cpp \ + Support/ScopLocation.cpp \ Analysis/DependenceInfo.cpp \ Analysis/ScopDetection.cpp \ Analysis/ScopDetectionDiagnostic.cpp \ Index: lib/Support/ScopLocation.cpp =================================================================== --- /dev/null +++ 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(DL.getScope()); + + if (FileName.empty()) + FileName = Scope->getFilename(); + + unsigned NewLine = DL.getLine(); + + LineBegin = std::min(LineBegin, NewLine); + LineEnd = std::max(LineEnd, NewLine); + } +} +}