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()
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_DEBUG "-g -fno-limit-debug-info")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
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")
include_directories(.)

View File

@ -84,10 +84,11 @@ std::unique_ptr<codon::Compiler> processSource(const std::vector<const char *> &
bool standalone) {
llvm::cl::opt<std::string> input(llvm::cl::Positional, llvm::cl::desc("<input file>"),
llvm::cl::init("-"));
auto regs = llvm::cl::getRegisteredOptions();
llvm::cl::opt<OptMode> optMode(
llvm::cl::desc("optimization mode"),
llvm::cl::values(
clEnumValN(Debug, "debug",
clEnumValN(Debug, regs.find("debug") != regs.end() ? "default" : "debug",
"Turn off compiler optimizations and show backtraces"),
clEnumValN(Release, "release",
"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);
var = N<IdExpr>(varName);
ctx->addBlock(); // prevent tmp vars from being toplevel vars
ex = N<StmtExpr>(
transform(N<AssignStmt>(clone(g->loops[0].vars), clone(var), nullptr, true)),
transform(ex));
auto head =
transform(N<AssignStmt>(clone(g->loops[0].vars), clone(var), nullptr, true));
ex = N<StmtExpr>(head, transform(ex));
ctx->popBlock();
}
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));
}
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();
if (stmt->elseSuite && stmt->elseSuite->firstInBlock()) {
resultStmt =
@ -232,7 +234,8 @@ void SimplifyVisitor::visit(ForStmt *stmt) {
ctx->addBlock();
if (auto i = stmt->var->getId()) {
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);
} else {
std::string varName = ctx->cache->getTemporaryVar("for");
@ -259,8 +262,8 @@ void SimplifyVisitor::visit(ForStmt *stmt) {
void SimplifyVisitor::visit(IfStmt *stmt) {
seqassert(stmt->cond, "invalid if statement");
resultStmt = N<IfStmt>(transform(stmt->cond), transform(stmt->ifSuite),
transform(stmt->elseSuite));
auto cond = transform(stmt->cond);
resultStmt = N<IfStmt>(cond, transform(stmt->ifSuite), transform(stmt->elseSuite));
}
void SimplifyVisitor::visit(MatchStmt *stmt) {

View File

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

View File

@ -21,14 +21,14 @@ std::shared_ptr<TranslateItem> TranslateContext::find(const std::string &name) c
return t;
std::shared_ptr<TranslateItem> ret = nullptr;
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]);
seqassert(in(cache->classes, tt->type->getClass()->name) &&
in(cache->classes[tt->type->getClass()->name].realizations, name),
"cannot find type realization {}", name);
ret->handle.type =
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]);
seqassert(
in(cache->functions, tt->type->getFunc()->ast->name) &&

View File

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