Skip to content

Conversation

@wsmoses
Copy link
Member

@wsmoses wsmoses commented Dec 23, 2024

The current method :jl_type_to_llvm takes a pointer-to-bool parameter isboxed, which if non-null, is set to true if the Julia Type requires boxing. However, one may want to know the julia type without boxing and there is no mechanism for doing so. If the isboxed parameter is null and cannot be set, we can return the LLVM struct inside the jlvaluet as a way of returning the information.

Users like LLVM.jl, GPUCompiler.jl, and ClangCompiler.jl always request the isboxed parameter set to a non-null value and would not be affected: https://github.com/maleadt/LLVM.jl/blob/ff15977666b313c25e0b66302fa789898e00279e/src/interop/base.jl#L74C25-L74C40 https://github.com/maleadt/GPUCompiler.jl/blob/8fb9b50d85df93183aba852c59dd7ae8e58c0abc/src/driver.jl#L65 https://github.com/Gnimuc/ClangCompiler.jl/blob/0e503fe94dff1b6965a6b43d9527258ba0c9593c/src/utils.jl#L2 and an old commit of staticcompiler.jl (https://github.com/el-oso/StaticCompiler.jl/blob/145ef4ad788acb0dc2928ded53827636fdf37563/src/utils.jl#L5).

There are other users of this function on github

@wsmoses wsmoses requested review from gbaraldi and vtjnash December 23, 2024 05:30
@wsmoses wsmoses added backport 1.10 Change should be backported to the 1.10 release backport 1.11 Change should be backported to release-1.11 labels Dec 23, 2024
@vtjnash
Copy link
Member

vtjnash commented Dec 23, 2024

Why aren't you calling julia_struct_to_llvm if you want the C-API-semantics version of this function (rather than the Julia-semantics version normal here). The pointer-to-bool argument has been (nearly) deprecated for quite a few years now (since 0.6 IIRC), since it merely tests whether the caller is using the function correctly, but does not provide correct information back to the user.

@wsmoses
Copy link
Member Author

wsmoses commented Dec 23, 2024

Why aren't you calling julia_struct_to_llvm if you want the C-API-semantics version of this function (rather than the Julia-semantics version normal here). The pointer-to-bool argument has been (nearly) deprecated for quite a few years now (since 0.6 IIRC), since it merely tests whether the caller is using the function correctly, but does not provide correct information back to the user.

Iirc it’s not exported, though I can export it if that would be reasonable?

@vtjnash
Copy link
Member

vtjnash commented Dec 23, 2024

Yeah, that could be exported, though seems very rare someone should call that

@wsmoses
Copy link
Member Author

wsmoses commented Dec 23, 2024

Yeah, that could be exported, though seems very rare someone should call that

Okay made a version for export.

The reason we need it is essentially to avoid a GC error by figuring out the correct location of GC'd pointers in a gc_alloc call [and place atomic stores of nothing there rahter than undef]

@vtjnash
Copy link
Member

vtjnash commented Dec 23, 2024

Those properties are normally queried by calling jl_ptr_offset (in C). The julia_struct_to_llvm class of functions does call that, so it will usually derive similar info, but it requires some recursion and non-trivial extra computational effort to re-compute the byte offsets

@wsmoses
Copy link
Member Author

wsmoses commented Dec 23, 2024

jl_ptr_offset

our recursive fixer requires the llvm version of the type [to cast to and recurses through the LLVM Type with geps to find the GC objects]

This was referenced Jan 2, 2025
@oscardssmith
Copy link
Member

Is this ready to merge?

wsmoses and others added 3 commits January 10, 2025 16:28
The current method :jl_type_to_llvm takes a pointer-to-bool parameter isboxed, which if non-null, is set to true if the Julia Type requires boxing. However, one may want to know the julia type without boxing and there is no mechanism for doing so. If the isboxed parameter is null and cannot be set, we can return the LLVM struct inside the jlvaluet as a way of returning the information.

Users like LLVM.jl, GPUCompiler.jl, and ClangCompiler.jl always request the isboxed parameter set to a non-null value and would not be affected: https://github.com/maleadt/LLVM.jl/blob/ff15977666b313c25e0b66302fa789898e00279e/src/interop/base.jl#L74C25-L74C40 https://github.com/maleadt/GPUCompiler.jl/blob/8fb9b50d85df93183aba852c59dd7ae8e58c0abc/src/driver.jl#L65 https://github.com/Gnimuc/ClangCompiler.jl/blob/0e503fe94dff1b6965a6b43d9527258ba0c9593c/src/utils.jl#L2 and an old commit of staticcompiler.jl (https://github.com/el-oso/StaticCompiler.jl/blob/145ef4ad788acb0dc2928ded53827636fdf37563/src/utils.jl#L5).

