about summary refs log tree commit diff
path: root/compiler/rustc_middle/src/ty
diff options
context:
space:
mode:
authorKaran Janthe <karanjanthe@gmail.com>2025-08-23 21:56:56 +0000
committerKaran Janthe <karanjanthe@gmail.com>2025-09-19 04:02:19 +0000
commit375e14ef491ac7bfa701e269b2815625abf2fca6 (patch)
tree398d7a2d0dbe09de910c73061a84c210d55455b4 /compiler/rustc_middle/src/ty
parente1258e79d6cb709b26ded97d32de6c55f355e2aa (diff)
downloadrust-375e14ef491ac7bfa701e269b2815625abf2fca6.tar.gz
rust-375e14ef491ac7bfa701e269b2815625abf2fca6.zip
Add TypeTree metadata attachment for autodiff
  - Add F128 support to TypeTree Kind enum
  - Implement TypeTree FFI bindings and conversion functions
  - Add typetree.rs module for metadata attachment to LLVM functions
  - Integrate TypeTree generation with autodiff intrinsic pipeline
  - Support scalar types: f32, f64, integers, f16, f128
  - Attach enzyme_type attributes as LLVM string metadata for Enzyme

Signed-off-by: Karan Janthe <karanjanthe@gmail.com>
Diffstat (limited to 'compiler/rustc_middle/src/ty')
-rw-r--r--compiler/rustc_middle/src/ty/mod.rs19
1 files changed, 6 insertions, 13 deletions
diff --git a/compiler/rustc_middle/src/ty/mod.rs b/compiler/rustc_middle/src/ty/mod.rs
index df42c400317..e7130757f1d 100644
--- a/compiler/rustc_middle/src/ty/mod.rs
+++ b/compiler/rustc_middle/src/ty/mod.rs
@@ -2251,36 +2251,29 @@ pub fn fnc_typetrees<'tcx>(tcx: TyCtxt<'tcx>, fn_ty: Ty<'tcx>) -> FncTree {
 
 /// Generate TypeTree for a specific type.
 /// This function analyzes a Rust type and creates appropriate TypeTree metadata.
-fn typetree_from_ty<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> TypeTree {
-    // Handle basic scalar types
+pub fn typetree_from_ty<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> TypeTree {
     if ty.is_scalar() {
         let (kind, size) = if ty.is_integral() || ty.is_char() || ty.is_bool() {
             (Kind::Integer, ty.primitive_size(tcx).bytes_usize())
         } else if ty.is_floating_point() {
             match ty {
+                x if x == tcx.types.f16 => (Kind::Half, 2),
                 x if x == tcx.types.f32 => (Kind::Float, 4),
                 x if x == tcx.types.f64 => (Kind::Double, 8),
-                _ => return TypeTree::new(), // Unknown float type
+                x if x == tcx.types.f128 => (Kind::F128, 16),
+                _ => return TypeTree::new(),
             }
         } else {
-            // TODO(KMJ-007): Handle other scalar types if needed
             return TypeTree::new();
         };
-        
-        return TypeTree(vec![Type { 
-            offset: -1, 
-            size, 
-            kind, 
-            child: TypeTree::new() 
-        }]);
+
+        return TypeTree(vec![Type { offset: -1, size, kind, child: TypeTree::new() }]);
     }
 
-    // Handle references and pointers
     if ty.is_ref() || ty.is_raw_ptr() || ty.is_box() {
         let inner_ty = if let Some(inner) = ty.builtin_deref(true) {
             inner
         } else {
-            // TODO(KMJ-007): Handle complex pointer types
             return TypeTree::new();
         };