LCOV - code coverage report
Current view: top level - src/macho/commands - build_version.rs (source / functions) Coverage Total Hit
Test: lief.lcov Lines: 31.2 % 128 40
Test Date: 2026-04-12:00:00:00 Functions: 34.8 % 23 8

            Line data    Source code
       1              : use std::marker::PhantomData;
       2              : 
       3              : use lief_ffi as ffi;
       4              : 
       5              : use super::Command;
       6              : use crate::common::FromFFI;
       7              : use crate::declare_iterator;
       8              : 
       9              : /// Tool used during the build
      10              : #[allow(non_camel_case_types)]
      11            0 : #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
      12              : pub enum Tool {
      13              :     CLANG,
      14              :     SWIFT,
      15              :     LD,
      16              :     LLD,
      17              :     METAL,
      18              :     AIRLLD,
      19              :     AIRNT,
      20              :     AIRNT_PLUGIN,
      21              :     AIRPACK,
      22              :     GPUARCHIVER,
      23              :     METAL_FRAMEWORK,
      24              :     UNKNOWN(u32),
      25              : }
      26              : 
      27              : impl From<u32> for Tool {
      28            0 :     fn from(value: u32) -> Self {
      29            0 :         match value {
      30            0 :             1 => Tool::CLANG,
      31            0 :             2 => Tool::SWIFT,
      32            0 :             3 => Tool::LD,
      33            0 :             4 => Tool::LLD,
      34            0 :             1024 => Tool::METAL,
      35            0 :             1025 => Tool::AIRLLD,
      36            0 :             1026 => Tool::AIRNT,
      37            0 :             1027 => Tool::AIRNT_PLUGIN,
      38            0 :             1028 => Tool::AIRPACK,
      39            0 :             1031 => Tool::GPUARCHIVER,
      40            0 :             1032 => Tool::METAL_FRAMEWORK,
      41            0 :             _ => Tool::UNKNOWN(value),
      42              :         }
      43            0 :     }
      44              : }
      45              : 
      46              : impl From<Tool> for u32 {
      47            0 :     fn from(value: Tool) -> u32 {
      48            0 :         match value {
      49            0 :             Tool::CLANG => 1,
      50            0 :             Tool::SWIFT => 2,
      51            0 :             Tool::LD => 3,
      52            0 :             Tool::LLD => 4,
      53            0 :             Tool::METAL => 1024,
      54            0 :             Tool::AIRLLD => 1025,
      55            0 :             Tool::AIRNT => 1026,
      56            0 :             Tool::AIRNT_PLUGIN => 1027,
      57            0 :             Tool::AIRPACK => 1028,
      58            0 :             Tool::GPUARCHIVER => 1031,
      59            0 :             Tool::METAL_FRAMEWORK => 1032,
      60            0 :             Tool::UNKNOWN(v) => v,
      61              :         }
      62            0 :     }
      63              : }
      64              : 
      65              : /// Represents a tool version used during the build
      66              : pub struct BuildToolVersion<'a> {
      67              :     ptr: cxx::UniquePtr<ffi::MachO_BuildToolVersion>,
      68              :     _owner: PhantomData<&'a ffi::MachO_BuildVersion>,
      69              : }
      70              : 
      71              : impl BuildToolVersion<'_> {
      72              :     /// The tool used
      73            0 :     pub fn tool(&self) -> Tool {
      74            0 :         Tool::from(self.ptr.tool())
      75            0 :     }
      76              : 
      77              :     /// Version associated with the tool
      78            0 :     pub fn version(&self) -> (u64, u64, u64) {
      79            0 :         let vec = Vec::from(self.ptr.version().as_slice());
      80            0 :         if vec.len() != 3 {
      81            0 :             return (0, 0, 0);
      82            0 :         }
      83            0 :         (vec[0], vec[1], vec[2])
      84            0 :     }
      85              : }
      86              : 
      87              : impl std::fmt::Debug for BuildToolVersion<'_> {
      88            0 :     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
      89            0 :         f.debug_struct("BuildToolVersion")
      90            0 :             .field("tool", &self.tool())
      91            0 :             .field("version", &self.version())
      92            0 :             .finish()
      93            0 :     }
      94              : }
      95              : 
      96              : impl<'a> FromFFI<ffi::MachO_BuildToolVersion> for BuildToolVersion<'a> {
      97            0 :     fn from_ffi(ptr: cxx::UniquePtr<ffi::MachO_BuildToolVersion>) -> Self {
      98            0 :         Self {
      99            0 :             ptr,
     100            0 :             _owner: PhantomData,
     101            0 :         }
     102            0 :     }
     103              : }
     104              : 
     105              : /// Structure that represents the `LC_BUILD_VERSION` command
     106              : pub struct BuildVersion<'a> {
     107              :     ptr: cxx::UniquePtr<ffi::MachO_BuildVersion>,
     108              :     _owner: PhantomData<&'a ffi::MachO_Binary>,
     109              : }
     110              : 
     111              : #[allow(non_camel_case_types)]
     112         1014 : #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
     113              : pub enum Platform {
     114              :     MACOS,
     115              :     IOS,
     116              :     TVOS,
     117              :     WATCHOS,
     118              :     BRIDGEOS,
     119              :     MAC_CATALYST,
     120              :     IOS_SIMULATOR,
     121              :     TVOS_SIMULATOR,
     122              :     WATCHOS_SIMULATOR,
     123              :     DRIVERKIT,
     124              :     VISIONOS,
     125              :     VISIONOS_SIMULATOR,
     126              :     FIRMWARE,
     127              :     SEPOS,
     128              :     MACOS_EXCLAVE_CORE,
     129              :     MACOS_EXCLAVE_KIT,
     130              :     IOS_EXCLAVE_CORE,
     131              :     IOS_EXCLAVE_KIT,
     132              :     TVOS_EXCLAVE_CORE,
     133              :     TVOS_EXCLAVE_KIT,
     134              :     WATCHOS_EXCLAVE_CORE,
     135              :     WATCHOS_EXCLAVE_KIT,
     136              :     VISIONOS_EXCLAVE_CORE,
     137              :     VISIONOS_EXCLAVE_KIT,
     138              :     ANY,
     139              :     UNKNOWN(u32),
     140              : }
     141              : 
     142              : impl From<u32> for Platform {
     143         1014 :     fn from(value: u32) -> Self {
     144         1014 :         match value {
     145          741 :             0x00000001 => Platform::MACOS,
     146          117 :             0x00000002 => Platform::IOS,
     147            0 :             0x00000003 => Platform::TVOS,
     148            0 :             0x00000004 => Platform::WATCHOS,
     149            0 :             0x00000005 => Platform::BRIDGEOS,
     150            0 :             0x00000006 => Platform::MAC_CATALYST,
     151            0 :             0x00000007 => Platform::IOS_SIMULATOR,
     152            0 :             0x00000008 => Platform::TVOS_SIMULATOR,
     153            0 :             0x00000009 => Platform::WATCHOS_SIMULATOR,
     154            0 :             0x0000000A => Platform::DRIVERKIT,
     155            0 :             0x0000000B => Platform::VISIONOS,
     156            0 :             0x0000000C => Platform::VISIONOS_SIMULATOR,
     157            0 :             0x0000000D => Platform::FIRMWARE,
     158            0 :             0x0000000E => Platform::SEPOS,
     159            0 :             0x0000000F => Platform::MACOS_EXCLAVE_CORE,
     160            0 :             0x00000010 => Platform::MACOS_EXCLAVE_KIT,
     161            0 :             0x00000011 => Platform::IOS_EXCLAVE_CORE,
     162            0 :             0x00000012 => Platform::IOS_EXCLAVE_KIT,
     163            0 :             0x00000013 => Platform::TVOS_EXCLAVE_CORE,
     164            0 :             0x00000014 => Platform::TVOS_EXCLAVE_KIT,
     165            0 :             0x00000015 => Platform::WATCHOS_EXCLAVE_CORE,
     166            0 :             0x00000016 => Platform::WATCHOS_EXCLAVE_KIT,
     167            0 :             0x00000017 => Platform::VISIONOS_EXCLAVE_CORE,
     168            0 :             0x00000018 => Platform::VISIONOS_EXCLAVE_KIT,
     169            0 :             0xFFFFFFFF => Platform::ANY,
     170          156 :             _ => Platform::UNKNOWN(value),
     171              :         }
     172         1014 :     }
     173              : }
     174              : 
     175              : impl BuildVersion<'_> {
     176          598 :     pub fn sdk(&self) -> (u64, u64, u64) {
     177          598 :         let vec = Vec::from(self.ptr.sdk().as_slice());
     178          598 :         if vec.len() != 3 {
     179            0 :             return (0, 0, 0);
     180          598 :         }
     181          598 :         (vec[0], vec[1], vec[2])
     182          598 :     }
     183              : 
     184          598 :     pub fn minos(&self) -> (u64, u64, u64) {
     185          598 :         let vec = Vec::from(self.ptr.sdk().as_slice());
     186          598 :         if vec.len() != 3 {
     187            0 :             return (0, 0, 0);
     188          598 :         }
     189          598 :         (vec[0], vec[1], vec[2])
     190          598 :     }
     191              : 
     192          598 :     pub fn platform(&self) -> Platform {
     193          598 :         Platform::from(self.ptr.platform())
     194          598 :     }
     195              : 
     196              :     /// Return an iterator over the [`BuildToolVersion`] entries
     197            0 :     pub fn tools(&self) -> BuildTools<'_> {
     198            0 :         BuildTools::new(self.ptr.tools())
     199            0 :     }
     200              : }
     201              : 
     202              : impl std::fmt::Debug for BuildVersion<'_> {
     203          598 :     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
     204          598 :         let base = self as &dyn Command;
     205          598 :         f.debug_struct("BuildVersion")
     206          598 :             .field("base", &base)
     207          598 :             .field("sdk", &self.sdk())
     208          598 :             .field("minos", &self.minos())
     209          598 :             .field("platform", &self.platform())
     210          598 :             .finish()
     211          598 :     }
     212              : }
     213              : 
     214              : impl FromFFI<ffi::MachO_BuildVersion> for BuildVersion<'_> {
     215          598 :     fn from_ffi(cmd: cxx::UniquePtr<ffi::MachO_BuildVersion>) -> Self {
     216          598 :         Self {
     217          598 :             ptr: cmd,
     218          598 :             _owner: PhantomData,
     219          598 :         }
     220          598 :     }
     221              : }
     222              : 
     223              : impl Command for BuildVersion<'_> {
     224         2392 :     fn get_base(&self) -> &ffi::MachO_Command {
     225         2392 :         self.ptr.as_ref().unwrap().as_ref()
     226         2392 :     }
     227              : }
     228              : 
     229            0 : declare_iterator!(
     230            0 :     BuildTools,
     231            0 :     BuildToolVersion<'a>,
     232            0 :     ffi::MachO_BuildToolVersion,
     233            0 :     ffi::MachO_BuildVersion,
     234            0 :     ffi::MachO_BuildVersion_it_tools
     235            0 : );
        

Generated by: LCOV version 2.1-1