@@ -2,7 +2,10 @@ use crate::proto::ErrKind;
22use agave_syscalls:: SyscallError ;
33use solana_poseidon:: PoseidonSyscallError ;
44use solana_program_runtime:: { invoke_context:: InvokeContext , stable_log} ;
5- use solana_sbpf:: error:: { EbpfError , StableResult } ;
5+ use solana_sbpf:: {
6+ elf:: ElfError ,
7+ error:: { EbpfError , StableResult } ,
8+ } ;
69
710use solana_instruction:: error:: InstructionError ;
811use solana_pubkey:: Pubkey ;
@@ -15,6 +18,34 @@ use solana_pubkey::Pubkey;
1518// When an err str is truncated in Firedancer, it should be explicit in this mapping,
1619// otherwise error.to_string() is the expected value.
1720
21+ pub fn elf_err_to_num ( error : & ElfError ) -> i32 {
22+ match error {
23+ ElfError :: FailedToParse ( _) => 1 ,
24+ ElfError :: EntrypointOutOfBounds => 2 ,
25+ ElfError :: InvalidEntrypoint => 3 ,
26+ ElfError :: FailedToGetSection ( _) => 4 ,
27+ ElfError :: UnresolvedSymbol ( _, _, _) => 5 ,
28+ ElfError :: SectionNotFound ( _) => 6 ,
29+ ElfError :: RelativeJumpOutOfBounds ( _) => 7 ,
30+ ElfError :: SymbolHashCollision ( _) => 8 ,
31+ ElfError :: WrongEndianess => 9 ,
32+ ElfError :: WrongAbi => 10 ,
33+ ElfError :: WrongMachine => 11 ,
34+ ElfError :: WrongClass => 12 ,
35+ ElfError :: NotOneTextSection => 13 ,
36+ ElfError :: WritableSectionNotSupported ( _) => 14 ,
37+ ElfError :: AddressOutsideLoadableSection ( _) => 15 ,
38+ ElfError :: InvalidVirtualAddress ( _) => 16 ,
39+ ElfError :: UnknownRelocation ( _) => 17 ,
40+ ElfError :: FailedToReadRelocationInfo => 18 ,
41+ ElfError :: WrongType => 19 ,
42+ ElfError :: UnknownSymbol ( _) => 20 ,
43+ ElfError :: ValueOutOfBounds => 21 ,
44+ ElfError :: UnsupportedSBPFVersion => 22 ,
45+ ElfError :: InvalidProgramHeader => 23 ,
46+ }
47+ }
48+
1849pub fn instr_err_to_num ( error : & InstructionError ) -> i32 {
1950 let serialized_err = bincode:: serialize ( error) . unwrap ( ) ;
2051 i32:: from_le_bytes ( ( & serialized_err[ 0 ..4 ] ) . try_into ( ) . unwrap ( ) ) . saturating_add ( 1 )
0 commit comments