Skip to content

Commit

Permalink
Add gc static analysis annotations for datatype.c
Browse files Browse the repository at this point in the history
  • Loading branch information
Keno committed Aug 18, 2018
1 parent 7136049 commit 239a40d
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 12 deletions.
21 changes: 11 additions & 10 deletions src/datatype.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ extern "C" {

// allocating TypeNames -----------------------------------------------------------

jl_sym_t *jl_demangle_typename(jl_sym_t *s)
jl_sym_t *jl_demangle_typename(jl_sym_t *s) JL_NOTSAFEPOINT
{
char *n = jl_symbol_name(s);
if (n[0] != '#')
Expand Down Expand Up @@ -90,7 +90,7 @@ jl_datatype_t *jl_new_uninitialized_datatype(void)
static jl_datatype_layout_t *jl_get_layout(uint32_t nfields,
uint32_t alignment,
int haspadding,
jl_fielddesc32_t desc[])
jl_fielddesc32_t desc[]) JL_NOTSAFEPOINT
{
// compute the smallest fielddesc type that can hold the layout description
int fielddesc_type = 0;
Expand Down Expand Up @@ -262,7 +262,7 @@ JL_DLLEXPORT int jl_islayout_inline(jl_value_t *eltype, size_t *fsz, size_t *al)
return (countbits > 0 && countbits < 127) ? countbits : 0;
}

static int references_name(jl_value_t *p, jl_typename_t *name)
static int references_name(jl_value_t *p, jl_typename_t *name) JL_NOTSAFEPOINT
{
if (jl_is_uniontype(p))
return references_name(((jl_uniontype_t*)p)->a, name) ||
Expand Down Expand Up @@ -362,10 +362,11 @@ void jl_compute_field_offsets(jl_datatype_t *st)

size_t descsz = nfields * sizeof(jl_fielddesc32_t);
jl_fielddesc32_t *desc;
if (descsz < jl_page_size)
desc = (jl_fielddesc32_t*)alloca(descsz);
else
int should_malloc = descsz >= jl_page_size;
if (should_malloc)
desc = (jl_fielddesc32_t*)malloc(descsz);
else
desc = (jl_fielddesc32_t*)alloca(descsz);
int haspadding = 0;
assert(st->name == jl_tuple_typename ||
st == jl_sym_type ||
Expand All @@ -374,7 +375,7 @@ void jl_compute_field_offsets(jl_datatype_t *st)

for (size_t i = 0; i < nfields; i++) {
jl_value_t *ty = jl_field_type(st, i);
size_t fsz = 0, al = 0;
size_t fsz = 0, al = 1;
if (jl_islayout_inline(ty, &fsz, &al)) {
if (__unlikely(fsz > max_size))
// Should never happen
Expand Down Expand Up @@ -427,11 +428,11 @@ void jl_compute_field_offsets(jl_datatype_t *st)
if (st->size > sz)
haspadding = 1;
st->layout = jl_get_layout(nfields, alignm, haspadding, desc);
if (descsz >= jl_page_size) free(desc);
if (should_malloc) free(desc);
jl_allocate_singleton_instance(st);
return;
throw_ovf:
if (descsz >= jl_page_size) free(desc);
if (should_malloc) free(desc);
jl_errorf("type %s has field offset %d that exceeds the page size", jl_symbol_name(st->name->name), descsz);
}

Expand Down Expand Up @@ -873,7 +874,7 @@ JL_DLLEXPORT jl_value_t *jl_get_nth_field_checked(jl_value_t *v, size_t i)
return jl_new_bits(ty, (char*)v + offs);
}

JL_DLLEXPORT void jl_set_nth_field(jl_value_t *v, size_t i, jl_value_t *rhs)
JL_DLLEXPORT void jl_set_nth_field(jl_value_t *v, size_t i, jl_value_t *rhs) JL_NOTSAFEPOINT
{
jl_datatype_t *st = (jl_datatype_t*)jl_typeof(v);
size_t offs = jl_field_offset(st, i);
Expand Down
2 changes: 1 addition & 1 deletion src/julia.h
Original file line number Diff line number Diff line change
Expand Up @@ -1268,7 +1268,7 @@ JL_DLLEXPORT jl_value_t *jl_get_nth_field(jl_value_t *v, size_t i);
JL_DLLEXPORT jl_value_t *jl_get_nth_field_noalloc(jl_value_t *v JL_PROPAGATES_ROOT, size_t i) JL_NOTSAFEPOINT;
JL_DLLEXPORT jl_value_t *jl_get_nth_field_checked(jl_value_t *v, size_t i);
JL_DLLEXPORT void jl_set_nth_field(jl_value_t *v, size_t i,
jl_value_t *rhs);
jl_value_t *rhs) JL_NOTSAFEPOINT;
JL_DLLEXPORT int jl_field_isdefined(jl_value_t *v, size_t i);
JL_DLLEXPORT jl_value_t *jl_get_field(jl_value_t *o, const char *fld);
JL_DLLEXPORT jl_value_t *jl_value_ptr(jl_value_t *a);
Expand Down
3 changes: 2 additions & 1 deletion src/support/dtypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#endif

#include "platform.h"
#include "analyzer_annotations.h"

#if !defined(_OS_WINDOWS_)
#include <inttypes.h>
Expand Down Expand Up @@ -144,7 +145,7 @@ typedef uint32_t uint_t;
typedef int32_t int_t;
#endif

STATIC_INLINE unsigned int next_power_of_two(unsigned int val)
STATIC_INLINE unsigned int next_power_of_two(unsigned int val) JL_NOTSAFEPOINT
{
/* this function taken from libuv src/unix/core.c */
val -= 1;
Expand Down

0 comments on commit 239a40d

Please sign in to comment.