Skip to content

Commit 2b21dcd

Browse files
authored
[mono] Extend mono AOT compiler to ingest .mibc profiles (#70194)
* [mono] Add non_executable field to MonoImage to properly load MethodRef in .mibc files * [mono][aot] Extend mono-aot-compiler to handle .mibc profile * [tasks] Extend MonoAOTCompiler task to handle .mibc profiles * Address feedback * Add method descriptions * Address more feedback
1 parent f1cd516 commit 2b21dcd

File tree

6 files changed

+320
-102
lines changed

6 files changed

+320
-102
lines changed

src/mono/mono/metadata/assembly.c

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -969,24 +969,21 @@ mono_assembly_load_reference (MonoImage *image, int index)
969969
goto commit_reference;
970970
}
971971

972-
if (image->assembly) {
973-
if (mono_trace_is_traced (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY)) {
974-
char *aname_str = mono_stringify_assembly_name (&aname);
975-
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_ASSEMBLY, "Loading reference %d of %s (%s), looking for %s",
976-
index, image->name, mono_alc_is_default (mono_image_get_alc (image)) ? "default ALC" : "custom ALC" ,
977-
aname_str);
978-
g_free (aname_str);
979-
}
980-
981-
MonoAssemblyByNameRequest req;
982-
mono_assembly_request_prepare_byname (&req, mono_image_get_alc (image));
983-
req.requesting_assembly = image->assembly;
984-
//req.no_postload_search = TRUE; // FIXME: should this be set?
985-
reference = mono_assembly_request_byname (&aname, &req, NULL);
986-
} else {
987-
g_assertf (image->assembly, "While loading reference %d MonoImage %s doesn't have a MonoAssembly", index, image->name);
972+
g_assertf (image->assembly || image->not_executable, "While loading reference %d, executable MonoImage %s doesn't have a MonoAssembly", index, image->name);
973+
if (mono_trace_is_traced (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY)) {
974+
char *aname_str = mono_stringify_assembly_name (&aname);
975+
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_ASSEMBLY, "Loading reference %d of %s (%s), looking for %s",
976+
index, image->name, mono_alc_is_default (mono_image_get_alc (image)) ? "default ALC" : "custom ALC" ,
977+
aname_str);
978+
g_free (aname_str);
988979
}
989980

