Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

several fixes #2494

Merged
merged 15 commits into from
Jun 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,13 @@
else()
string(REGEX REPLACE "\n$" "" PACKAGE_VERSION "${GIT_PACKAGE_VERSION}")
message(STATUS "Building souffle version ${PACKAGE_VERSION}")

# SOUFFLE_VERSION only includes the major/minor triplet
string(REGEX REPLACE "-.*$" "" SOUFFLE_VERSION "${PACKAGE_VERSION}")

# If building from a shallow clone where tag is not available.
if (NOT ${SOUFFLE_VERSION} MATCHES "^[0-9.]+$")
message(WARNING "Cannot find a valid tag: cmake project version will be incomplete")

Check warning on line 43 in CMakeLists.txt

View workflow job for this annotation

GitHub Actions / Windows-CMake-MSVC

Cannot find a valid tag: cmake project version will be incomplete
set (SOUFFLE_VERSION "")
endif()
endif()
Expand Down Expand Up @@ -319,7 +319,7 @@

add_custom_target(doxygen
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_CFG}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
COMMENT "Generating API documentation with Doxygen")
endif()

Expand Down Expand Up @@ -391,7 +391,7 @@
endif()

install(
FILES "${CMAKE_SOURCE_DIR}/debian/souffle.bash-completion"
FILES "${PROJECT_SOURCE_DIR}/debian/souffle.bash-completion"
DESTINATION ${BASH_COMPLETION_COMPLETIONSDIR}
RENAME "souffle"
)
Expand All @@ -402,7 +402,7 @@
# --------------------------------------------------
# CPack configuration
# --------------------------------------------------
execute_process(COMMAND bash "${CMAKE_SOURCE_DIR}/sh/check_os.sh"
execute_process(COMMAND bash "${PROJECT_SOURCE_DIR}/sh/check_os.sh"
RESULT_VARIABLE CHECK_OS_RESULT
OUTPUT_VARIABLE CHECK_OS_OUTPUT)

Expand All @@ -414,7 +414,7 @@
SET(CPACK_THREADS 0)

# Make sure changelog, bash-completion and other important files in debian directory also packaged
SET(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_SOURCE_DIR}/debian/changelog" "${CMAKE_SOURCE_DIR}/debian/souffle.bash-completion" "${CMAKE_SOURCE_DIR}/debian/copyright")
SET(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${PROJECT_SOURCE_DIR}/debian/changelog" "${PROJECT_SOURCE_DIR}/debian/souffle.bash-completion" "${PROJECT_SOURCE_DIR}/debian/copyright")

# --------------------------------------------------
# CPack configuration
Expand Down
3 changes: 3 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
set(SOUFFLE_SOURCES
FunctorOps.cpp
Global.cpp
GraphUtils.cpp
MainDriver.cpp
ast/Annotation.cpp
ast/Aggregator.cpp
Expand Down Expand Up @@ -197,6 +198,8 @@ else ()
# OSX compiler doesn't recognise `(void)var;` ideom
set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/parser/scanner.cc PROPERTIES
COMPILE_FLAGS "-Wno-error=unused-parameter")
set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/parser/parser.cc PROPERTIES
COMPILE_FLAGS "-Wno-error=unused-but-set-variable")
endif ()

# --------------------------------------------------
Expand Down
87 changes: 87 additions & 0 deletions src/GraphUtils.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
/*
* Souffle - A Datalog Compiler
* Copyright (c) 2024, The Souffle Developers. All rights reserved
* Licensed under the Universal Permissive License v 1.0 as shown at:
* - https://opensource.org/licenses/UPL
* - <souffle root>/licenses/SOUFFLE-UPL.txt
*/
#include "GraphUtils.h"
#include "souffle/utility/FileUtil.h"

#include <iostream>
#include <string>
#include <vector>

namespace souffle {

std::string toBase64(const std::string& data) {
static const std::vector<char> table = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};
std::string result;
std::string tmp = data;
unsigned int padding = 0;
if (data.size() % 3 == 2) {
padding = 1;
} else if (data.size() % 3 == 1) {
padding = 2;
}

for (unsigned int i = 0; i < padding; i++) {
tmp.push_back(0);
}
for (unsigned int i = 0; i < tmp.size(); i += 3) {
auto c1 = static_cast<unsigned char>(tmp[i]);
auto c2 = static_cast<unsigned char>(tmp[i + 1]);
auto c3 = static_cast<unsigned char>(tmp[i + 2]);
unsigned char index1 = c1 >> 2;
unsigned char index2 = ((c1 & 0x03) << 4) | (c2 >> 4);
unsigned char index3 = ((c2 & 0x0F) << 2) | (c3 >> 6);
unsigned char index4 = c3 & 0x3F;

result.push_back(table[index1]);
result.push_back(table[index2]);
result.push_back(table[index3]);
result.push_back(table[index4]);
}
if (padding == 1) {
result[result.size() - 1] = '=';
} else if (padding == 2) {
result[result.size() - 1] = '=';
result[result.size() - 2] = '=';
}
return result;
}

std::string convertDotToSVG(const std::string& dotSpec) {
// Check if dot is present
std::string cmd = which("dot");
if (!isExecutable(cmd)) {
return "";
}

if (dotSpec.size() > 50000) {
std::cerr << "skip graph with DOT spec length: " << dotSpec.size() << "\n";
return "";
}

TempFileStream dotFile;
dotFile << dotSpec;
dotFile.flush();
return execStdOut("dot -Tsvg < " + dotFile.getFileName()).str();
}

void printHTMLGraph(std::ostream& out, const std::string& dotSpec, const std::string& id) {
std::string data = convertDotToSVG(dotSpec);

if (data.find("<svg") != std::string::npos) {
out << "<img alt='graph image' src='data:image/svg+xml;base64," << toBase64(data) << "'><br/>\n";
} else {
out << "<div class='" << id << "-source"
<< "'>\n<pre>" << dotSpec << "</pre>\n";
out << "</div>\n";
}
}

} // namespace souffle
76 changes: 3 additions & 73 deletions src/GraphUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,84 +13,14 @@
* A simple utility graph for conducting simple, graph-based operations.
*
***********************************************************************/