There are other users of this function on github
@wsmoses
Copy link
Member Author

wsmoses commented Jan 10, 2025

I'm good merging!

This was referenced Jan 28, 2025
This was referenced Mar 11, 2025
@KristofferC KristofferC mentioned this pull request Apr 25, 2025
71 tasks
@KristofferC KristofferC mentioned this pull request Aug 19, 2025
65 tasks
DilumAluthge added a commit that referenced this pull request Sep 5, 2025
Backported PRs:
- [x] #54840 <!-- Add boundscheck in speccache_eq to avoid OOB access
due to data race -->
- [x] #42080 <!-- recommend explicit `using Foo: Foo, ...` in package
code (was: "using considered harmful") -->
- [x] #58127 <!-- [DOC] Update installation docs: /downloads/ =>
/install/ -->
- [x] #58202 <!-- [release-1.11] malloc: use jl_get_current_task to fix
null check -->
- [x] #58584 <!-- Make `Ptr` values static-show w/ type-information -->
- [x] #58637 <!-- Make late gc lower handle insertelement of alloca use.
-->
- [x] #58837 <!-- fix null comparisons for non-standard address spaces
-->
- [x] #57826 <!-- Add a `similar` method for `Type{<:CodeUnits}` -->
- [x] #58293 <!-- fix trailing indices stackoverflow in reinterpreted
array -->
- [x] #58887 <!-- Pkg: Allow configuring can_fancyprint(io::IO) using
IOContext -->
- [x] #58937 <!-- Fix nthreadpools size in JLOptions -->
- [x] #58978 <!-- Fix precompilepkgs warn loaded setting -->
- [x] #58998 <!-- Bugfix: Use Base.aligned_sizeof instead of sizeof in
Mmap.mmap -->
- [x] #59120 <!-- Fix memory order typo in "src/julia_atomics.h" -->
- [x] #59170 <!-- Clarify and enhance confusing precompile test -->

Need manual backport:
- [ ] #56329 <!-- loading: clean up more concurrency issues -->
- [ ] #56956 <!-- Add "mea culpa" to foreign module assignment error.
-->
- [ ] #57035 <!-- linux: workaround to avoid deadlock inside
dl_iterate_phdr in glibc -->
- [ ] #57089 <!-- Block thread from receiving profile signal with
stackwalk lock -->
- [ ] #57249 <!-- restore non-freebsd-unix fix for profiling -->
- [ ] #58011 <!-- Remove try-finally scope from `@time_imports`
`@trace_compile` `@trace_dispatch` -->
- [ ] #58062 <!-- remove unnecessary edge from `exp_impl` to `pow` -->
- [ ] #58157 <!-- add showing a string to REPL precompile workload -->
- [ ] #58209 <!-- Specialize `one` for the `SizedArray` test helper -->
- [ ] #58108 <!-- Base.get_extension & Dates.format made public -->
- [ ] #58356 <!-- codegen: remove readonly from abstract type calling
convention -->
- [ ] #58415 <!-- [REPL] more reliable extension loading -->
- [ ] #58510 <!-- Don't filter `Core` methods from newly-inferred list
-->
- [ ] #58110 <!-- relax dispatch for the `IteratorSize` method for
`Generator` -->
- [ ] #58965 <!-- Fix `hygienic-scope`s in inner macro expansions -->
- [ ] #58971 <!-- Fix alignment of failed precompile jobs on CI -->
- [ ] #59066 <!-- build: Also pass -fno-strict-aliasing for C++ -->

Contains multiple commits, manual intervention needed:
- [ ] #55877 <!-- fix FileWatching designs and add workaround for a stat
bug on Apple -->
- [ ] #56755 <!-- docs: fix scope type of a `struct` to hard -->
- [ ] #57809 <!-- Fix fptrunc Float64 -> Float16 rounding through
Float32 -->
- [ ] #57398 <!-- Make remaining float intrinsics require float
arguments -->
- [ ] #56351 <!-- Fix `--project=@script` when outside script directory
-->
- [ ] #57129 <!-- clarify that time_ns is monotonic -->
- [ ] #58134 <!-- Note annotated string API is experimental in Julia
1.11 in HISTORY.md -->
- [ ] #58401 <!-- check that hashing of types does not foreigncall
(`jl_type_hash` is concrete evaluated) -->
- [ ] #58435 <!-- Fix layout flags for types that have oddly sized
primitive type fields -->
- [ ] #58483 <!-- Fix tbaa usage when storing into heap allocated
immutable structs -->
- [ ] #58512 <!-- Make more types jl_static_show readably -->
- [ ] #58012 <!-- Re-enable tab completion of kwargs for large method
tables -->
- [ ] #58683 <!-- Add 0 predecessor to entry basic block and handle it
in inlining -->
- [ ] #59112 <!-- Add builtin function name to add methods error -->

