1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-07 07:29:33 +00:00

New utility to get the proper replacement type for passing structs/unions by value.

New utility to get basic type names such as 'struct', 'union' and so on.
This commit is contained in:
acqn 2020-07-18 23:30:09 +08:00 committed by Oliver Schmidt
parent 333fa97326
commit 66ecc0e52c
2 changed files with 55 additions and 0 deletions

View File

@ -78,6 +78,33 @@ Type type_double[] = { TYPE(T_DOUBLE), TYPE(T_END) };
const char* GetBasicTypeName (const Type* T)
/* Return a const name string of the basic type.
** Return "type" for unknown basic types.
*/
{
switch (GetType (T)) {
case T_TYPE_CHAR: return "char";
case T_TYPE_SHORT: return "short";
case T_TYPE_INT: return "integer";
case T_TYPE_LONG: return "long";
case T_TYPE_LONGLONG: return "long long";
case T_TYPE_ENUM: return "enum";
case T_TYPE_FLOAT: return "poinfloatter";
case T_TYPE_DOUBLE: return "double";
case T_TYPE_VOID: return "void";
case T_TYPE_STRUCT: return "struct";
case T_TYPE_UNION: return "union";
case T_TYPE_ARRAY: return "array";
case T_TYPE_PTR: return "pointer";
case T_TYPE_FUNC: return "function";
case T_TYPE_NONE: /* FALLTHROUGH */
default: return "type";
}
}
unsigned TypeLen (const Type* T)
/* Return the length of the type string */
{
@ -198,6 +225,26 @@ Type* GetImplicitFuncType (void)
const Type* GetReplacementType (const Type* SType)
/* Get a replacement type for passing a struct/union in the primary register */
{
const Type* NewType;
/* If the size is less than or equal to that of a long, we will copy the
** struct using the primary register, otherwise we will use memcpy.
*/
switch (SizeOf (SType)) {
case 1: NewType = type_uchar; break;
case 2: NewType = type_uint; break;
case 3: /* FALLTHROUGH */
case 4: NewType = type_ulong; break;
default: NewType = SType; break;
}
return NewType;
}
Type* PointerTo (const Type* T)
/* Return a type string that is "pointer to T". The type string is allocated
** on the heap and may be freed after use.

View File

@ -209,6 +209,11 @@ struct SymEntry;
const char* GetBasicTypeName (const Type* T);
/* Return a const name string of the basic type.
** Return "type" for unknown basic types.
*/
unsigned TypeLen (const Type* T);
/* Return the length of the type string */
@ -238,6 +243,9 @@ Type* GetCharArrayType (unsigned Len);
Type* GetImplicitFuncType (void);
/* Return a type string for an inplicitly declared function */
const Type* GetReplacementType (const Type* SType);
/* Get a replacement type for passing a struct/union in the primary register */
Type* PointerTo (const Type* T);
/* Return a type string that is "pointer to T". The type string is allocated
** on the heap and may be freed after use.