#pragma once

#include "souffle/datastructure/Graph.h"
#include "souffle/utility/FileUtil.h"
#include <functional>
#include <map>
#include <ostream>
#include <set>
#include <string>
#include <utility>
#include <vector>

namespace souffle {

inline std::string toBase64(const std::string& data) {
static const std::vector<char> table = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};
std::string result;
std::string tmp = data;
unsigned int padding = 0;
if (data.size() % 3 == 2) {
padding = 1;
} else if (data.size() % 3 == 1) {
padding = 2;
}

for (unsigned int i = 0; i < padding; i++) {
tmp.push_back(0);
}
for (unsigned int i = 0; i < tmp.size(); i += 3) {
auto c1 = static_cast<unsigned char>(tmp[i]);
auto c2 = static_cast<unsigned char>(tmp[i + 1]);
auto c3 = static_cast<unsigned char>(tmp[i + 2]);
unsigned char index1 = c1 >> 2;
unsigned char index2 = ((c1 & 0x03) << 4) | (c2 >> 4);
unsigned char index3 = ((c2 & 0x0F) << 2) | (c3 >> 6);
unsigned char index4 = c3 & 0x3F;

result.push_back(table[index1]);
result.push_back(table[index2]);
result.push_back(table[index3]);
result.push_back(table[index4]);
}
if (padding == 1) {
result[result.size() - 1] = '=';
} else if (padding == 2) {
result[result.size() - 1] = '=';
result[result.size() - 2] = '=';
}
return result;
}

inline std::string convertDotToSVG(const std::string& dotSpec) {
// Check if dot is present
std::string cmd = which("dot");
if (!isExecutable(cmd)) {
return "";
}

TempFileStream dotFile;
dotFile << dotSpec;
dotFile.flush();
return execStdOut("dot -Tsvg < " + dotFile.getFileName()).str();
}

inline void printHTMLGraph(std::ostream& out, const std::string& dotSpec, const std::string& id) {
std::string data = convertDotToSVG(dotSpec);

if (data.find("<svg") != std::string::npos) {
out << "<img alt='graph image' src='data:image/svg+xml;base64," << toBase64(data) << "'><br/>\n";
} else {
out << "<div class='" << id << "-source"
<< "'>\n<pre>" << dotSpec << "</pre>\n";
out << "</div>\n";
}
}

std::string toBase64(const std::string& data);
std::string convertDotToSVG(const std::string& dotSpec);
void printHTMLGraph(std::ostream& out, const std::string& dotSpec, const std::string& id);
} // end of namespace souffle
2 changes: 2 additions & 0 deletions src/ast/Node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
* - <souffle root>/licenses/SOUFFLE-UPL.txt
*/
#include "ast/Node.h"

#include <algorithm>
#include <utility>

