diff options
| author | iximeow <me@iximeow.net> | 2024-06-18 23:37:41 -0700 | 
|---|---|---|
| committer | iximeow <me@iximeow.net> | 2024-06-19 00:05:35 -0700 | 
| commit | 6b0a7aa23f1f125213081cee1f37079e53f05882 (patch) | |
| tree | 083e6c6bd1a176e5e21af0d6b76cf0225d6c5078 | |
| parent | cc6f7cabfdd7e48f71241ffc8e4860be6d26ba93 (diff) | |
configurable inlining to help with opts
| -rw-r--r-- | Cargo.toml | 4 | ||||
| -rw-r--r-- | src/long_mode/display.rs | 3 | ||||
| -rw-r--r-- | src/long_mode/mod.rs | 11 | 
3 files changed, 14 insertions, 4 deletions
| @@ -52,3 +52,7 @@ colors = ["yaxpeax-arch/colors"]  # This enables some capstone benchmarks over the same  # instruction bytes used to bench this code.  capstone_bench = [] + +# this disables a lot of inlining to make it easier for me to measure +# likelihood of codepaths for typical instruction sequences +profiling = [] diff --git a/src/long_mode/display.rs b/src/long_mode/display.rs index 77111b8..d0aef26 100644 --- a/src/long_mode/display.rs +++ b/src/long_mode/display.rs @@ -384,7 +384,6 @@ pub trait DisplaySink: fmt::Write {      /// utf-8 string. this may corrupt Rust strings.      unsafe fn write_lt_32(&mut self, s: &str) -> Result<(), core::fmt::Error> {          self.write_str(s) -      }      /// write a string to this sink that is less than 16 bytes. this is provided for optimization      /// opportunities when writing a variable-length string with known max size. @@ -5769,12 +5768,14 @@ impl Instruction {          Ok(())      } +    #[cfg_attr(feature="profiling", inline(never))]      pub fn write_to<T: DisplaySink>(&self, out: &mut T) -> fmt::Result {          contextualize_intel(self, out)  //        self.display_with(DisplayStyle::Intel).contextualize(&NoColors, 0, Some(&NoContext), out)      }  } +#[cfg_attr(feature="profiling", inline(never))]  fn contextualize_intel<T: DisplaySink>(instr: &Instruction, out: &mut T) -> fmt::Result {      if instr.xacquire() {          out.write_fixed_size("xacquire ")?; diff --git a/src/long_mode/mod.rs b/src/long_mode/mod.rs index e6d0a02..5a5b89a 100644 --- a/src/long_mode/mod.rs +++ b/src/long_mode/mod.rs @@ -4383,6 +4383,7 @@ impl Instruction {      /// if the work you expect to do per-operand is very small, constructing an `Operand` and      /// dispatching on tags may be a substantial factor of overall runtime. `visit_operand` can      /// reduce total overhead in such cases. +    #[cfg_attr(features="profiling", inline(never))]      fn visit_operand<T: OperandVisitor>(&self, i: u8, visitor: &mut T) -> Result<T::Ok, T::Error> {          assert!(i < 4);          let spec = self.operands[i as usize]; @@ -6009,7 +6010,8 @@ const OPCODES: [OpcodeRecord; 256] = [  ];  #[allow(non_snake_case)] -#[inline(always)] +#[cfg_attr(feature="profiling", inline(never))] +#[cfg_attr(not(feature="profiling"), inline(always))]  pub(self) fn read_E<      T: Reader<<Arch as yaxpeax_arch::Arch>::Address, <Arch as yaxpeax_arch::Arch>::Word>,      S: DescriptionSink<FieldDescription>, @@ -6638,6 +6640,7 @@ impl DecodeCtx {          self.rb_size      } +#[cfg_attr(feature="profiling", inline(never))]  fn read_opc_hotpath<      T: Reader<<Arch as yaxpeax_arch::Arch>::Address, <Arch as yaxpeax_arch::Arch>::Word>,      S: DescriptionSink<FieldDescription>, @@ -6694,7 +6697,8 @@ fn read_opc_hotpath<      }  } -#[inline(always)] +#[cfg_attr(feature="profiling", inline(never))] +#[cfg_attr(not(feature="profiling"), inline(always))]  fn read_with_annotations<      T: Reader<<Arch as yaxpeax_arch::Arch>::Address, <Arch as yaxpeax_arch::Arch>::Word>,      S: DescriptionSink<FieldDescription>, @@ -6912,7 +6916,8 @@ fn read_avx_prefixed<      return Ok(());  } -#[inline(always)] +#[cfg_attr(feature="profiling", inline(never))] +#[cfg_attr(not(feature="profiling"), inline(always))]  fn read_operands<      T: Reader<<Arch as yaxpeax_arch::Arch>::Address, <Arch as yaxpeax_arch::Arch>::Word>,      S: DescriptionSink<FieldDescription> | 
