diff --git a/bazel/cc_toolchain_config.bzl b/bazel/cc_toolchain_config.bzl index b370ee13..9b834402 100644 --- a/bazel/cc_toolchain_config.bzl +++ b/bazel/cc_toolchain_config.bzl @@ -110,6 +110,7 @@ def _impl(ctx): "-fPIE", ]), linking_flags([ + "-ldl", "-lffi", "-lm", "-lstdc++", diff --git a/toolchain/ic_rule.bzl b/toolchain/ic_rule.bzl index b13243e9..c08e16bc 100644 --- a/toolchain/ic_rule.bzl +++ b/toolchain/ic_rule.bzl @@ -45,7 +45,7 @@ def _ic_compile_impl(ctx): inputs = depset([src_file, mod_file], transitive = icm_deps), outputs = [icm_file], arguments = [ - src_file.short_path, + src_file.path, "--output={}".format(icm_file.path), "--module-map={}".format(mod_file.path), # "--debug-parser=true", diff --git a/toolchain/stdlib/compat/c/BUILD b/toolchain/stdlib/compat/c/BUILD index 6de65e35..ff596820 100644 --- a/toolchain/stdlib/compat/c/BUILD +++ b/toolchain/stdlib/compat/c/BUILD @@ -2,9 +2,17 @@ load("//toolchain:ic_rule.bzl", "ic_library") package(default_visibility = ["//visibility:public"]) +genrule( + name = "generate_c_types", + outs = ["types.ic"], + cmd = "./$(location //toolchain/stdlib/compat/c/internal:c_types_generator) > $@", + tools = ["//toolchain/stdlib/compat/c/internal:c_types_generator"], + visibility = ["//visibility:private"], +) + ic_library( name = "types", - srcs = ["types.ic"], + srcs = [":generate_c_types"], ) ic_library( diff --git a/toolchain/stdlib/compat/c/internal/BUILD b/toolchain/stdlib/compat/c/internal/BUILD new file mode 100644 index 00000000..f0e2533f --- /dev/null +++ b/toolchain/stdlib/compat/c/internal/BUILD @@ -0,0 +1,6 @@ +package(default_visibility = ["//toolchain/stdlib/compat/c:__subpackages__"]) + +cc_binary( + name = "c_types_generator", + srcs = ["c_types_generator.cc"], +) diff --git a/toolchain/stdlib/compat/c/internal/c_types_generator.cc b/toolchain/stdlib/compat/c/internal/c_types_generator.cc new file mode 100644 index 00000000..b63f4870 --- /dev/null +++ b/toolchain/stdlib/compat/c/internal/c_types_generator.cc @@ -0,0 +1,31 @@ +#include +#include +#include + +template +void PrintIntegerDeclaration(char const *name) { + std::printf("let %-*s ::= %c%lu\n", 18, name, + std::is_signed::value ? 'i' : 'u', sizeof(T) * CHAR_BIT); +} + +template +void PrintFloatingPointDeclaration(char const *name) { + std::printf("let %-*s ::= f%lu\n", 18, name, sizeof(T) * CHAR_BIT); +} + +int main() { + PrintIntegerDeclaration("signed_char"); + PrintIntegerDeclaration("unsigned_char"); + PrintIntegerDeclaration("short"); + PrintIntegerDeclaration("unsigned_short"); + PrintIntegerDeclaration("int"); + PrintIntegerDeclaration("unsigned_int"); + PrintIntegerDeclaration("long"); + PrintIntegerDeclaration("unsigned_long"); + PrintIntegerDeclaration("long_long"); + PrintIntegerDeclaration("unsigned_long_long"); + PrintFloatingPointDeclaration("float"); + PrintFloatingPointDeclaration("double"); + + return 0; +} diff --git a/toolchain/stdlib/compat/c/string.ic b/toolchain/stdlib/compat/c/string.ic index 6121dfb1..1d32510b 100644 --- a/toolchain/stdlib/compat/c/string.ic +++ b/toolchain/stdlib/compat/c/string.ic @@ -2,7 +2,7 @@ let c ::= import "std.compat.c.types" -let size_t ::= c.size_t +let size_t ::= c.unsigned_long let strcpy ::= builtin.foreign("strcpy", ([*]char, [*]char) -> [*]char) let strncpy ::= builtin.foreign("strncpy", ([*]char, [*]char, size_t) -> [*]char) diff --git a/toolchain/stdlib/compat/c/time.ic b/toolchain/stdlib/compat/c/time.ic index 4e93d0b1..45f9d199 100644 --- a/toolchain/stdlib/compat/c/time.ic +++ b/toolchain/stdlib/compat/c/time.ic @@ -5,7 +5,7 @@ let c ::= import "std.compat.c.types" let clock_t ::= c.long let time_t ::= c.long let tm ::= builtin.opaque() -let size_t ::= c.size_t +let size_t ::= c.unsigned_long let CLOCKS_PER_SEC :: clock_t = 1000000 diff --git a/toolchain/stdlib/compat/c/types.ic b/toolchain/stdlib/compat/c/types.ic deleted file mode 100644 index 4b41f24c..00000000 --- a/toolchain/stdlib/compat/c/types.ic +++ /dev/null @@ -1,14 +0,0 @@ -let signed_char ::= i8 -let unsigned_char ::= u8 -let short ::= i16 -let unsigned_short ::= u16 -let int ::= i32 -let unsigned_int ::= u32 -let long ::= i64 -let unsigned_long ::= u64 -let long_long ::= i64 -let unsigned_long_long ::= u64 -let float ::= f32 -let double ::= f64 - -let size_t ::= unsigned_long