lean4-htt/src/library/native_compiler/options.cpp
Jared Roesch e65d90ac79 feat(*): C++ code generator
in progress move of Lean.native to init
2016-12-05 16:11:41 -08:00

129 lines
4.3 KiB
C++

/*
Copyright (c) 2016 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Jared Roesch, and Leonardo de Moura
*/
#include "util/sexpr/option_declarations.h"
#include "library/native_compiler/options.h"
#ifndef LEAN_DEFAULT_NATIVE_LIBRARY_PATH
#define LEAN_DEFAULT_NATIVE_LIBRARY_PATH ""
#endif
#ifndef LEAN_DEFAULT_NATIVE_MAIN_FN
#define LEAN_DEFAULT_NATIVE_MAIN_FN "main"
#endif
#ifndef LEAN_DEFAULT_NATIVE_INCLUDE_PATH
#define LEAN_DEFAULT_NATIVE_INCLUDE_PATH ""
#endif
#ifndef LEAN_DEFAULT_NATIVE_EMIT_DWARF
#define LEAN_DEFAULT_NATIVE_EMIT_DWARF false
#endif
#ifndef LEAN_DEFAULT_NATIVE_DYNAMIC
#define LEAN_DEFAULT_NATIVE_DYNAMIC false
#endif
#ifndef LEAN_DEFAULT_NATIVE_DUMP
#define LEAN_DEFAULT_NATIVE_DUMP ""
#endif
namespace lean {
namespace native {
/* Options */
static name * g_native_library_path = nullptr;
static name * g_native_main_fn = nullptr;
static name * g_native_include_path = nullptr;
static name * g_native_emit_dwarf = nullptr;
static name * g_native_dynamic = nullptr;
static name * g_native_dump = nullptr;
char const * get_native_library_path(options const & o) {
return o.get_string(*g_native_library_path, LEAN_DEFAULT_NATIVE_LIBRARY_PATH);
}
char const * get_native_main_fn(options const & o) {
return o.get_string(*g_native_main_fn, LEAN_DEFAULT_NATIVE_MAIN_FN);
}
char const * get_native_include_path(options const & o) {
return o.get_string(*g_native_include_path, LEAN_DEFAULT_NATIVE_INCLUDE_PATH);
}
bool get_native_emit_dwarf(options const & o) {
return o.get_bool(*g_native_emit_dwarf, LEAN_DEFAULT_NATIVE_EMIT_DWARF);
}
bool get_native_dynamic(options const & o) {
return o.get_bool(*g_native_dynamic, LEAN_DEFAULT_NATIVE_DYNAMIC);
}
char const * get_native_dump(options const & o) {
return o.get_string(*g_native_dump, LEAN_DEFAULT_NATIVE_DUMP);
}
config::config(options const & o) {
m_native_library_path = get_native_library_path(o);
m_native_main_fn = get_native_main_fn(o);
m_native_include_path = get_native_include_path(o);
m_native_emit_dwarf = get_native_emit_dwarf(o);
m_native_dynamic = get_native_dynamic(o);
m_native_dump = get_native_dump(o);
}
void config::display(std::ostream & os) {
os << "native.library_path = " << m_native_library_path << std::endl;
}
LEAN_THREAD_PTR(config, g_native_config);
scope_config::scope_config(options const & o):
m_old(g_native_config),
m_config(o) {
g_native_config = &m_config;
}
scope_config::~scope_config() {
g_native_config = m_old;
}
config & get_config() {
lean_assert(g_native_config);
return *g_native_config;
}
void initialize_options() {
g_native_library_path = new name{"native", "library_path"};
g_native_main_fn = new name{"native", "main"};
g_native_include_path = new name{"native", "include_path"};
g_native_emit_dwarf = new name{"native", "emit_dwarf"};
g_native_dynamic = new name{"native", "dynamic"};
g_native_dump = new name{"native", "dump"};
register_string_option(*native::g_native_library_path, LEAN_DEFAULT_NATIVE_LIBRARY_PATH,
"(native_compiler) path used to search for native libraries, including liblean");
register_string_option(*native::g_native_main_fn, LEAN_DEFAULT_NATIVE_MAIN_FN,
"(native_compiler) definition used as the program entry point");
register_string_option(*native::g_native_include_path, LEAN_DEFAULT_NATIVE_INCLUDE_PATH,
"(native_compiler) path used to search for native headers, for example those included with Lean");
register_bool_option(*native::g_native_emit_dwarf, LEAN_DEFAULT_NATIVE_EMIT_DWARF,
"(native_compiler) flag controls whether dwarf debugging information is generated for the emitted code");
register_bool_option(*native::g_native_dynamic, LEAN_DEFAULT_NATIVE_DYNAMIC,
"(native_compiler) flag controls whether to use dynamic linking");
register_string_option(*native::g_native_dump, LEAN_DEFAULT_NATIVE_DUMP,
"(native_compiler) flag controls whether the native compiler dumps terms before and after every pass");
}
void finalize_options() {
delete g_native_library_path;
delete g_native_main_fn;
delete g_native_include_path;
delete g_native_emit_dwarf;
delete g_native_dynamic;
delete g_native_dump;
}
}}