glean/rts/ffi.h (497 lines of code) (raw):
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#ifdef __cplusplus
template <typename T> struct HsArray;
#endif
#ifdef __cplusplus
namespace facebook {
namespace glean {
namespace binary {
#endif
typedef struct Output Output;
#ifdef __cplusplus
}
}
}
#endif
#ifdef __cplusplus
namespace facebook {
namespace glean {
namespace rts {
#endif
// @lint-ignore-every CLANGTIDY facebook-hte-Typedef
typedef struct Lookup Lookup;
typedef struct Define Define;
typedef struct FactSet FactSet;
typedef struct Inventory Inventory;
typedef struct LookupCache LookupCache;
typedef struct Predicate Predicate;
typedef struct Substitution Substitution;
typedef struct QueryResults QueryResults;
typedef struct OwnershipUnitIterator OwnershipUnitIterator;
typedef struct DerivedFactOwnershipIterator DerivedFactOwnershipIterator;
typedef struct Ownership Ownership;
typedef struct DefineOwnership DefineOwnership;
typedef struct ComputedOwnership ComputedOwnership;
typedef struct Slice Slice;
typedef struct Sliced Sliced;
#ifdef __cplusplus
}
}
}
#endif
#ifdef __cplusplus
namespace facebook {
namespace glean {
namespace rts {
namespace c {
using binary::Output;
#endif
typedef struct SharedLookupCacheStats SharedLookupCacheStats;
typedef struct SharedSubroutine SharedSubroutine;
typedef struct FactCount {
uint64_t pid;
uint64_t count;
} FactCount;
#ifdef __cplusplus
using FactOrder = HsArray<int64_t>;
using OwnershipSet = HsArray<uint32_t>;
#else
typedef void FactOrder;
typedef void OwnershipSet;
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef int64_t glean_fact_id_t;
typedef int64_t glean_predicate_id_t;
const char *glean_inventory_new(
size_t count,
const int64_t *ids,
const void * const *name_ptrs,
const size_t *name_sizes,
const int32_t *versions,
SharedSubroutine * const *typecheckers,
SharedSubroutine * const *traversals,
Inventory **inventory
);
void glean_inventory_free(
Inventory *inventory
);
const char *glean_inventory_predicates(
Inventory *inventory,
size_t *count,
const Predicate ***predicates
);
const char *glean_inventory_serialize(
Inventory *inventory,
const void **data,
size_t *size
);
const char *glean_inventory_deserialize(
const void *data,
size_t size,
Inventory **inventory
);
const char *glean_inventory_equal(
const Inventory *first,
const Inventory *second,
bool *result
);
const char *glean_predicate_unpack(
Predicate *predicate,
int64_t *id,
const void **name,
size_t *name_size,
int32_t *version
);
const char *glean_snapshot_new(
Lookup *base,
int64_t boundary,
Lookup **snapshot
);
const char *glean_lookupcache_stats_new(
SharedLookupCacheStats **stats
);
void glean_lookupcache_stats_free(
SharedLookupCacheStats *stats
);
void glean_lookupcache_stats_read_and_reset_counters(
SharedLookupCacheStats *stats,
uint64_t *values,
size_t size
);
const char *glean_lookupcache_new(
size_t capacity,
size_t shards,
SharedLookupCacheStats *stats,
LookupCache **cache
);
void glean_lookupcache_free(
LookupCache *cache
);
const char *glean_lookupcache_clear(
LookupCache *cache
);
const char *glean_lookupcache_anchor_new(
Lookup *base,
LookupCache *cache,
Lookup **anchor
);
void glean_lookupcache_anchor_free(
Lookup *anchor
);
const char *glean_query_execute_compiled(
Inventory *inventory,
Define *facts,
DefineOwnership *ownership,
SharedSubroutine *sub,
uint64_t pid,
SharedSubroutine *traverse,
uint64_t max_results,
uint64_t max_bytes,
uint64_t max_time_ms,
uint64_t recursive,
uint64_t *expand_pids,
uint64_t num_expand_pids,
uint64_t want_stats,
QueryResults **presults
);
const char *glean_query_restart_compiled(
Inventory *inventory,
Define *facts,
DefineOwnership *ownership,
void *cont,
int64_t cont_size,
uint64_t max_results,
uint64_t max_bytes,
uint64_t max_time_ms,
uint64_t recursive,
uint64_t *expand_pids,
uint64_t num_expand_pids,
uint64_t want_stats,
QueryResults **results
);
void glean_lookup_free(
Lookup *lookup
);
const char *glean_lookup_starting_id(
Lookup *lookup,
int64_t *id
);
const char *glean_lookup_first_free_id(
Lookup *lookup,
int64_t *id
);
const char *glean_lookup_fact(
Lookup *lookup,
int64_t id,
int64_t *type,
void **key,
size_t *key_size,
void **value,
size_t *value_size
);
const char *glean_define_fact(
Define *facts,
glean_predicate_id_t predicate,
Output *clause,
size_t key_size,
glean_fact_id_t *id
);
const char *glean_define_untrusted_batch(
Define *facts,
Inventory *inventory,
int64_t batch_first_id,
const int64_t *ids,
size_t batch_count,
const void *batch_facts_data,
size_t batch_facts_size,
Substitution **subst
);
const char *glean_new_subst(
int64_t first,
size_t size,
Substitution **subst
);
void glean_free_subst(
Substitution *subst
);
const char *glean_subst_compose(
const Substitution *first,
const Substitution *second,
Substitution **result
);
const char *glean_serialize_subst(
const Substitution *subst,
int64_t *firstId,
size_t *count,
int64_t **ids
);
const char *glean_subst_intervals(
const Substitution *subst,
const glean_fact_id_t *ins,
size_t ins_size,
glean_fact_id_t **outs,
size_t *outs_size
);
const char *glean_factset_new(
int64_t first_id,
FactSet **facts
);
void glean_factset_free(
FactSet *facts
);
size_t glean_factset_fact_memory(
FactSet *facts
);
Lookup *glean_factset_lookup(FactSet *facts);
Define *glean_factset_define(FactSet *define);
const char *glean_factset_serialize(
FactSet *facts,
int64_t *first_id,
size_t *count,
void **facts_data,
size_t *facts_size
);
const char *glean_factset_serializeReorder(
FactSet *facts,
uint64_t *order,
size_t order_size,
int64_t *first_id,
size_t *count,
void **facts_data,
size_t *facts_size
);
const char *glean_factset_append(
FactSet *target,
FactSet *source
);
const char *glean_stacked_lookup_new(
Lookup *base,
Lookup *added,
Lookup **stacked
);
const char *glean_stacked_define_new(
Lookup *base,
Define *added,
Define **stacked
);
void glean_stacked_define_free(
Define *stacked
);
const char *glean_new_builder(
Output **builder
);
void glean_free_builder(
Output *builder
);
size_t glean_builder_size(
Output *builder
);
const char *glean_finish_builder(
Output *builder,
void **data,
size_t *size
);
const char *glean_reset_builder(
Output *builder
);
const char *glean_push_value_byte(
Output *builder,
unsigned char val
);
const char *glean_push_value_bytes(
Output *builder,
const void *data,
size_t size
);
const char *glean_push_value_nat(
Output *builder,
uint64_t val
);
const char *glean_push_value_array(
Output *builder,
size_t size
);
const char *glean_push_value_selector(
Output *builder,
size_t selector
);
const char *glean_push_value_string(
Output *builder,
const void *data,
size_t size
);
const char *glean_push_value_fact(
Output *builder,
glean_fact_id_t fact
);
const char *glean_pop_value_byte(
const void **start,
const void *end,
uint8_t *byte);
const char *glean_pop_value_nat(
const void **start,
const void *end,
uint64_t *nat);
const char *glean_pop_value_array(
const void **start,
const void *end,
size_t *size);
const char *glean_pop_value_bytes_ref(
const void **start,
const void *end,
size_t size,
const void **bytes);
const char *glean_pop_value_bytes(
const void **start,
const void *end,
size_t size,
void **bytes);
const char *glean_pop_value_selector(
const void **start,
const void *end,
size_t *selector);
size_t glean_pop_value_trusted_string_ref(
const void **start,
const void *end);
const char *glean_pop_value_string(
const void **start,
const void *end,
void **bytes,
size_t *size);
const char *glean_pop_value_fact(
const void **start,
const void *end,
glean_fact_id_t *fact);
const char *glean_push_fact(
Output *builder,
int64_t pid,
Output *data,
size_t key_size
);
size_t glean_string_demangle_trusted(
const uint8_t *start,
size_t size,
uint8_t *buffer
);
void glean_free_query_results(
QueryResults *results
);
const char *glean_subroutine_new(
const uint64_t *code,
size_t code_size,
size_t inputs,
size_t outputs,
size_t locals,
const uint64_t *constants_ptr,
size_t constants_size,
const void * const *literal_ptrs,
const size_t *literal_sizes,
size_t literal_count,
SharedSubroutine **sub
);
void glean_subroutine_free(
SharedSubroutine *sub
);
void glean_subroutine_inspect(
SharedSubroutine *sub,
const uint64_t **code,
size_t *code_size,
size_t *inputs,
size_t *outputs,
size_t *locals,
const uint64_t **constants,
size_t *constants_size,
size_t *lit_count);
size_t glean_subroutine_size(
SharedSubroutine *sub);
void glean_subroutine_literal(
SharedSubroutine *sub,
size_t index,
const void **ptr,
size_t *size);
const char *glean_invoke_typechecker(
const SharedSubroutine *typechecker,
const void *input,
size_t input_size,
void **output,
size_t *output_size
);
const char *glean_validate(
const Inventory *inventory,
char typecheck,
char keys,
size_t limit,
Lookup *lookup
);
void glean_ownership_unit_iterator_free(
OwnershipUnitIterator *
);
void glean_derived_fact_ownership_iterator_free(
DerivedFactOwnershipIterator *
);
const char *glean_ownership_compute(
Inventory *inventory,
Lookup *lookup,
OwnershipUnitIterator *iter,
ComputedOwnership **ownership
);
void glean_ownership_free(Ownership *own);
void glean_computed_ownership_free(ComputedOwnership *own);
const char *glean_get_ownership_set(
Ownership *ownership,
uint32_t uset_id,
int *op,
OwnershipSet **result
);
const char *glean_get_fact_owner(
Ownership *ownership,
glean_fact_id_t fact,
uint32_t *uset_id
);
const char *glean_slice_compute(
Ownership *ownership,
uint32_t *unit_ids,
size_t unit_ids_size,
int exclude,
Slice **slice
);
void glean_slice_free(Slice *slice);
const char *glean_make_sliced(
Lookup *lookup,
Ownership *ownership,
Slice *slice,
Sliced **sliced
);
void glean_sliced_free(Sliced *sliced);
const char *glean_new_define_ownership(
Ownership *own,
int64_t pid,
int64_t first_id,
DefineOwnership **result
);
const char *glean_define_ownership_subst(
DefineOwnership *define,
const Substitution *subst
);
const char *glean_define_ownership_sort_by_owner(
DefineOwnership *define,
uint64_t facts,
FactOrder *result
);
void glean_define_ownership_free(DefineOwnership *def);
const char *glean_derived_ownership_compute(
Ownership *own,
DerivedFactOwnershipIterator *iter,
ComputedOwnership **result
);
#ifdef __cplusplus
}
}
}
}
}
#endif