Skip to content

Commit a50fe0e

Browse files
committed
add ability to name all symbols in the C API
1 parent e40dcfa commit a50fe0e

2 files changed

Lines changed: 66 additions & 14 deletions

File tree

src/lang_c/libowi/include/owi.h

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,28 @@ extern "C"
99
#endif
1010

1111
__attribute__((import_module("owi"), import_name("i32_symbol"))) int32_t owi_int32(void);
12+
int32_t owi_named_int32(const char* name);
1213
__attribute__((import_module("owi"), import_name("i32_symbol"))) uint32_t owi_uint32(void);
14+
uint32_t owi_named_uint32(const char* name);
1315
__attribute__((import_module("owi"), import_name("i64_symbol"))) int64_t owi_int64(void);
16+
int64_t owi_named_int64(const char* name);
1417
__attribute__((import_module("owi"), import_name("i64_symbol"))) uint64_t owi_uint64(void);
18+
uint64_t owi_named_uint64(const char* name);
1519

1620
#ifndef __FRAMAC__
1721
__int128 owi_int128(void);
22+
__int128 owi_named_int128(const char* name);
1823
unsigned __int128 owi_uint128(void);
24+
unsigned __int128 owi_named_uint128(const char* name);
1925
#endif
2026

2127
_Static_assert(sizeof(float) == 4, "Unsupported float size. Please open an issue.");
2228
__attribute__((import_module("owi"), import_name("f32_symbol"))) float owi_float(void);
29+
float owi_named_float(const char* name);
2330

2431
_Static_assert(sizeof(double) == 8, "Unsupported double size. Please open an issue.");
2532
__attribute__((import_module("owi"), import_name("f64_symbol"))) double owi_double(void);
33+
double owi_named_double(const char* name);
2634

2735
// TODO
2836
// long double owi_long_double(void);
@@ -34,19 +42,36 @@ __attribute__((import_module("owi"), import_name("f64_symbol"))) double owi_doub
3442
_Bool
3543
#endif
3644
owi_bool(void);
45+
#ifdef __cplusplus
46+
bool
47+
#else
48+
_Bool
49+
#endif
50+
owi_named_bool(const char* name);
3751
char owi_char(void);
52+
char owi_named_char(const char* name);
3853
unsigned char owi_unsigned_char(void);
54+
unsigned char owi_named_unsigned_char(const char* name);
3955
short owi_short(void);
56+
short owi_named_short(const char* name);
4057
unsigned short owi_unsigned_short(void);
58+
unsigned short owi_named_unsigned_short(const char* name);
4159
int owi_int(void);
60+
int owi_named_int(const char* name);
4261
unsigned int owi_unsigned_int(void);
62+
unsigned int owi_named_unsigned_int(const char* name);
4363
long owi_long(void);
64+
long owi_named_long(const char* name);
4465
unsigned long owi_unsigned_long(void);
66+
unsigned long owi_named_unsigned_long(const char* name);
4567
long long owi_long_long(void);
68+
long long owi_named_long_long(const char* name);
4669
unsigned long long owi_unsigned_long_long(void);
70+
unsigned long long owi_named_unsigned_long_long(const char* name);
4771

4872
// TODO: improve this
4973
__attribute__((import_module("owi"), import_name("range_symbol"))) int owi_range(int lo, int hi);
74+
int owi_named_range(const char* name, int lo, int hi);
5075

5176
__attribute__((import_module("owi"), import_name("alloc"))) void *owi_malloc(void *, unsigned int);
5277
__attribute__((import_module("owi"), import_name("print_char"))) void owi_print_char(int);
@@ -57,11 +82,12 @@ __attribute__((import_module("owi"), import_name("cov_label_set"))) void owi_lab
5782
#ifdef __OWI_INTERNALS
5883

5984
__attribute__((import_module("owi"), import_name("invisible_bool_symbol"))) int owi_invisible_bool(void);
60-
__attribute__((import_module("owi"), import_name("open_scope"))) void owi_open_scope(const char *name);
61-
__attribute__((import_module("owi"), import_name("close_scope"))) void owi_close_scope(void);
6285

6386
#endif
6487

