Go to the previous, next section.

Function Types

The TYPE_FUNC operator is used with the func_type derived type class to describe the types of SUIF procedures. A function type includes the type of the return value and optionally the types of the arguments as well. The return_type and set_return_type methods access the return type field. The type system itself places no restrictions on the return types, but the SUIF call and return instructions do. See section Call Instructions

Most of the complexity of function types involves the arguments. Pointers to the argument types are stored in a dynamically-allocated array. The number of arguments, and thus the size of the array, is stored in a field that can be accessed with the num_args and set_num_args methods. The number of arguments can be changed at any time; if necessary the argument array will be reallocated. The type of a particular argument can be retrieved with the arg_type method and set with the set_arg_type method. The arguments are numbered beginning with zero.

Argument types are under the same restrictions as result types of instructions (see section Result Types) -- they must be object types with known, non-zero size.

Since functions can be declared in C without complete prototypes, a function type may not be able to include any information about the arguments. This is indicated in a SUIF function type by the result of the args_known method. This flag can be set with the set_args_known and set_args_unknown methods. Setting args_known FALSE sets the argument count to zero and the has_varargs flag to FALSE. Conversely, setting the argument count to a non-zero value or the has_varargs flag to TRUE sets the args_known flag to TRUE.

Some functions in C and other languages have a variable number of arguments. The SUIF function types support this by keeping a flag to indicate if there may be additional arguments besides the ones that are explicitly listed. The has_varargs and set_varargs methods access this flag. Note that the has_varargs flag should not be used if nothing else is known about the arguments.

Go to the previous, next section.