对于C++一系的语言,Name Mangling主要用于同名函数,同名类型和同名变量的重载。编译器可以在编译期将同名函数的不同签名形式区分开来。Name Mangling经常用于以下场合:函数同名称不同签名(函数重载);跨编译单元的变量、函数引用;动态链接库或其他形式的函数、变量导出。
尽管现阶段SASL不打算支持Member Function等比较复杂的行为,甚至暂时不考虑函数重载。但是作为现代语言编译的基本要素,SASL在语义分析阶段,仍然提供了较为完善的Name Mangling机制,为以后的编译器特性扩充打下基础。
SASL的Mangling语法如下:
mangled_name = 'M' basic_name '@' return_value_type parameter_type_list '@' 'Z'
basic_name = string '@'
return_value_type = value_type
parameter_type_list = ( value_type )*
value_type = qualifier_code type_code
qualifier_code = "UN" | "CN" | "NN" | "UC"
type_code = buildin_typecode | struct_class_typecode | array_type_code
buildin_typecode = dimension_code basic_type
dimension_code = scalar | vector | matrix
scalar = 'B'
vector = 'V' (1|2|3|4)
matrix = 'M' (1|2|3|4){2}
basic_type =
'S1' | 'U1' | 'S2' | 'U2' | 'S4' | 'U4' | 'S8' | 'U8' | 'F' | 'D' | 'V' | 'B'
struct_class_typecode = 'S' string '@@'
array_class_typecode = 'A' type_code size '@@'
和主流语言相比,本Mangling暂时不支持Qualifier(Class Member,Namespace Qualifiers)。以后在需要Qualifier的时候再酌情添加。也就是说暂时不会考虑现有版本和以后版本在二进制上的兼容性。
以下是一个mangling的例子:
double foo(); => Mfoo@@NNBD@Z