Non-merged PRs with backport label:
- [ ] #59329 <!-- aotcompile: destroy LLVM context after serializing
combined module -->
- [ ] #58848 <!-- Set array size only when safe to do so -->
- [ ] #58535 <!-- gf.c: include const-return methods in
`--trace-compile` -->
- [ ] #58038 <!-- strings/cstring: `transcode`: prevent Windows sysimage
invalidation -->
- [ ] #57604 <!-- `@nospecialize` for `string_index_err` -->
- [ ] #57366 <!-- Use ptrdiff_t sized offsets for gvars_offsets to allow
large sysimages -->
- [ ] #56890 <!-- Enable getting non-boxed LLVM type from Julia Type -->
- [ ] #56823 <!-- Make version of opaque closure constructor in world
-->
- [ ] #55958 <!-- also redirect JL_STDERR etc. when redirecting to
devnull -->
- [ ] #55956 <!-- Make threadcall gc safe -->
- [ ] #55534 <!-- Set stdlib sources as read-only during installation
-->
- [ ] #55499 <!-- propagate the terminal's `displaysize` to the
`IOContext` used by the REPL -->
- [ ] #55458 <!-- Allow for generically extracting unannotated string
-->
- [ ] #55457 <!-- Make AnnotateChar equality consider annotations -->
- [ ] #55220 <!-- `isfile_casesensitive` fixes on Windows -->
- [ ] #53957 <!-- tweak how filtering is done for what packages should
be precompiled -->
- [ ] #51479 <!-- prevent code loading from lookin in the versioned
environment when building Julia -->
- [ ] #50813 <!-- More doctests for Sockets and capitalization fix -->
- [ ] #50157 <!-- improve docs for `@inbounds` and
`Base.@propagate_inbounds` -->

---------

Co-authored-by: Kiran Pamnany <kpamnany@users.noreply.github.com>
Co-authored-by: adienes <51664769+adienes@users.noreply.github.com>
Co-authored-by: Gabriel Baraldi <baraldigabriel@gmail.com>
Co-authored-by: Keno Fischer <keno@juliacomputing.com>
Co-authored-by: Simeon David Schaub <simeon@schaub.rocks>
Co-authored-by: Jameson Nash <vtjnash@gmail.com>
Co-authored-by: Alex Arslan <ararslan@comcast.net>
Co-authored-by: Fons van der Plas <fonsvdplas@gmail.com>
Co-authored-by: Ian Butterworth <i.r.butterworth@gmail.com>
Co-authored-by: JonasIsensee <jonas.isensee@web.de>
Co-authored-by: Curtis Vogt <curtis.vogt@gmail.com>
Co-authored-by: Dilum Aluthge <dilum@aluthge.com>
Co-authored-by: DilumAluthgeBot <43731525+DilumAluthgeBot@users.noreply.github.com>
Co-authored-by: DilumAluthge <5619885+DilumAluthge@users.noreply.github.com>
@vtjnash vtjnash merged commit 85f1b8c into JuliaLang:master Sep 5, 2025
7 checks passed
vtjnash added a commit that referenced this pull request Sep 5, 2025
vtjnash added a commit that referenced this pull request Sep 5, 2025
DilumAluthge pushed a commit that referenced this pull request Sep 9, 2025
The current method :jl_type_to_llvm takes a pointer-to-bool parameter
isboxed, which if non-null, is set to true if the Julia Type requires
boxing. However, one may want to know the julia type without boxing and
there is no mechanism for doing so. Now there is `julia_struct_to_llvm`.

(cherry picked from commit 85f1b8c)
@DilumAluthge DilumAluthge mentioned this pull request Sep 9, 2025
59 tasks
@DilumAluthge DilumAluthge added backport 1.11 Change should be backported to release-1.11 and removed backport 1.11 Change should be backported to release-1.11 labels Sep 9, 2025
DilumAluthge pushed a commit that referenced this pull request Sep 13, 2025
The current method :jl_type_to_llvm takes a pointer-to-bool parameter
isboxed, which if non-null, is set to true if the Julia Type requires
boxing. However, one may want to know the julia type without boxing and
there is no mechanism for doing so. Now there is `julia_struct_to_llvm`.

(cherry picked from commit 85f1b8c)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport 1.10 Change should be backported to the 1.10 release backport 1.11 Change should be backported to release-1.11

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants