Skip to content

Commit

Permalink
[mono] simdhash tweaks (dotnet#101082)
Browse files Browse the repository at this point in the history
* Optimize simdhash scalar bucket scan to generate chained cmovs instead of conditional branches, and to skip suffix slots that will always be empty
* Optimize temporary copies of hash->buffers out of most simdhash APIs
* Build fixes for ght-compatible simdhash
* Add missing license headers
* Improve simdhash microbenchmark suite and make it compatible with windows x64 MSVC
* Use xoshiro256 to generate random values in microbenchmark, with a fixed seed, instead of libc rand
* Add filtering support to simdhash microbenchmark makefile

Checkpoint dn_simdhash

Checkpoint

Checkpoint

Checkpoint

Checkpoint

Checkpoint

Checkpoint

Checkpoint

Checkpoint

Checkpoint

Add missing files

Checkpoint

Add missing header

Cleanups and more comments

Checkpoint

Fix insertion

Remove generic add and get, they complicate everything for no reason

Build fix

Build fixes

Cleanup

When cascading, wrap around to the first bucket when we reach the end. This reduces wasted space a lot.

Simplify declaring specializations

Cleanup

Convert spaces to tabs

Rearrange things so that find_first_matching_suffix gets inlined

Basic removal implementation

Expand tests

Build fixes

Cleanup

MSVC doesn't support warning preprocessor command so use pragma message

Fix build

Fix build

Fix linker problem by defining string comparison and hasher inline

Match semantics of ghashtable better

Checkpoint

dn_allocator allocations aren't zeroed :)

Cleanup

Use dn_simdhash_string_ptr for namespace lookup cache

Fix build

Allow hiding the default specializations of a simdhash so you can wrap them
Make simdhash_string_ptr pre-compute and cache the length of the string

Cache the hashcode of keys in string_ptr since it makes natural cache alignment possible and speeds up rehashing

Rearrange things to fix C4505

Prohibit declaring multiple specializations in one .c file since it would cause duplicate includes

Maybe fix duplicate include

Fix use of base foreach for string_ptr hashtable

Annotate fallthrough in murmurhash for clang

Manually unroll the murmurhash3 duff's device to satisfy clang

Oops

Fix leaked dn_simdhash_t instance

Cleanup

Fix truncation warning with 64-bit strlen

Workaround linux x64 linker problem

Fix GCC build parse error

Cleanup & rearrange things; attempt to fix GCC build

Updates so test suite works again; verified on linux x64 gcc

Fix indentation

Cleanup

Fix foreaches

Split architecture-specific stuff into its own header

Specializing foreach means key_is_pointer/value_is_pointer aren't needed

Cleanup

Simplify preprocessor token gluing

Cleanup and improve comments

Align the address of the first bucket

Comment out neon for now

Cleanup

Alignment and arch-specific pointer size fixes

Fix ARM clang/gcc build

Maybe fix CI-specific build issue

MSVC docs were wrong :(

Cleanup

Silence MSVC warnings again

Rework string_ptr to avoid pre-computing string length, and use a streaming reformulation of MurmurHash3-32

Cleanup

Add dn_simdhash_u32_ptr and use it in mono_image_init_name_cache

Add missing file

Fix type mismatch

No need to eagerly load the suffixes, and doing so makes scalar fallback codegen much worse

Optimize scalar fallback

Migrate all simdhash fixes and changes from simdhash-2 into simdhash PR #1

Enable ARM NEON support in simdhash since we have system headers now

Update utils header from successor branch

Dedupe + improve 64-bit pointer hash

Fix windows build

Address PR feedback
Do some calculations using uint64_t and bounds check before converting back to uint32_t
Do some key calculations using size_t
Introduce dn_simdhash_assert and use it instead of assert

Broken attempt at configurable assertions

Add ptr_ptr simdhash variant

Use simdhash for interp patch_sites_table
Migrate method and methodref cache to simdhash
Add missing include, fix typo
Migrate data_hash and patchsite_hash to simdhash
Refactoring, add support for remove callback
Add ghashtable-compatible simdhash variant
Migrate 3 tables to dn_simdhash_ght
Change cascade flag into a cascade counter, and clean it up when removing items
Fix cascade counters potentially getting corrupt when trying to add duplicate keys
Attempt to optimize ght variant a little
Correct semantics in get_data_item_wide_index
Migrate bundled_resources to ght and optimize its hash and key comparer
Pre-reserve capacity for some simdhash instances that grow during startup
Reduce initial size of these simdhashes because we have one instance per assembly
Fix bundled_resources by adding ANOTHER hash table
Migrate MonoJitMemoryManager::seq_points to simdhash
Add equivalent operation for g_hash_table_insert_replace
Rename simdhash replace operation to make it clear that it only replaces the value
Adjust modified code to have the same overwrite behavior as the old g_hash_table
Probably meaningless semantic tweak for replace handler

Migrate jit_code_hash and interp_code_hash to simdhash_ptr_ptr

Add safety check

Wrap dn_simdhash_ght_foreach in a COMPONENT_API wrapper so debugger-engine can access it across a linking boundary

Bring back the InternalHashTables, removing them had performance consequences I can't identify the cause of

Fix test

Optimize pointer hash

(testing) force-enable wasm simd for simdhash

Wasm simd codegen tweak

Optimize simdhash search

Refactorings and possible speedup

Optimize bucket scanning

Bucket scan optimization

Repair merge damage

Repair merge damage

Optimize out two memsets in bundled_resources_get

Fix bundled_resources key calculation optimization

Comment out resources_get assertion because it adds measurable startup overhead

Optimize key_from_id

Improve best-case simdhash search performance for matches and failed matches

Repair merge damage
  • Loading branch information
kg committed May 21, 2024
1 parent 24562bc commit dddd11a
Show file tree
Hide file tree
Showing 13 changed files with 107 additions and 60 deletions.
39 changes: 26 additions & 13 deletions src/mono/mono/component/debugger-engine.c
Original file line number Diff line number Diff line change
Expand Up @@ -364,29 +364,42 @@ typedef struct {
GPtrArray *methods;
GPtrArray *method_domains;
GPtrArray *method_seq_points;

MonoDomain *domain;
} CollectDomainData;

static void
collect_domain_bp_inner (gpointer key, gpointer value, gpointer user_data)
{
MonoMethod *m = (MonoMethod *)key;
MonoSeqPointInfo *seq_points = (MonoSeqPointInfo *)value;
CollectDomainData *ud = (CollectDomainData*)user_data;

if (!bp_matches_method (ud->bp, m))
return;

/* Save the info locally to simplify the code inside the domain lock */
g_ptr_array_add (ud->methods, m);
g_ptr_array_add (ud->method_domains, ud->domain);
g_ptr_array_add (ud->method_seq_points, seq_points);
}

// HACK: Address some sort of linker problem on arm64
void
mono_jit_memory_manager_foreach_seq_point (dn_simdhash_ght_t *seq_points, dn_simdhash_ght_foreach_func func, gpointer user_data);

static void
collect_domain_bp (gpointer key, gpointer value, gpointer user_data)
{
GHashTableIter iter;
MonoSeqPointInfo *seq_points;
MonoDomain *domain = (MonoDomain*)key;
CollectDomainData *ud = (CollectDomainData*)user_data;
MonoMethod *m;
ud->domain = (MonoDomain*)key;

// FIXME:
MonoJitMemoryManager *jit_mm = get_default_jit_mm ();
jit_mm_lock (jit_mm);
g_hash_table_iter_init (&iter, jit_mm->seq_points);
while (g_hash_table_iter_next (&iter, (void**)&m, (void**)&seq_points)) {
if (bp_matches_method (ud->bp, m)) {
/* Save the info locally to simplify the code inside the domain lock */
g_ptr_array_add (ud->methods, m);
g_ptr_array_add (ud->method_domains, domain);
g_ptr_array_add (ud->method_seq_points, seq_points);
}
}
// FIXME: This previously used an iterator instead of foreach, so introducing
// an iterator API to simdhash might make it faster.
mono_jit_memory_manager_foreach_seq_point (jit_mm->seq_points, collect_domain_bp_inner, ud);
jit_mm_unlock (jit_mm);
}

Expand Down
2 changes: 2 additions & 0 deletions src/mono/mono/metadata/class.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@
#include <mono/utils/unlocked.h>
#include <mono/utils/bsearch.h>
#include <mono/utils/checked-build.h>
// for dn_simdhash_ght_t
#include "../native/containers/dn-simdhash-specializations.h"

MonoStats mono_stats;

Expand Down
17 changes: 10 additions & 7 deletions src/mono/mono/metadata/metadata.c
Original file line number Diff line number Diff line change
Expand Up @@ -2552,10 +2552,10 @@ mono_metadata_signature_dup_delegate_invoke_to_target (MonoMethodSignature *sig)
* @param sig The original method signature.
* @param num_params The number parameters in the new signature.
* @param new_params An array of MonoType pointers representing the new parameters.
*
*
* Duplicate an existing \c MonoMethodSignature but with a new set of parameters.
* This is a Mono runtime internal function.
*
*
* @return the new \c MonoMethodSignature structure.
*/
MonoMethodSignature*
Expand All @@ -2564,7 +2564,7 @@ mono_metadata_signature_dup_new_params (MonoMemPool *mp, MonoMethodSignature *si
size_t new_sig_size = MONO_SIZEOF_METHOD_SIGNATURE + num_params * sizeof (MonoType*);
if (sig->ret)
new_sig_size += mono_sizeof_type (sig->ret);

MonoMethodSignature *res = (MonoMethodSignature *)mono_mempool_alloc0 (mp, (unsigned int)new_sig_size);
memcpy (res, sig, MONO_SIZEOF_METHOD_SIGNATURE);
res->param_count = GUINT32_TO_UINT16 (num_params);
Expand Down Expand Up @@ -3323,7 +3323,7 @@ MonoMethodSignature *
mono_metadata_get_inflated_signature (MonoMethodSignature *sig, MonoGenericContext *context)
{
MonoInflatedMethodSignature helper;
MonoInflatedMethodSignature *res;
MonoInflatedMethodSignature *res = NULL;
CollectData data;

helper.sig = sig;
Expand All @@ -3338,16 +3338,19 @@ mono_metadata_get_inflated_signature (MonoMethodSignature *sig, MonoGenericConte
mono_mem_manager_lock (mm);

if (!mm->gsignature_cache)
mm->gsignature_cache = g_hash_table_new_full (inflated_signature_hash, inflated_signature_equal, NULL, (GDestroyNotify)free_inflated_signature);
// FIXME: Pick a better pre-reserved size
mm->gsignature_cache = dn_simdhash_ght_new_full (inflated_signature_hash, inflated_signature_equal, NULL, (GDestroyNotify)free_inflated_signature, 256, NULL);

// FIXME: The lookup is done on the newly allocated sig so it always fails
res = (MonoInflatedMethodSignature *)g_hash_table_lookup (mm->gsignature_cache, &helper);
dn_simdhash_ght_try_get_value (mm->gsignature_cache, &helper, (gpointer *)&res);
if (!res) {
res = mono_mem_manager_alloc0 (mm, sizeof (MonoInflatedMethodSignature));
// FIXME: sig is an inflated signature not owned by the mem manager
res->sig = sig;
res->context.class_inst = context->class_inst;
res->context.method_inst = context->method_inst;
g_hash_table_insert (mm->gsignature_cache, res, res);
// FIXME: We're wasting memory and cpu by storing key and value redundantly for this table
dn_simdhash_ght_insert (mm->gsignature_cache, res, res);
}

mono_mem_manager_unlock (mm);
Expand Down
4 changes: 2 additions & 2 deletions src/mono/mono/mini/aot-runtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -3417,8 +3417,8 @@ decode_exception_debug_info (MonoAotModule *amodule,
jit_mm_lock (jit_mm);
/* This could be set already since this function can be called more than once for the same method */
MonoSeqPointInfo *existing_seq_points = NULL;
if (!g_hash_table_lookup_extended (jit_mm->seq_points, method, NULL, (gpointer *)&existing_seq_points)) {
g_hash_table_insert (jit_mm->seq_points, method, seq_points);
if (!dn_simdhash_ght_try_get_value (jit_mm->seq_points, method, (void **)&existing_seq_points)) {
dn_simdhash_ght_insert (jit_mm->seq_points, method, seq_points);
} else {
mono_seq_point_info_free (seq_points);
seq_points = existing_seq_points;
Expand Down
25 changes: 16 additions & 9 deletions src/mono/mono/mini/interp/tiering.c
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
#include "tiering.h"

static mono_mutex_t tiering_mutex;
static GHashTable *patch_sites_table;
// FIXME: The add/remove traffic on this table may require dn_simdhash to implement cascade flag cleanup
// and compaction
static dn_simdhash_ptr_ptr_t *patch_sites_table;
static gboolean enable_tiering;

void
mono_interp_tiering_init (void)
{
mono_os_mutex_init_recursive (&tiering_mutex);
patch_sites_table = g_hash_table_new (NULL, NULL);
patch_sites_table = dn_simdhash_ptr_ptr_new (0, NULL);
enable_tiering = TRUE;
}

Expand Down Expand Up @@ -61,11 +63,12 @@ patch_imethod_site (gpointer data, gpointer user_data)
static void
patch_interp_data_items (InterpMethod *old_imethod, InterpMethod *new_imethod)
{
GSList *sites = g_hash_table_lookup (patch_sites_table, old_imethod);
g_slist_foreach (sites, patch_imethod_site, new_imethod);

g_hash_table_remove (patch_sites_table, old_imethod);
g_slist_free (sites);
GSList *sites = NULL;
if (dn_simdhash_ptr_ptr_try_get_value (patch_sites_table, old_imethod, (void **)&sites)) {
g_slist_foreach (sites, patch_imethod_site, new_imethod);
dn_simdhash_ptr_ptr_try_remove (patch_sites_table, old_imethod);
g_slist_free (sites);
}
}

static InterpMethod*
Expand Down Expand Up @@ -100,9 +103,13 @@ static void
register_imethod_patch_site (InterpMethod *imethod, gpointer *ptr)
{
g_assert (!imethod->optimized);
GSList *sites = g_hash_table_lookup (patch_sites_table, imethod);
GSList *sites = NULL;
guint8 found = dn_simdhash_ptr_ptr_try_get_value (patch_sites_table, imethod, (void **)&sites);
sites = g_slist_prepend (sites, ptr);
g_hash_table_insert_replace (patch_sites_table, imethod, sites, TRUE);
if (found)
dn_simdhash_ptr_ptr_try_replace_value (patch_sites_table, imethod, sites);
else
dn_simdhash_ptr_ptr_try_add (patch_sites_table, imethod, sites);
}

static void
Expand Down
31 changes: 19 additions & 12 deletions src/mono/mono/mini/interp/transform.c
Original file line number Diff line number Diff line change
Expand Up @@ -1146,7 +1146,8 @@ init_last_ins_call (TransformData *td)
static guint32
get_data_item_wide_index (TransformData *td, void *ptr, gboolean *new_slot)
{
gpointer p = g_hash_table_lookup (td->data_hash, ptr);
gpointer p = NULL;
guint8 found = dn_simdhash_ptr_ptr_try_get_value (td->data_hash, ptr, (void **)&p);
guint32 index;
if (p != NULL) {
if (new_slot)
Expand All @@ -1160,7 +1161,10 @@ get_data_item_wide_index (TransformData *td, void *ptr, gboolean *new_slot)
index = td->n_data_items;
td->data_items [index] = ptr;
++td->n_data_items;
g_hash_table_insert (td->data_hash, ptr, GUINT_TO_POINTER (index + 1));
if (found)
dn_simdhash_ptr_ptr_try_replace_value (td->data_hash, ptr, GUINT_TO_POINTER (index + 1));
else
dn_simdhash_ptr_ptr_try_add (td->data_hash, ptr, GUINT_TO_POINTER (index + 1));
if (new_slot)
*new_slot = TRUE;
return index;
Expand Down Expand Up @@ -2998,7 +3002,7 @@ interp_inline_method (TransformData *td, MonoMethod *target_method, MonoMethodHe

/* Remove any newly added items */
for (i = prev_n_data_items; i < td->n_data_items; i++) {
g_hash_table_remove (td->data_hash, td->data_items [i]);
dn_simdhash_ptr_ptr_try_remove (td->data_hash, td->data_items [i]);
}
td->n_data_items = prev_n_data_items;
/* Also remove any added indexes from the imethod list */
Expand Down Expand Up @@ -3969,7 +3973,8 @@ interp_transform_call (TransformData *td, MonoMethod *method, MonoMethod *target
if (MINT_IS_PATCHABLE_CALL (td->last_ins->opcode)) {
g_assert (!calli && !is_virtual);
td->last_ins->flags |= INTERP_INST_FLAG_RECORD_CALL_PATCH;
g_hash_table_insert (td->patchsite_hash, td->last_ins, target_method);
if (!dn_simdhash_ptr_ptr_try_add (td->patchsite_hash, td->last_ins, target_method))
dn_simdhash_ptr_ptr_try_replace (td->patchsite_hash, td->last_ins, target_method);
}
#endif
}
Expand Down Expand Up @@ -8954,9 +8959,10 @@ emit_compacted_instruction (TransformData *td, guint16* start_ip, InterpInst *in
g_assert (MINT_IS_PATCHABLE_CALL (opcode));

/* TODO: could `ins` be removed by any interp optimization? */
MonoMethod *target_method = (MonoMethod *) g_hash_table_lookup (td->patchsite_hash, ins);
MonoMethod *target_method = NULL;
dn_simdhash_ptr_ptr_try_get_value (td->patchsite_hash, ins, (void **)&target_method);
g_assert (target_method);
g_hash_table_remove (td->patchsite_hash, ins);
dn_simdhash_ptr_ptr_try_remove (td->patchsite_hash, ins);

mini_tiered_record_callsite (start_ip, target_method, TIERED_PATCH_KIND_INTERP);

Expand Down Expand Up @@ -9246,9 +9252,9 @@ generate (MonoMethod *method, MonoMethodHeader *header, InterpMethod *rtm, MonoG
td->dummy_var = -1;
td->ref_handle_var = -1;
td->data_items = NULL;
td->data_hash = g_hash_table_new (NULL, NULL);
td->data_hash = dn_simdhash_ptr_ptr_new (0, NULL);
#ifdef ENABLE_EXPERIMENT_TIERED
td->patchsite_hash = g_hash_table_new (NULL, NULL);
td->patchsite_hash = dn_simdhash_ptr_ptr_new (0, NULL);
#endif
td->gen_seq_points = !mini_debug_options.no_seq_points_compact_data || mini_debug_options.gen_sdb_seq_points;
td->gen_sdb_seq_points = mini_debug_options.gen_sdb_seq_points;
Expand Down Expand Up @@ -9469,9 +9475,9 @@ generate (MonoMethod *method, MonoMethodHeader *header, InterpMethod *rtm, MonoG
g_free (td->renamable_vars);
g_free (td->renamed_fixed_vars);
g_free (td->local_ref_count);
g_hash_table_destroy (td->data_hash);
dn_simdhash_free (td->data_hash);
#ifdef ENABLE_EXPERIMENT_TIERED
g_hash_table_destroy (td->patchsite_hash);
dn_simdhash_free (td->patchsite_hash);
#endif
g_ptr_array_free (td->seq_points, TRUE);
if (td->line_numbers)
Expand Down Expand Up @@ -9652,9 +9658,10 @@ mono_interp_transform_method (InterpMethod *imethod, ThreadContext *context, Mon

// FIXME Publishing of seq points seems to be racy with tiereing. We can have both tiered and untiered method
// running at the same time. We could therefore get the optimized imethod seq points for the unoptimized method.
gpointer seq_points = g_hash_table_lookup (jit_mm->seq_points, imethod->method);
gpointer seq_points = NULL;
dn_simdhash_ght_try_get_value (jit_mm->seq_points, imethod->method, (void **)&seq_points);
if (!seq_points || seq_points != imethod->jinfo->seq_points)
g_hash_table_replace (jit_mm->seq_points, imethod->method, imethod->jinfo->seq_points);
dn_simdhash_ght_replace (jit_mm->seq_points, imethod->method, imethod->jinfo->seq_points);
}
jit_mm_unlock (jit_mm);

Expand Down
8 changes: 5 additions & 3 deletions src/mono/mono/mini/interp/transform.h
Original file line number Diff line number Diff line change
Expand Up @@ -311,10 +311,12 @@ typedef struct
int n_data_items;
int max_data_items;
void **data_items;
GHashTable *data_hash;
// FIXME: ptr_u32
dn_simdhash_ptr_ptr_t *data_hash;
GSList *imethod_items;
#ifdef ENABLE_EXPERIMENT_TIERED
GHashTable *patchsite_hash;
// FIXME: ptr_u32
dn_simdhash_ptr_ptr_t *patchsite_hash;
#endif
int *clause_indexes;
int *clause_vars;
Expand Down Expand Up @@ -504,7 +506,7 @@ interp_dump_ins (InterpInst *ins, gpointer *data_items);
InterpInst*
interp_get_ldc_i4_from_const (TransformData *td, InterpInst *ins, gint32 ct, int dreg);

gint32
gint32
interp_get_const_from_ldc_i4 (InterpInst *ins);

int
Expand Down
2 changes: 1 addition & 1 deletion src/mono/mono/mini/interp/whitebox.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ transform_method (MonoDomain *domain, MonoImage *image, TestItem *ti)
td->rtm = rtm;
td->clause_indexes = (int*)g_malloc (header->code_size * sizeof (int));
td->data_items = NULL;
td->data_hash = g_hash_table_new (NULL, NULL);
td->data_hash = dn_simdhash_ptr_ptr_new (0, NULL);
/* TODO: init more fields of `td` */

mono_test_interp_method_compute_offsets (td, rtm, signature, header);
Expand Down
15 changes: 11 additions & 4 deletions src/mono/mono/mini/mini-runtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -3027,7 +3027,7 @@ mono_jit_free_method (MonoMethod *method)
//seq_points are always on get_default_jit_mm
jit_mm = get_default_jit_mm ();
jit_mm_lock (jit_mm);
g_hash_table_remove (jit_mm->seq_points, method);
dn_simdhash_ght_try_remove (jit_mm->seq_points, method);
jit_mm_unlock (jit_mm);

jit_mm = jit_mm_for_method (method);
Expand All @@ -3043,7 +3043,7 @@ mono_jit_free_method (MonoMethod *method)
mono_conc_hashtable_remove (jit_mm->runtime_invoke_hash, method);
g_hash_table_remove (jit_mm->dynamic_code_hash, method);
g_hash_table_remove (jit_mm->jump_trampoline_hash, method);
g_hash_table_remove (jit_mm->seq_points, method);
dn_simdhash_ght_try_remove (jit_mm->seq_points, method);

g_hash_table_iter_init (&iter, jit_mm->jump_target_hash);
while (g_hash_table_iter_next (&iter, NULL, (void**)&jlist)) {
Expand Down Expand Up @@ -4380,7 +4380,7 @@ init_jit_mem_manager (MonoMemoryManager *mem_manager)
info->jump_target_hash = g_hash_table_new (NULL, NULL);
info->jit_trampoline_hash = g_hash_table_new (mono_aligned_addr_hash, NULL);
info->delegate_info_hash = g_hash_table_new (delegate_class_method_pair_hash, delegate_class_method_pair_equal);
info->seq_points = g_hash_table_new_full (mono_aligned_addr_hash, NULL, NULL, mono_seq_point_info_free);
info->seq_points = dn_simdhash_ght_new_full (mono_aligned_addr_hash, NULL, NULL, mono_seq_point_info_free, 0, NULL);
info->runtime_invoke_hash = mono_conc_hashtable_new_full (mono_aligned_addr_hash, NULL, NULL, runtime_invoke_info_free);
info->arch_seq_points = g_hash_table_new (mono_aligned_addr_hash, NULL);
mono_jit_code_hash_init (&info->jit_code_hash);
Expand Down Expand Up @@ -4453,7 +4453,7 @@ free_jit_mem_manager (MonoMemoryManager *mem_manager)
g_hash_table_destroy (info->static_rgctx_trampoline_hash);
g_hash_table_destroy (info->mrgctx_hash);
mono_conc_hashtable_destroy (info->runtime_invoke_hash);
g_hash_table_destroy (info->seq_points);
dn_simdhash_free (info->seq_points);
g_hash_table_destroy (info->arch_seq_points);
if (info->agent_info)
mono_component_debugger ()->free_mem_manager (info);
Expand Down Expand Up @@ -5603,3 +5603,10 @@ mono_jit_call_can_be_supported_by_interp (MonoMethod *method, MonoMethodSignatur

return TRUE;
}

void
mono_jit_memory_manager_foreach_seq_point (dn_simdhash_ght_t *seq_points, dn_simdhash_ght_foreach_func func, gpointer user_data)
{
g_assert (seq_points);
dn_simdhash_ght_foreach (seq_points, func, user_data);
}
5 changes: 4 additions & 1 deletion src/mono/mono/mini/mini-runtime.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ typedef struct {
MonoConcurrentHashTable *runtime_invoke_hash;
/* Maps MonoMethod to a GPtrArray containing sequence point locations */
/* Protected by the domain lock */
GHashTable *seq_points;
dn_simdhash_ght_t *seq_points;
/* Debugger agent data */
gpointer agent_info;
/* Maps MonoMethod to an arch-specific structure */
Expand Down Expand Up @@ -660,6 +660,9 @@ mono_is_addr_implicit_null_check (void *addr);
gboolean
mono_jit_call_can_be_supported_by_interp (MonoMethod *method, MonoMethodSignature *sig, gboolean is_llvm_only);

MONO_COMPONENT_API void
mono_jit_memory_manager_foreach_seq_point (dn_simdhash_ght_t *seq_points, dn_simdhash_ght_foreach_func func, gpointer user_data);

/*
* Signal handling
*/
Expand Down
Loading

0 comments on commit dddd11a

Please sign in to comment.