Merge branch 'auto-class-deduction' of github.com:exaloop/codon into auto-class-deduction

pull/12/head
Ibrahim Numanagić 2022-02-17 19:03:19 -08:00
commit 6f402ff810
7 changed files with 30 additions and 14 deletions

View File

@ -16,8 +16,16 @@ if(CODON_JUPYTER)
endif() endif()
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden -pedantic -Wno-return-type-c-linkage -Wno-gnu-zero-variadic-macro-arguments") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS_DEBUG "-g -fno-limit-debug-info") if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -fvisibility-inlines-hidden -Wno-return-type-c-linkage -Wno-gnu-zero-variadic-macro-arguments")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-return-type")
endif()
set(CMAKE_CXX_FLAGS_DEBUG "-g")
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-limit-debug-info")
endif()
set(CMAKE_CXX_FLAGS_RELEASE "-O3") set(CMAKE_CXX_FLAGS_RELEASE "-O3")
include_directories(.) include_directories(.)

View File

@ -84,10 +84,11 @@ std::unique_ptr<codon::Compiler> processSource(const std::vector<const char *> &
bool standalone) { bool standalone) {
llvm::cl::opt<std::string> input(llvm::cl::Positional, llvm::cl::desc("<input file>"), llvm::cl::opt<std::string> input(llvm::cl::Positional, llvm::cl::desc("<input file>"),
llvm::cl::init("-")); llvm::cl::init("-"));
auto regs = llvm::cl::getRegisteredOptions();
llvm::cl::opt<OptMode> optMode( llvm::cl::opt<OptMode> optMode(
llvm::cl::desc("optimization mode"), llvm::cl::desc("optimization mode"),
llvm::cl::values( llvm::cl::values(
clEnumValN(Debug, "debug", clEnumValN(Debug, regs.find("debug") != regs.end() ? "default" : "debug",
"Turn off compiler optimizations and show backtraces"), "Turn off compiler optimizations and show backtraces"),
clEnumValN(Release, "release", clEnumValN(Release, "release",
"Turn on compiler optimizations and disable debug info")), "Turn on compiler optimizations and disable debug info")),

View File

@ -500,9 +500,9 @@ void SimplifyVisitor::visit(CallExpr *expr) {
ctx->add(SimplifyItem::Var, varName, varName); ctx->add(SimplifyItem::Var, varName, varName);
var = N<IdExpr>(varName); var = N<IdExpr>(varName);
ctx->addBlock(); // prevent tmp vars from being toplevel vars ctx->addBlock(); // prevent tmp vars from being toplevel vars
ex = N<StmtExpr>( auto head =
transform(N<AssignStmt>(clone(g->loops[0].vars), clone(var), nullptr, true)), transform(N<AssignStmt>(clone(g->loops[0].vars), clone(var), nullptr, true));
transform(ex)); ex = N<StmtExpr>(head, transform(ex));
ctx->popBlock(); ctx->popBlock();
} }
std::vector<GeneratorBody> body; std::vector<GeneratorBody> body;

View File

@ -180,7 +180,9 @@ void SimplifyVisitor::visit(WhileStmt *stmt) {
transform(N<AssignStmt>(N<IdExpr>(breakVar), N<BoolExpr>(true), nullptr, true)); transform(N<AssignStmt>(N<IdExpr>(breakVar), N<BoolExpr>(true), nullptr, true));
} }
ctx->loops.push_back(breakVar); // needed for transforming break in loop..else blocks ctx->loops.push_back(breakVar); // needed for transforming break in loop..else blocks
StmtPtr whileStmt = N<WhileStmt>(transform(cond), transform(stmt->suite));
cond = transform(cond);
StmtPtr whileStmt = N<WhileStmt>(cond, transform(stmt->suite));
ctx->loops.pop_back(); ctx->loops.pop_back();
if (stmt->elseSuite && stmt->elseSuite->firstInBlock()) { if (stmt->elseSuite && stmt->elseSuite->firstInBlock()) {
resultStmt = resultStmt =
@ -232,7 +234,8 @@ void SimplifyVisitor::visit(ForStmt *stmt) {
ctx->addBlock(); ctx->addBlock();
if (auto i = stmt->var->getId()) { if (auto i = stmt->var->getId()) {
ctx->add(SimplifyItem::Var, i->value, ctx->generateCanonicalName(i->value)); ctx->add(SimplifyItem::Var, i->value, ctx->generateCanonicalName(i->value));
forStmt = N<ForStmt>(transform(stmt->var), clone(iter), transform(stmt->suite), auto var = transform(stmt->var);
forStmt = N<ForStmt>(var, clone(iter), transform(stmt->suite),
nullptr, decorator, ompArgs); nullptr, decorator, ompArgs);
} else { } else {
std::string varName = ctx->cache->getTemporaryVar("for"); std::string varName = ctx->cache->getTemporaryVar("for");
@ -259,8 +262,8 @@ void SimplifyVisitor::visit(ForStmt *stmt) {
void SimplifyVisitor::visit(IfStmt *stmt) { void SimplifyVisitor::visit(IfStmt *stmt) {
seqassert(stmt->cond, "invalid if statement"); seqassert(stmt->cond, "invalid if statement");
resultStmt = N<IfStmt>(transform(stmt->cond), transform(stmt->ifSuite), auto cond = transform(stmt->cond);
transform(stmt->elseSuite)); resultStmt = N<IfStmt>(cond, transform(stmt->ifSuite), transform(stmt->elseSuite));
} }
void SimplifyVisitor::visit(MatchStmt *stmt) { void SimplifyVisitor::visit(MatchStmt *stmt) {

View File

@ -91,8 +91,10 @@ void TranslateVisitor::visit(IdExpr *expr) {
} }
void TranslateVisitor::visit(IfExpr *expr) { void TranslateVisitor::visit(IfExpr *expr) {
result = make<ir::TernaryInstr>(expr, transform(expr->cond), transform(expr->ifexpr), auto cond = transform(expr->cond);
transform(expr->elsexpr)); auto ifexpr = transform(expr->ifexpr);
auto elsexpr = transform(expr->elsexpr);
result = make<ir::TernaryInstr>(expr, cond, ifexpr, elsexpr);
} }
void TranslateVisitor::visit(CallExpr *expr) { void TranslateVisitor::visit(CallExpr *expr) {

View File

@ -21,14 +21,14 @@ std::shared_ptr<TranslateItem> TranslateContext::find(const std::string &name) c
return t; return t;
std::shared_ptr<TranslateItem> ret = nullptr; std::shared_ptr<TranslateItem> ret = nullptr;
auto tt = cache->typeCtx->find(name); auto tt = cache->typeCtx->find(name);
if (tt->isType() && tt->type->canRealize()) { if (tt && tt->isType() && tt->type->canRealize()) {
ret = std::make_shared<TranslateItem>(TranslateItem::Type, bases[0]); ret = std::make_shared<TranslateItem>(TranslateItem::Type, bases[0]);
seqassert(in(cache->classes, tt->type->getClass()->name) && seqassert(in(cache->classes, tt->type->getClass()->name) &&
in(cache->classes[tt->type->getClass()->name].realizations, name), in(cache->classes[tt->type->getClass()->name].realizations, name),
"cannot find type realization {}", name); "cannot find type realization {}", name);
ret->handle.type = ret->handle.type =
cache->classes[tt->type->getClass()->name].realizations[name]->ir; cache->classes[tt->type->getClass()->name].realizations[name]->ir;
} else if (tt->type->getFunc() && tt->type->canRealize()) { } else if (tt && tt->type->getFunc() && tt->type->canRealize()) {
ret = std::make_shared<TranslateItem>(TranslateItem::Func, bases[0]); ret = std::make_shared<TranslateItem>(TranslateItem::Func, bases[0]);
seqassert( seqassert(
in(cache->functions, tt->type->getFunc()->ast->name) && in(cache->functions, tt->type->getFunc()->ast->name) &&

View File

@ -381,6 +381,8 @@ print log(5.5) #: 1.70475
#%% import_c_dylib,barebones #%% import_c_dylib,barebones
from internal.dlopen import dlext from internal.dlopen import dlext
RT = "./libcodonrt." + dlext() RT = "./libcodonrt." + dlext()
if RT[-3:] == ".so":
RT = "build/" + RT[2:]
from C import RT.seq_str_int(int) -> str as sp from C import RT.seq_str_int(int) -> str as sp
print sp(65) #: 65 print sp(65) #: 65