88+
__attribute__((import_module("owi"), import_name("open_scope"))) void owi_open_scope(const char *name);
89+
__attribute__((import_module("owi"), import_name("close_scope"))) void owi_close_scope(void);
90+
6591
__attribute__((import_module("owi"), import_name("assume"))) void owi_assume(int);
6692
__attribute__((import_module("owi"), import_name("assert"))) void owi_assert(int);
6793
// TODO: do we need these two ? we already have abort and exit in stdlib that are exactly the same

src/lang_c/libowi/src/owi.c

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,51 +22,75 @@
2222
: (T)(owi_uint64()); \
2323
})
2424

25+
#define OWI_NAMED(type, name) \
26+
type owi_named_##name(const char *n) { \
27+
owi_open_scope(n); \
28+
type sym = owi_##name(); \
29+
owi_close_scope(); \
30+
return sym; \
31+
}
32+
33+
OWI_NAMED(int32_t, int32);
34+
OWI_NAMED(uint32_t, uint32);
35+
OWI_NAMED(int64_t, int64);
36+
OWI_NAMED(uint64_t, uint64);
37+
OWI_NAMED(float, float);
38+
OWI_NAMED(double, double);
39+
int owi_range_named(const char *name, int lo, int hi) {
40+
owi_open_scope(name);
41+
int sym = owi_range(lo, hi);
42+
owi_close_scope();
43+
return sym;
44+
};
45+
2546
#ifdef __cplusplus
26-
bool
27-
#else
28-
_Bool
29-
#endif
30-
owi_bool(void) {
31-
return magic_size_unsigned(
32-
#ifdef __cplusplus
33-
bool
47+
#define OWI_BOOL bool
3448
#else
35-
_Bool
49+
#define OWI_BOOL _Bool
3650
#endif
37-
);
38-
}
51+
52+
OWI_BOOL owi_bool(void) { return magic_size_unsigned(OWI_BOOL); }
53+
OWI_NAMED(OWI_BOOL, bool)
3954

4055
char owi_char(void) { return magic_size_signed(char); }
56+
OWI_NAMED(char, char)
4157

4258
unsigned char owi_unsigned_char(void) {
4359
return magic_size_unsigned(unsigned char);
4460
}
61+
OWI_NAMED(unsigned char, unsigned_char)
4562

4663
short owi_short(void) { return magic_size_signed(short); }
64+
OWI_NAMED(short, short)
4765

4866
unsigned short owi_unsigned_short(void) {
49-
5067
return magic_size_unsigned(unsigned short);
5168
}
69+
OWI_NAMED(unsigned short, unsigned_short)
5270

5371
int owi_int(void) { return magic_size_signed(int); }
72+
OWI_NAMED(int, int)
5473

5574
unsigned int owi_unsigned_int(void) {
5675
return magic_size_unsigned(unsigned int);
5776
}
77+
OWI_NAMED(unsigned int, unsigned_int)
5878

5979
long owi_long(void) { return magic_size_signed(long); }
80+
OWI_NAMED(long, long)
6081

6182
unsigned long owi_unsigned_long(void) {
6283
return magic_size_unsigned(unsigned long);
6384
}
85+
OWI_NAMED(unsigned long, unsigned_long)
6486

6587
long long owi_long_long(void) { return magic_size_signed(long long); }
88+
OWI_NAMED(long long, long_long)
6689

6790
unsigned long long owi_unsigned_long_long(void) {
6891
return magic_size_unsigned(unsigned long long);
6992
}
93+
OWI_NAMED(unsigned long long, unsigned_long_long)
7094

7195
__int128 owi_int128(void) {
7296
int64_t high64 = owi_int64();
@@ -78,6 +102,7 @@ __int128 owi_int128(void) {
78102
high128 = high128 << 64;
79103
return high128 | low128;
80104
}
105+
OWI_NAMED(__int128, int128)
81106

82107
unsigned __int128 owi_uint128(void) {
83108
int64_t high64 = owi_uint64();
@@ -89,3 +114,4 @@ unsigned __int128 owi_uint128(void) {
89114
high128 = high128 << 64;
90115
return high128 | low128;
91116
}
117+
OWI_NAMED(unsigned __int128, uint128)

0 commit comments

Comments
 (0)