namespace souffle::ast {
Expand Down
4 changes: 3 additions & 1 deletion src/ast/analysis/PrecedenceGraph.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@
#include "GraphUtils.h"
#include "ast/Relation.h"
#include "ast/TranslationUnit.h"
#include <string>
#include "souffle/datastructure/Graph.h"
#include <ostream>
#include <sstream>

namespace souffle::ast {

Expand Down
9 changes: 4 additions & 5 deletions src/ast/analysis/typesystem/Type.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,12 +73,12 @@ Own<Clause> TypeAnalysis::createAnnotatedClause(
Own<Node> operator()(Own<Node> node) const override {
if (auto* var = as<ast::Variable>(node)) {
std::stringstream newVarName;
newVarName << var->getName() << "&isin;" << types.find(var)->second;
newVarName << var->getName() << "" << types.find(var)->second;
return mk<ast::Variable>(newVarName.str());
} else if (auto* var = as<UnnamedVariable>(node)) {
std::stringstream newVarName;
newVarName << "_"
<< "&isin;" << types.find(var)->second;
<< "" << types.find(var)->second;
return mk<ast::Variable>(newVarName.str());
}
node->apply(*this);
Expand Down Expand Up @@ -707,8 +707,7 @@ void TypeAnnotationPrinter::print_(type_identity<UserDefinedFunctor>, const User
auto arguments = fun.getArguments();
os << "@" << fun.getName() << "(";
for (std::size_t i = 0; i < arguments.size(); ++i) {
TypeAttribute argType = typeAnalysis.getFunctorParamTypeAttribute(fun, i);
auto& ty = typeEnv.getConstantType(argType);
const auto& ty = typeAnalysis.getFunctorParamType(fun, i);
branchOnArgument(arguments[i], ty);
if (i + 1 < arguments.size()) {
os << ",";
Expand Down Expand Up @@ -736,7 +735,7 @@ void TypeAnnotationPrinter::print_(type_identity<TypeCast>, const ast::TypeCast&
void TypeAnnotationPrinter::print_(
type_identity<RecordInit>, const RecordInit& record, const RecordType& type) {
auto arguments = record.getArguments();
auto& ftypes = type.getFields();
const auto& ftypes = type.getFields();
os << "[";
for (std::size_t i = 0; i < arguments.size(); ++i) {
branchOnArgument(arguments[i], *ftypes[i]);
Expand Down
2 changes: 1 addition & 1 deletion src/ast/analysis/typesystem/TypeEnvironment.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
***********************************************************************/

#include "ast/analysis/typesystem/TypeEnvironment.h"
#include "GraphUtils.h"
#include "ast/AlgebraicDataType.h"
#include "ast/AliasType.h"
#include "ast/Attribute.h"
Expand All @@ -27,6 +26,7 @@
#include "ast/Type.h"
#include "ast/UnionType.h"
#include "ast/analysis/typesystem/TypeSystem.h"
#include "souffle/datastructure/Graph.h"
#include "souffle/utility/MiscUtil.h"
#include "souffle/utility/tinyformat.h"
#include <algorithm>
Expand Down
2 changes: 2 additions & 0 deletions src/ast/transform/InlineRelations.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,9 @@
#include "ast/UnnamedVariable.h"
#include "ast/UserDefinedFunctor.h"
#include "ast/Variable.h"
#include "ast/analysis/Ground.h"
#include "ast/analysis/typesystem/PolymorphicObjects.h"
#include "ast/analysis/typesystem/TypeEnvironment.h"
#include "ast/utility/Utils.h"
#include "ast/utility/Visitor.h"
#include "souffle/BinaryConstraintOps.h"
Expand Down
2 changes: 1 addition & 1 deletion src/ast/transform/PartitionBodyLiterals.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
***********************************************************************/

#include "ast/transform/PartitionBodyLiterals.h"
#include "GraphUtils.h"
#include "ast/Atom.h"
#include "ast/Clause.h"
#include "ast/Literal.h"
Expand All @@ -23,6 +22,7 @@
#include "ast/TranslationUnit.h"
#include "ast/Variable.h"
#include "ast/utility/Visitor.h"
#include "souffle/datastructure/Graph.h"
#include "souffle/utility/MiscUtil.h"
#include <algorithm>
#include <functional>
Expand Down
2 changes: 1 addition & 1 deletion src/ast/transform/ReduceExistentials.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
***********************************************************************/

#include "ast/transform/ReduceExistentials.h"
#include "GraphUtils.h"
#include "RelationTag.h"
#include "ast/Aggregator.h"
#include "ast/Argument.h"
Expand All @@ -30,6 +29,7 @@
#include "ast/analysis/IOType.h"
#include "ast/utility/Utils.h"
#include "ast/utility/Visitor.h"
#include "souffle/datastructure/Graph.h"
#include "souffle/utility/MiscUtil.h"
#include <functional>
#include <memory>
Expand Down
6 changes: 6 additions & 0 deletions src/include/souffle/RecordTable.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

#include "souffle/RamTypes.h"
#include "souffle/utility/span.h"

#include <functional>
#include <initializer_list>

namespace souffle {
Expand All @@ -35,6 +37,10 @@ class RecordTable {
virtual RamDomain pack(const std::initializer_list<RamDomain>& List) = 0;

virtual const RamDomain* unpack(const RamDomain Ref, const std::size_t Arity) const = 0;

/// Enumerate each record.
virtual void enumerate(const std::function<void(const RamDomain* /*tuple*/, std::size_t /* arity*/,
RamDomain /* key */)>& Callback) const = 0;
};

/** @brief helper to convert tuple to record reference for the synthesiser */
Expand Down
Loading
Loading