@@ -1820,6 +1820,58 @@ void addTargetPasses(legacy::PassManagerBase *PM, const Triple &triple, TargetIR
1820
1820
PM->add (createTargetTransformInfoWrapperPass (std::move (analysis)));
1821
1821
}
1822
1822
1823
+ // sometimes in GDB you want to find out what code was created from a mi
1824
+ extern " C" JL_DLLEXPORT_CODEGEN jl_code_info_t *jl_gdbdumpcode (jl_method_instance_t *mi)
1825
+ {
1826
+ jl_llvmf_dump_t llvmf_dump;
1827
+ size_t world = jl_current_task->world_age ;
1828
+ JL_STREAM *stream = (JL_STREAM*)STDERR_FILENO;
1829
+
1830
+ jl_printf (stream, " ---- dumping IR for ----\n " );
1831
+ jl_static_show (stream, (jl_value_t *)mi);
1832
+ jl_printf (stream, " \n ----\n " );
1833
+
1834
+ jl_printf (stream, " \n ---- unoptimized IR ----" );
1835
+ jl_get_llvmf_defn (&llvmf_dump, mi, world, 0 , false , jl_default_cgparams);
1836
+ if (llvmf_dump.F ) {
1837
+ jl_value_t *ir = jl_dump_function_ir (&llvmf_dump, 0 , 1 , " source" );
1838
+ jl_static_show (stream, ir);
1839
+ }
1840
+ jl_printf (stream, " ----\n " );
1841
+
1842
+ jl_printf (stream, " \n ---- optimized IR ----" );
1843
+ jl_get_llvmf_defn (&llvmf_dump, mi, world, 0 , true , jl_default_cgparams);
1844
+ if (llvmf_dump.F ) {
1845
+ jl_value_t *ir = jl_dump_function_ir (&llvmf_dump, 0 , 1 , " source" );
1846
+ jl_static_show (stream, ir);
1847
+ }
1848
+ jl_printf (stream, " ----\n " );
1849
+
1850
+ jl_printf (stream, " \n ---- assembly ----" );
1851
+ jl_get_llvmf_defn (&llvmf_dump, mi, world, 0 , true , jl_default_cgparams);
1852
+ if (llvmf_dump.F ) {
1853
+ jl_value_t *ir = jl_dump_function_asm (&llvmf_dump, 0 , " " , " source" , 0 , true );
1854
+ jl_static_show (stream, ir);
1855
+ }
1856
+ jl_printf (stream, " ----\n " );
1857
+
1858
+ jl_code_info_t *src = NULL ;
1859
+ jl_value_t *ci = jl_default_cgparams.lookup (mi, world, world);
1860
+ if (ci != jl_nothing) {
1861
+ jl_code_instance_t *codeinst = (jl_code_instance_t *)ci;
1862
+ src = (jl_code_info_t *)jl_atomic_load_relaxed (&codeinst->inferred );
1863
+ if ((jl_value_t *)src != jl_nothing && !jl_is_code_info (src) && jl_is_method (mi->def .method )) {
1864
+ JL_GC_PUSH2 (&codeinst, &src);
1865
+ src = jl_uncompress_ir (mi->def .method , codeinst, (jl_value_t *)src);
1866
+ JL_GC_POP ();
1867
+ }
1868
+ }
1869
+ if (!src || (jl_value_t *)src == jl_nothing) {
1870
+ src = jl_type_infer (mi, world, 0 );
1871
+ }
1872
+ return src;
1873
+ }
1874
+
1823
1875
// --- native code info, and dump function to IR and ASM ---
1824
1876
// Get pointer to llvm::Function instance, compiling if necessary
1825
1877
// for use in reflection from Julia.
0 commit comments