Skip to content

Commit

Permalink
Added new script to format the project
Browse files Browse the repository at this point in the history
  • Loading branch information
mauro-balades committed Jan 30, 2024
1 parent 4271931 commit e0d1d4b
Show file tree
Hide file tree
Showing 274 changed files with 5,138 additions and 6,526 deletions.
105 changes: 52 additions & 53 deletions app/cli.cc
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,17 @@ void hide_args() {
void register_build_opts(Options::BuildOptions& options, std::string mode, argsVector& args) {

Check warning on line 35 in app/cli.cc

View workflow job for this annotation

GitHub Actions / cpp-linter

app/cli.cc:35:70 [performance-unnecessary-value-param]

the parameter 'mode' is copied for each invocation but only used as a const reference; consider making it a const reference
cl::OptionCategory buildCategory(mode == "build" ? "Build Options" : "Run Options");
cl::opt<Optimization> opt(
cl::desc("optimization mode"),
cl::values(
clEnumValN(Optimization::OPTIMIZE_O0, "O0", "No optimization"),
clEnumValN(Optimization::OPTIMIZE_O1, "O1", "Optimization level 1"),
clEnumValN(Optimization::OPTIMIZE_O2, "O2", "Optimization level 2"),
clEnumValN(Optimization::OPTIMIZE_O3, "O3", "Optimization level 3"),
clEnumValN(Optimization::OPTIMIZE_Os, "Os", "Optimization for size"),
clEnumValN(Optimization::OPTIMIZE_Oz, "Oz", "Optimization for size (aggressive)")),
cl::init(Optimization::OPTIMIZE_O1),
cl::cat(buildCategory),
cl::AlwaysPrefix);
cl::desc("optimization mode"),
cl::values(
clEnumValN(Optimization::OPTIMIZE_O0, "O0", "No optimization"),
clEnumValN(Optimization::OPTIMIZE_O1, "O1", "Optimization level 1"),
clEnumValN(Optimization::OPTIMIZE_O2, "O2", "Optimization level 2"),
clEnumValN(Optimization::OPTIMIZE_O3, "O3", "Optimization level 3"),
clEnumValN(Optimization::OPTIMIZE_Os, "Os", "Optimization for size"),
clEnumValN(Optimization::OPTIMIZE_Oz, "Oz", "Optimization for size (aggressive)")),
cl::init(Optimization::OPTIMIZE_O1),
cl::cat(buildCategory),
cl::AlwaysPrefix);
cl::opt<bool> silent("silent", cl::desc("Silent mode"), cl::cat(buildCategory));
cl::opt<std::string> file("file", cl::desc("File to compile"), cl::cat(buildCategory));
cl::opt<bool> no_progress("no-progress", cl::desc("Disable progress bar"), cl::cat(buildCategory));
Expand All @@ -56,15 +56,15 @@ void register_build_opts(Options::BuildOptions& options, std::string mode, argsV
auto test = cl::opt<bool>("test", cl::desc("Builds the project for testing"), cl::cat(buildCategory));
auto bench = cl::opt<bool>("bench", cl::desc("Builds the project for benchmarking"), cl::cat(buildCategory));
auto output = cl::opt<std::string>("output", cl::desc("Output file"), cl::cat(buildCategory));
auto emit = cl::opt<EmitType>("emit",
cl::desc("Output type"),
cl::values(
clEnumValN(EmitType::EXECUTABLE, "exe", "Executable"),
clEnumValN(EmitType::OBJECT, "obj", "Object file"),
clEnumValN(EmitType::LLVM_IR, "llvm-ir", "LLVM IR"),
clEnumValN(EmitType::ASSEMBLY, "asm", "Assembly"),
clEnumValN(EmitType::SNOWBALL_IR, "snowball-ir", "Snowball IR")),
cl::init(EmitType::EXECUTABLE), cl::cat(buildCategory));
auto emit = cl::opt<EmitType>("emit",
cl::desc("Output type"),
cl::values(
clEnumValN(EmitType::EXECUTABLE, "exe", "Executable"),
clEnumValN(EmitType::OBJECT, "obj", "Object file"),
clEnumValN(EmitType::LLVM_IR, "llvm-ir", "LLVM IR"),
clEnumValN(EmitType::ASSEMBLY, "asm", "Assembly"),
clEnumValN(EmitType::SNOWBALL_IR, "snowball-ir", "Snowball IR")),
cl::init(EmitType::EXECUTABLE), cl::cat(buildCategory));
cl::alias _test("t", cl::aliasopt(test), cl::desc("Alias for -test"), cl::cat(buildCategory));
cl::alias _bench("b", cl::aliasopt(bench), cl::desc("Alias for -bench"), cl::cat(buildCategory));
cl::alias _output("o", cl::aliasopt(output), cl::desc("Alias for -output"), cl::cat(buildCategory));
Expand All @@ -91,7 +91,6 @@ void run(Options& opts, argsVector& args) {
auto& runOpts = opts.run_opts;
cl::OptionCategory runCategory("Extra run Options");
cl::opt<bool> jit("jit", cl::desc("Run the program in JIT mode"), cl::cat(runCategory));

std::vector<std::string> progArgs;

Check warning on line 94 in app/cli.cc

View workflow job for this annotation

GitHub Actions / cpp-linter

app/cli.cc:94:28 [cppcoreguidelines-init-variables]

variable 'progArgs' is not initialized
bool addToArgs = false;
size_t argIndex = 0;
Expand All @@ -107,7 +106,6 @@ void run(Options& opts, argsVector& args) {
}
argIndex++;
}

register_build_opts(runOpts, "run", usedArgs);
runOpts.jit = jit;
runOpts.progArgs = progArgs;
Expand All @@ -121,19 +119,19 @@ void build(Options& opts, argsVector& args) {
void test(Options& opts, argsVector& args) {
cl::OptionCategory buildCategory("Test Options");
cl::opt<Optimization> opt(
cl::desc("optimization mode"),
cl::values(
clEnumValN(Optimization::OPTIMIZE_O0, "O0", "No optimization"),
clEnumValN(Optimization::OPTIMIZE_O1, "O1", "Optimization level 1"),
clEnumValN(Optimization::OPTIMIZE_O2, "O2", "Optimization level 2"),
clEnumValN(Optimization::OPTIMIZE_O3, "O3", "Optimization level 3"),
clEnumValN(Optimization::OPTIMIZE_Os, "Os", "Optimization for size"),
clEnumValN(Optimization::OPTIMIZE_Oz, "Oz", "Optimization for size (aggressive)"),
clEnumValN(Optimization::OPTIMIZE_O0, "Debug", "Debug mode (no optimization)"),
clEnumValN(Optimization::OPTIMIZE_O3, "Release", "Release mode (optimization level 3)")
),
cl::init(Optimization::OPTIMIZE_O3),
cl::cat(buildCategory), cl::AlwaysPrefix);
cl::desc("optimization mode"),
cl::values(
clEnumValN(Optimization::OPTIMIZE_O0, "O0", "No optimization"),
clEnumValN(Optimization::OPTIMIZE_O1, "O1", "Optimization level 1"),
clEnumValN(Optimization::OPTIMIZE_O2, "O2", "Optimization level 2"),
clEnumValN(Optimization::OPTIMIZE_O3, "O3", "Optimization level 3"),
clEnumValN(Optimization::OPTIMIZE_Os, "Os", "Optimization for size"),
clEnumValN(Optimization::OPTIMIZE_Oz, "Oz", "Optimization for size (aggressive)"),
clEnumValN(Optimization::OPTIMIZE_O0, "Debug", "Debug mode (no optimization)"),
clEnumValN(Optimization::OPTIMIZE_O3, "Release", "Release mode (optimization level 3)")
),
cl::init(Optimization::OPTIMIZE_O3),
cl::cat(buildCategory), cl::AlwaysPrefix);
cl::opt<bool> silent("silent", cl::desc("Silent mode"), cl::cat(buildCategory));
cl::opt<bool> no_progress("no-progress", cl::desc("Disable progress bar"), cl::cat(buildCategory));
cl::alias _silent("s", cl::aliasopt(silent), cl::desc("Alias for -silent"), cl::cat(buildCategory));
Expand Down Expand Up @@ -179,19 +177,19 @@ void docs(Options& opts, argsVector& args) {
void bench(Options& opts, argsVector& args) {
cl::OptionCategory benchCategory("Benchmark Options");
cl::opt<Optimization> opt(
cl::desc("optimization mode"),
cl::values(
clEnumValN(Optimization::OPTIMIZE_O0, "O0", "No optimization"),
clEnumValN(Optimization::OPTIMIZE_O1, "O1", "Optimization level 1"),
clEnumValN(Optimization::OPTIMIZE_O2, "O2", "Optimization level 2"),
clEnumValN(Optimization::OPTIMIZE_O3, "O3", "Optimization level 3"),
clEnumValN(Optimization::OPTIMIZE_Os, "Os", "Optimization for size"),
clEnumValN(Optimization::OPTIMIZE_Oz, "Oz", "Optimization for size (aggressive)"),
clEnumValN(Optimization::OPTIMIZE_O0, "Debug", "Debug mode (no optimization)"),
clEnumValN(Optimization::OPTIMIZE_O3, "Release", "Release mode (optimization level 3)")
),
cl::init(Optimization::OPTIMIZE_O3),
cl::cat(benchCategory), cl::AlwaysPrefix);
cl::desc("optimization mode"),
cl::values(
clEnumValN(Optimization::OPTIMIZE_O0, "O0", "No optimization"),
clEnumValN(Optimization::OPTIMIZE_O1, "O1", "Optimization level 1"),
clEnumValN(Optimization::OPTIMIZE_O2, "O2", "Optimization level 2"),
clEnumValN(Optimization::OPTIMIZE_O3, "O3", "Optimization level 3"),
clEnumValN(Optimization::OPTIMIZE_Os, "Os", "Optimization for size"),
clEnumValN(Optimization::OPTIMIZE_Oz, "Oz", "Optimization for size (aggressive)"),
clEnumValN(Optimization::OPTIMIZE_O0, "Debug", "Debug mode (no optimization)"),
clEnumValN(Optimization::OPTIMIZE_O3, "Release", "Release mode (optimization level 3)")
),
cl::init(Optimization::OPTIMIZE_O3),
cl::cat(benchCategory), cl::AlwaysPrefix);
cl::opt<bool> silent("silent", cl::desc("Silent mode"), cl::cat(benchCategory));
cl::opt<bool> no_progress("no-progress", cl::desc("Disable progress bar"), cl::cat(benchCategory));
cl::alias _silent("s", cl::aliasopt(silent), cl::desc("Alias for -silent"), cl::cat(benchCategory));
Expand All @@ -215,10 +213,10 @@ void clean(Options& opts, argsVector& args) {

Options CLI::parse() {

Check warning on line 214 in app/cli.cc

View workflow job for this annotation

GitHub Actions / cpp-linter

app/cli.cc:214:14 [modernize-use-trailing-return-type]

use a trailing return type for this function
Options opts;
cl::SetVersionPrinter([](raw_ostream& OS) {
OS SNOWBALL_PRINT_MESSAGE;
});
std::vector<const char *> args{argv[0]};
cl::SetVersionPrinter([](raw_ostream & OS) {
OS SNOWBALL_PRINT_MESSAGE;
});
std::vector<const char*> args{argv[0]};

Check warning on line 219 in app/cli.cc

View workflow job for this annotation

GitHub Actions / cpp-linter

app/cli.cc:219:28 [cppcoreguidelines-init-variables]

variable 'args' is not initialized
std::string mode;
if (argc < 2) {
args.push_back("--help");
Expand All @@ -230,7 +228,8 @@ Options CLI::parse() {
}
std::string argv0 = std::string(args[0]) + " " + mode;
args[0] = argv0.data();
static std::unordered_map<std::string, std::pair<Options::Command, std::function<void(Options&, argsVector&)>>> modes = {
static std::unordered_map<std::string, std::pair<Options::Command, std::function<void(Options&, argsVector&)>>> modes
= {
{"run", {Options::RUN, cli::modes::run}},
{"build", {Options::BUILD, cli::modes::build}},
{"test", {Options::TEST, cli::modes::test}},
Expand Down
13 changes: 5 additions & 8 deletions app/cli.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,15 @@
namespace snowball {
namespace app {
struct Options {
enum EmitType
{
enum EmitType {
EXECUTABLE,
OBJECT,
LLVM_IR,
ASSEMBLY,
SNOWBALL_IR,
};

enum Optimization
{
enum Optimization {
OPTIMIZE_O0 = 0x00,
OPTIMIZE_O1 = 0x01,
OPTIMIZE_O2 = 0x02,
Expand Down Expand Up @@ -75,8 +73,7 @@ struct Options {
std::string base = "";
} docs_opts;

enum Command
{
enum Command {
UNKNOWN = -1,

BUILD,
Expand Down Expand Up @@ -105,11 +102,11 @@ void bench(Options& opts, argsVector& args);
} // namespace cli

class CLI {
public:
public:
CLI(int argc, char** argv);
Options parse();

private:
private:
int argc;
char** argv;
};
Expand Down
24 changes: 4 additions & 20 deletions app/commands/bench.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,64 +20,50 @@ namespace app {
namespace commands {
int bench(app::Options::BenchmarkOptions p_opts) {
toml::parse_result parsed_config = Compiler::getConfiguration();

std::string filename =
(std::string)(parsed_config["benchmark"]["entry"].value_or<std::string>(fs::current_path() / "bench" / "main.sn"));

(std::string)(parsed_config["benchmark"]["entry"].value_or<std::string>(fs::current_path() / "bench" / "main.sn"));
std::ifstream ifs(filename);
if (ifs.fail()) {
SNError(Error::IO_ERROR,
FMT("Package main file not found in snowball "
"project! \n\t(searching for: '%s')",
filename.c_str()))
.print_error();
.print_error();
return EXIT_FAILURE;
}

std::string content((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>()));

// TODO: check for output
std::string output = _SNOWBALL_OUT_DEFAULT("snowball-bench", Options::EmitType::EXECUTABLE, false);
std::string build_type = "";

filename = parsed_config["package"]["main"].value_or<std::string>((fs::current_path() / "src" / "main.sn"));
std::string package_name = (std::string)(parsed_config["package"]["name"].value_or<std::string>("<anonnimus>"));
std::string package_version = parsed_config["package"]["version"].value_or<std::string>("<unknown>");

if (p_opts.opt == Options::Optimization::OPTIMIZE_O0) {
build_type += "debug";
} else {
build_type += "optimized";
}

if (!p_opts.silent)
Logger::message(
"Project",
FMT("%s v%s [%s%s%s]", package_name.c_str(), package_version.c_str(), BOLD, build_type.c_str(), RESET)
"Project",
FMT("%s v%s [%s%s%s]", package_name.c_str(), package_version.c_str(), BOLD, build_type.c_str(), RESET)
);

Compiler* compiler = new Compiler(content, filename);
compiler->initialize();
compiler->enable_benchmark();
compiler->setOptimization(p_opts.opt);

auto start = high_resolution_clock::now();

// TODO: false if --no-output is passed
compiler->enamblePackageManager(true);
compiler->compile(p_opts.no_progress || p_opts.silent);

auto stop = high_resolution_clock::now();
auto date = std::chrono::system_clock::now();

compiler->emitBinary(output, false);
compiler->cleanup();

// Get duration. Substart timepoints to
// get duration. To cast it to proper unit
// use duration cast method
auto duration = duration_cast<milliseconds>(stop - start).count();

if (!p_opts.silent) {
auto time = std::chrono::system_clock::to_time_t(date);
char buffer[12]; // __DATE__ format requires 12 characters (including null terminator)
Expand All @@ -87,10 +73,8 @@ int bench(app::Options::BenchmarkOptions p_opts) {
Logger::compiling(FMT("Build date: %s%s%s\n", BOLD, buffer, RESET), "Date");
Logger::message("Running", FMT("benchmarks (%s)", filename.c_str()));
}

char* args[] = {strdup(output.c_str()), NULL};
int result = execvp(args[0], args);

// This shoudnt be executed
return result;
}
Expand Down
20 changes: 3 additions & 17 deletions app/commands/build.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,27 +24,23 @@ int build(app::Options::BuildOptions p_opts) {
std::string package_name = "file";
std::string package_version = "<unknown version>";
//bool isStaticLib = false; // TODO: implement static library support

if (p_opts.file.empty()) {
toml::parse_result parsed_config = Compiler::getConfiguration();
filename = parsed_config["package"]["main"].value_or<std::string>((fs::current_path() / "src" / "main.sn"));
package_name = (std::string)(parsed_config["package"]["name"].value_or<std::string>("<anonnimus>"));
package_version = parsed_config["package"]["version"].value_or<std::string>("<unknown>");
}

std::ifstream ifs(filename);
if (ifs.fail()) {
SNError(Error::IO_ERROR,
FMT("Package main file not found in snowball "
"project! \n\t(searching for: '%s')",
filename.c_str()))
.print_error();
.print_error();
return EXIT_FAILURE;
}

std::string build_type;
if (p_opts.is_test) { build_type = "test + "; }

if (p_opts.emit_type == Options::EmitType::EXECUTABLE) {
build_type += "executable";
} else if (p_opts.emit_type == Options::EmitType::SNOWBALL_IR) {
Expand All @@ -58,45 +54,37 @@ int build(app::Options::BuildOptions p_opts) {
} else {
throw SNError(BUG, FMT("Unhandled emit type for build process ('%i')", p_opts.emit_type));
}

if (p_opts.opt == Options::Optimization::OPTIMIZE_O0) {
build_type += " + debug";
} else {
build_type += " + optimized";
}

if (!p_opts.silent)
Logger::message(
"Project",
FMT("%s v%s [%s%s%s]", package_name.c_str(), package_version.c_str(), BOLD, build_type.c_str(), RESET)
"Project",
FMT("%s v%s [%s%s%s]", package_name.c_str(), package_version.c_str(), BOLD, build_type.c_str(), RESET)
);

std::string content((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>()));

// TODO: check for output
Compiler* compiler = new Compiler(content, filename);
compiler->initialize();
std::string output = _SNOWBALL_OUT_DEFAULT(package_name, p_opts.emit_type, !compiler->getGlobalContext().isDynamic);
if (!p_opts.output.empty()) { output = p_opts.output; }
compiler->setOptimization(p_opts.opt);
if (p_opts.is_test) { compiler->enable_tests(); }

auto start = high_resolution_clock::now();
compiler->enamblePackageManager(p_opts.file.empty());
compiler->compile(p_opts.no_progress || p_opts.silent);
auto stop = high_resolution_clock::now();

// Get duration. Substart timepoints to
// get duration. To cast it to proper unit
// use duration cast method
auto duration = duration_cast<milliseconds>(stop - start).count();

if (!p_opts.silent) {
Logger::message("Finished", FMT("build target(s) in %s%ims%s", BOLD, duration, RESET));
Logger::message("Generating", FMT("Generating output at `%s%s%s`", BOLD, output.c_str(), RESET));
Logger::log("");
}

int status;
if (p_opts.emit_type == app::Options::EmitType::OBJECT) {
status = compiler->emitObject(output, !p_opts.silent);
Expand All @@ -109,9 +97,7 @@ int build(app::Options::BuildOptions p_opts) {
} else {
status = compiler->emitBinary(output, !p_opts.silent);
}

compiler->cleanup();

return status;
}
} // namespace commands
Expand Down
Loading

0 comments on commit e0d1d4b

Please sign in to comment.