981+
MonoAssemblyByNameRequest req;
982+
mono_assembly_request_prepare_byname (&req, mono_image_get_alc (image));
983+
req.requesting_assembly = image->assembly;
984+
//req.no_postload_search = TRUE; // FIXME: should this be set?
985+
reference = mono_assembly_request_byname (&aname, &req, NULL);
986+
990987
if (reference == NULL){
991988
char *extra_msg;
992989

@@ -1602,8 +1599,10 @@ mono_assembly_request_open (const char *filename, const MonoAssemblyOpenRequest
16021599
loaded_from_bundle = image != NULL;
16031600
}
16041601

1605-
if (!image)
1606-
image = mono_image_open_a_lot (load_req.alc, fname, status);
1602+
if (!image) {
1603+
MonoImageOpenOptions options = {0, };
1604+
image = mono_image_open_a_lot (load_req.alc, fname, status, &options);
1605+
}
16071606

16081607
if (!image){
16091608
if (*status == MONO_IMAGE_OK)

src/mono/mono/metadata/image-internals.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,17 @@
99
#include <mono/metadata/image.h>
1010
#include <mono/metadata/loader-internals.h>
1111

12+
typedef struct {
13+
int dont_care_about_cli : 1;
14+
int dont_care_about_pecoff : 1;
15+
} MonoImageLoadOptions;
16+
17+
typedef struct {
18+
MonoImageLoadOptions load_options;
19+
int not_executable : 1;
20+
int metadata_only : 1;
21+
} MonoImageOpenOptions;
22+
1223
MonoImage*
1324
mono_image_loaded_internal (MonoAssemblyLoadContext *alc, const char *name);
1425

@@ -19,6 +30,6 @@ MonoImage*
1930
mono_image_load_module_checked (MonoImage *image, int idx, MonoError *error);
2031

2132
MonoImage *
22-
mono_image_open_a_lot (MonoAssemblyLoadContext *alc, const char *fname, MonoImageOpenStatus *status);
33+
mono_image_open_a_lot (MonoAssemblyLoadContext *alc, const char *fname, MonoImageOpenStatus *status, const MonoImageOpenOptions *options);
2334

2435
#endif /* __MONO_METADATA_IMAGE_INTERNALS_H__ */

src/mono/mono/metadata/image.c

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ mono_images_unlock(void)
104104
}
105105

106106
static MonoImage *
107-
mono_image_open_a_lot_parameterized (MonoLoadedImages *li, MonoAssemblyLoadContext *alc, const char *fname, MonoImageOpenStatus *status);
107+
mono_image_open_a_lot_parameterized (MonoLoadedImages *li, MonoAssemblyLoadContext *alc, const char *fname, MonoImageOpenStatus *status, const MonoImageOpenOptions *options);
108108

109109
/* Maps string keys to MonoImageStorage values.
110110
*
@@ -1174,8 +1174,7 @@ dump_encmap (MonoImage *image)
11741174
}
11751175

11761176
static MonoImage *
1177-
do_mono_image_load (MonoImage *image, MonoImageOpenStatus *status,
1178-
gboolean care_about_cli, gboolean care_about_pecoff)
1177+
do_mono_image_load (MonoImage *image, MonoImageOpenStatus *status, const MonoImageLoadOptions *options)
11791178
{
11801179
ERROR_DECL (error);
11811180
GSList *l;
@@ -1201,7 +1200,7 @@ do_mono_image_load (MonoImage *image, MonoImageOpenStatus *status,
12011200
if (status)
12021201
*status = MONO_IMAGE_IMAGE_INVALID;
12031202

1204-
if (care_about_pecoff == FALSE)
1203+
if (options->dont_care_about_pecoff == TRUE)
12051204
goto done;
12061205

12071206
if (!mono_image_load_pe_data (image))
@@ -1210,7 +1209,7 @@ do_mono_image_load (MonoImage *image, MonoImageOpenStatus *status,
12101209
image->loader = (MonoImageLoader*)&pe_loader;
12111210
}
12121211

1213-
if (care_about_cli == FALSE) {
1212+
if (options->dont_care_about_cli == TRUE) {
12141213
goto done;
12151214
}
12161215

@@ -1409,8 +1408,7 @@ mono_image_storage_new_raw_data (char *datac, guint32 data_len, gboolean raw_dat
14091408
}
14101409

14111410
static MonoImage *
1412-
do_mono_image_open (MonoAssemblyLoadContext *alc, const char *fname, MonoImageOpenStatus *status,
1413-
gboolean care_about_cli, gboolean care_about_pecoff, gboolean metadata_only)
1411+
do_mono_image_open (MonoAssemblyLoadContext *alc, const char *fname, MonoImageOpenStatus *status, const MonoImageOpenOptions *options)
14141412
{
14151413
MonoCLIImageInfo *iinfo;
14161414
MonoImage *image;
@@ -1424,6 +1422,7 @@ do_mono_image_open (MonoAssemblyLoadContext *alc, const char *fname, MonoImageOp
14241422
}
14251423

14261424
image = g_new0 (MonoImage, 1);
1425+
image->ref_count = 1;
14271426
image->storage = storage;
14281427
mono_image_init_raw_data (image, storage);
14291428
if (!image->raw_data) {
@@ -1433,14 +1432,14 @@ do_mono_image_open (MonoAssemblyLoadContext *alc, const char *fname, MonoImageOp
14331432
*status = MONO_IMAGE_IMAGE_INVALID;
14341433
return NULL;
14351434
}
1436-
iinfo = g_new0 (MonoCLIImageInfo, 1);
1437-
image->image_info = iinfo;
1435+
image->not_executable = !!options->not_executable;
1436+
image->metadata_only = !!options->metadata_only;
14381437
image->name = mono_path_resolve_symlinks (fname);
14391438
image->filename = g_strdup (image->name);
1440-
image->metadata_only = !!metadata_only;
1441-
image->ref_count = 1;
1439+
iinfo = g_new0 (MonoCLIImageInfo, 1);
1440+
image->image_info = iinfo;
14421441
image->alc = alc;
1443-
return do_mono_image_load (image, status, care_about_cli, care_about_pecoff);
1442+
return do_mono_image_load (image, status, &options->load_options);
14441443
}
14451444

14461445
/**
@@ -1627,7 +1626,8 @@ mono_image_open_from_data_internal (MonoAssemblyLoadContext *alc, char *data, gu
16271626
image->ref_count = 1;
16281627
image->alc = alc;
16291628

1630-
image = do_mono_image_load (image, status, TRUE, TRUE);
1629+
MonoImageLoadOptions options = {0, };
1630+
image = do_mono_image_load (image, status, &options);
16311631
if (image == NULL)
16321632
return NULL;
16331633

@@ -1742,7 +1742,8 @@ mono_image_open_from_module_handle (MonoAssemblyLoadContext *alc, HMODULE module
17421742
image->ref_count = has_entry_point ? 0 : 1;
17431743
image->alc = alc;
17441744

1745-
image = do_mono_image_load (image, status, TRUE, TRUE);
1745+
MonoImageLoadOptions options = {0, };
1746+
image = do_mono_image_load (image, status, &options);
17461747
if (image == NULL)
17471748
return NULL;
17481749

@@ -1761,11 +1762,12 @@ mono_image_open_full (const char *fname, MonoImageOpenStatus *status, gboolean r
17611762
*status = MONO_IMAGE_NOT_SUPPORTED;
17621763
return NULL;
17631764
}
1764-
return mono_image_open_a_lot (mono_alc_get_default (), fname, status);
1765+
MonoImageOpenOptions options = {0, };
1766+
return mono_image_open_a_lot (mono_alc_get_default (), fname, status, &options);
17651767
}
17661768

17671769
static MonoImage *
1768-
mono_image_open_a_lot_parameterized (MonoLoadedImages *li, MonoAssemblyLoadContext *alc, const char *fname, MonoImageOpenStatus *status)
1770+
mono_image_open_a_lot_parameterized (MonoLoadedImages *li, MonoAssemblyLoadContext *alc, const char *fname, MonoImageOpenStatus *status, const MonoImageOpenOptions *options)
17691771
{
17701772
MonoImage *image;
17711773
GHashTable *loaded_images = mono_loaded_images_get_hash (li);
@@ -1867,18 +1869,18 @@ mono_image_open_a_lot_parameterized (MonoLoadedImages *li, MonoAssemblyLoadConte
18671869
mono_images_unlock ();
18681870

18691871
// Image not loaded, load it now
1870-
image = do_mono_image_open (alc, fname, status, TRUE, TRUE, FALSE);
1872+
image = do_mono_image_open (alc, fname, status, options);
18711873
if (image == NULL)
18721874
return NULL;
18731875

18741876
return register_image (li, image);
18751877
}
18761878

18771879
MonoImage *
1878-
mono_image_open_a_lot (MonoAssemblyLoadContext *alc, const char *fname, MonoImageOpenStatus *status)
1880+
mono_image_open_a_lot (MonoAssemblyLoadContext *alc, const char *fname, MonoImageOpenStatus *status, const MonoImageOpenOptions *options)
18791881
{
18801882
MonoLoadedImages *li = mono_alc_get_loaded_images (alc);
1881-
return mono_image_open_a_lot_parameterized (li, alc, fname, status);
1883+
return mono_image_open_a_lot_parameterized (li, alc, fname, status, options);
18821884
}
18831885

18841886
/**
@@ -1893,7 +1895,8 @@ mono_image_open_a_lot (MonoAssemblyLoadContext *alc, const char *fname, MonoImag
18931895
MonoImage *
18941896
mono_image_open (const char *fname, MonoImageOpenStatus *status)
18951897
{
1896-
return mono_image_open_a_lot (mono_alc_get_default (), fname, status);
1898+
MonoImageOpenOptions options = {0, };
1899+
return mono_image_open_a_lot (mono_alc_get_default (), fname, status, &options);
18971900
}
18981901

18991902
/**
@@ -1911,7 +1914,9 @@ mono_pe_file_open (const char *fname, MonoImageOpenStatus *status)
19111914
{
19121915
g_return_val_if_fail (fname != NULL, NULL);
19131916

1914-
return do_mono_image_open (mono_alc_get_default (), fname, status, FALSE, TRUE, FALSE);
1917+
MonoImageOpenOptions options = {0, };
1918+
options.load_options.dont_care_about_cli = 1;
1919+
return do_mono_image_open (mono_alc_get_default (), fname, status, &options);
19151920
}
19161921

19171922
/**
@@ -1926,7 +1931,10 @@ mono_image_open_raw (MonoAssemblyLoadContext *alc, const char *fname, MonoImageO
19261931
{
19271932
g_return_val_if_fail (fname != NULL, NULL);
19281933

1929-
return do_mono_image_open (alc, fname, status, FALSE, FALSE, FALSE);
1934+
MonoImageOpenOptions options = {0, };
1935+
options.load_options.dont_care_about_cli = 1;
1936+
options.load_options.dont_care_about_pecoff = 1;
1937+
return do_mono_image_open (alc, fname, status, &options);
19301938
}
19311939

19321940
/*
@@ -1937,7 +1945,9 @@ mono_image_open_raw (MonoAssemblyLoadContext *alc, const char *fname, MonoImageO
19371945
MonoImage *
19381946
mono_image_open_metadata_only (MonoAssemblyLoadContext *alc, const char *fname, MonoImageOpenStatus *status)
19391947
{
1940-
return do_mono_image_open (alc, fname, status, TRUE, TRUE, TRUE);
1948+
MonoImageOpenOptions options = {0, };
1949+
options.metadata_only = 1;
1950+
return do_mono_image_open (alc, fname, status, &options);
19411951
}
19421952

19431953
/**

src/mono/mono/metadata/metadata-internals.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,9 @@ struct _MonoImage {
305305
/* Whenever this is a dynamically emitted module */
306306
guint8 dynamic : 1;
307307

308+
/* Whenever this image is not an executable, such as .mibc */
309+
guint8 not_executable : 1;
310+
308311
/* Whenever this image contains uncompressed metadata */
309312
guint8 uncompressed_metadata : 1;
310313

0 commit comments

Comments
 (0)