when we are calling an implemented function, call it using the signature it is implemented as, to avoid issues with LLVM casting for no reason
fix Functions.getSignature to handle non-legalized data
fix both number of arguments and return type based on implementation information, to work around silly llvm function casts