summaryrefslogtreecommitdiff
path: root/src/trans/mangling.cpp
blob: fc85f532fd2e32749675ba2ed7c3a32203159a75 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
 * MRustC - Rust Compiler
 * - By John Hodge (Mutabah/thePowersGang)
 *
 * trans/mangling.hpp
 * - Name mangling support
 */
#include "mangling.hpp"
#include <hir/type.hpp>
#include <hir/path.hpp>

::FmtLambda Trans_Mangle(const ::HIR::GenericPath& path)
{
    return FMT_CB(ss,
        ss << "_ZN" << path.m_path.m_crate_name.size() << path.m_path.m_crate_name;
        for(const auto& comp : path.m_path.m_components)
            ss << comp.size() << comp;
        );
}
::FmtLambda Trans_Mangle(const ::HIR::Path& path)
{
    TU_MATCHA( (path.m_data), (pe),
    (Generic,
        return Trans_Mangle(pe);
        ),
    (UfcsUnknown,
        BUG(Span(), "UfcsUnknown - " << path);
        ),
    (UfcsKnown,
        return FMT_CB(ss, );
        ),
    (UfcsInherent,
        return FMT_CB(ss, );
        )
    )
    throw "";
}
::FmtLambda Trans_Mangle(const ::HIR::TypeRef& ty)
{
    TU_MATCHA( (ty.m_data), (te),
    (Infer,
        BUG(Span(), "Infer in trans");
        ),
    (Diverge,
        return FMT_CB(ss, ss << "$D";);
        ),
    (Primitive,
        return FMT_CB(ss, ss << te;);
        ),
    (Path,
        return Trans_Mangle(te.path);
        ),
    (Generic,
        BUG(Span(), "Generic in trans - " << ty);
        ),
    (TraitObject,
        BUG(Span(), "Raw trait object - " << ty);
        ),
    (ErasedType,
        BUG(Span(), "ErasedType in trans - " << ty);
        ),
    (Array,
        return FMT_CB(ss, ss << "$A" << te.size_val << "_" << Trans_Mangle(*te.inner););
        ),
    (Slice,
        return FMT_CB(ss, ss << "$A" << "_" << Trans_Mangle(*te.inner););
        ),
    (Tuple,
        return FMT_CB(ss,
            ss << "$T";
            for(const auto& t : te)
                ss << "_" << Trans_Mangle(t);
            );
        ),
    (Borrow,
        return FMT_CB(ss,
            ss << "$R";
            switch(te.type)
            {
            case ::HIR::BorrowType::Shared: ss << "s"; break;
            case ::HIR::BorrowType::Unique: ss << "u"; break;
            case ::HIR::BorrowType::Owned : ss << "o"; break;
            }
            ss << "_" << Trans_Mangle(*te.inner);
            );
        ),
    (Pointer,
        return FMT_CB(ss,
            ss << "$P";
            switch(te.type)
            {
            case ::HIR::BorrowType::Shared: ss << "s"; break;
            case ::HIR::BorrowType::Unique: ss << "u"; break;
            case ::HIR::BorrowType::Owned : ss << "o"; break;
            }
            ss << "_" << Trans_Mangle(*te.inner);
            );
        ),
    (Function,
        return FMT_CB(ss,
            if(te.m_abi != "Rust")
                ss << "extern_" << te.m_abi << "_";
            if(te.is_unsafe)
                ss << "unsafe_";
            ss << "fn_" << te.m_arg_types.size();
            for(const auto& ty : te.m_arg_types)
                ss << "_" << Trans_Mangle(ty);
            ss << "_" << Trans_Mangle(*te.m_rettype);
            );
        ),
    (Closure,
        BUG(Span(), "Closure during trans - " << ty);
        )
    )
    
    throw "";
}