source: src/SymTab/Mangler.cc @ a8555c5

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsdeferred_resndemanglerenumforall-pointer-decayjacob/cs343-translationjenkins-sandboxnew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newwith_gc
Last change on this file since a8555c5 was d67cdb7, checked in by Peter A. Buhr <pabuhr@…>, 7 years ago

merge

  • Property mode set to 100644
File size: 10.1 KB
RevLine 
[0dd3a2f]1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
[8c49c0e]7// Mangler.cc --
[0dd3a2f]8//
9// Author           : Richard C. Bilson
10// Created On       : Sun May 17 21:40:29 2015
[201aeb9]11// Last Modified By : Peter A. Buhr
12// Last Modified On : Mon Sep 25 15:49:26 2017
13// Update Count     : 23
[0dd3a2f]14//
[30f9072]15#include "Mangler.h"
[0dd3a2f]16
[30f9072]17#include <algorithm>                // for copy, transform
18#include <cassert>                  // for assert, assertf
19#include <functional>               // for const_mem_fun_t, mem_fun
20#include <iterator>                 // for ostream_iterator, back_insert_ite...
21#include <list>                     // for _List_iterator, list, _List_const...
[c3acf0aa]22#include <string>                   // for string, char_traits, operator<<
[51b7345]23
[30f9072]24#include "CodeGen/OperatorTable.h"  // for OperatorInfo, operatorLookup
[c3acf0aa]25#include "Common/SemanticError.h"   // for SemanticError
[30f9072]26#include "Common/utility.h"         // for toString
27#include "Parser/LinkageSpec.h"     // for Spec, isOverridable, AutoGen, Int...
28#include "SynTree/Declaration.h"    // for TypeDecl, DeclarationWithType
29#include "SynTree/Expression.h"     // for TypeExpr, Expression, operator<<
30#include "SynTree/Type.h"           // for Type, ReferenceToType, Type::Fora...
[51b7345]31
32namespace SymTab {
[d67cdb7]33        std::string Mangler::mangleType( Type * ty ) {
[69911c11]34                Mangler mangler( false, true );
35                maybeAccept( ty, mangler );
36                return mangler.get_mangleName();
37        }
[8c49c0e]38
[69911c11]39        Mangler::Mangler( bool mangleOverridable, bool typeMode )
40                : nextVarNum( 0 ), isTopLevel( true ), mangleOverridable( mangleOverridable ), typeMode( typeMode ) {}
[8c49c0e]41
[a08ba92]42        Mangler::Mangler( const Mangler &rhs ) : mangleName() {
[0dd3a2f]43                varNums = rhs.varNums;
44                nextVarNum = rhs.nextVarNum;
45                isTopLevel = rhs.isTopLevel;
[4aa0858]46                mangleOverridable = rhs.mangleOverridable;
[69911c11]47                typeMode = rhs.typeMode;
[a08ba92]48        }
[51b7345]49
[d67cdb7]50        void Mangler::mangleDecl( DeclarationWithType * declaration ) {
[0dd3a2f]51                bool wasTopLevel = isTopLevel;
52                if ( isTopLevel ) {
53                        varNums.clear();
54                        nextVarNum = 0;
55                        isTopLevel = false;
56                } // if
57                mangleName << "__";
58                CodeGen::OperatorInfo opInfo;
59                if ( operatorLookup( declaration->get_name(), opInfo ) ) {
60                        mangleName << opInfo.outputName;
61                } else {
62                        mangleName << declaration->get_name();
63                } // if
64                mangleName << "__";
65                maybeAccept( declaration->get_type(), *this );
[4aa0858]66                if ( mangleOverridable && LinkageSpec::isOverridable( declaration->get_linkage() ) ) {
67                        // want to be able to override autogenerated and intrinsic routines,
68                        // so they need a different name mangling
69                        if ( declaration->get_linkage() == LinkageSpec::AutoGen ) {
70                                mangleName << "autogen__";
71                        } else if ( declaration->get_linkage() == LinkageSpec::Intrinsic ) {
72                                mangleName << "intrinsic__";
73                        } else {
74                                // if we add another kind of overridable function, this has to change
[fa4805f]75                                assert( false && "unknown overrideable linkage" );
[4aa0858]76                        } // if
77                }
[0dd3a2f]78                isTopLevel = wasTopLevel;
[a08ba92]79        }
[51b7345]80
[d67cdb7]81        void Mangler::visit( ObjectDecl * declaration ) {
[0dd3a2f]82                mangleDecl( declaration );
[a08ba92]83        }
[51b7345]84
[d67cdb7]85        void Mangler::visit( FunctionDecl * declaration ) {
[0dd3a2f]86                mangleDecl( declaration );
[a08ba92]87        }
[51b7345]88
[d67cdb7]89        void Mangler::visit( VoidType * voidType ) {
[0dd3a2f]90                printQualifiers( voidType );
91                mangleName << "v";
[a08ba92]92        }
[51b7345]93
[d67cdb7]94        void Mangler::visit( BasicType * basicType ) {
[0dd3a2f]95                static const char *btLetter[] = {
96                        "b",    // Bool
97                        "c",    // Char
98                        "Sc",   // SignedChar
99                        "Uc",   // UnsignedChar
100                        "s",    // ShortSignedInt
101                        "Us",   // ShortUnsignedInt
102                        "i",    // SignedInt
103                        "Ui",   // UnsignedInt
104                        "l",    // LongSignedInt
105                        "Ul",   // LongUnsignedInt
106                        "q",    // LongLongSignedInt
107                        "Uq",   // LongLongUnsignedInt
108                        "f",    // Float
109                        "d",    // Double
110                        "r",    // LongDouble
111                        "Xf",   // FloatComplex
112                        "Xd",   // DoubleComplex
113                        "Xr",   // LongDoubleComplex
114                        "If",   // FloatImaginary
115                        "Id",   // DoubleImaginary
116                        "Ir",   // LongDoubleImaginary
[201aeb9]117                        "w",    // SignedInt128
118                        "Uw",   // UnsignedInt128
[0dd3a2f]119                };
[8c49c0e]120
[0dd3a2f]121                printQualifiers( basicType );
122                mangleName << btLetter[ basicType->get_kind() ];
[a08ba92]123        }
[51b7345]124
[d67cdb7]125        void Mangler::visit( PointerType * pointerType ) {
[0dd3a2f]126                printQualifiers( pointerType );
127                mangleName << "P";
128                maybeAccept( pointerType->get_base(), *this );
[a08ba92]129        }
[51b7345]130
[d67cdb7]131        void Mangler::visit( ArrayType * arrayType ) {
[0dd3a2f]132                // TODO: encode dimension
133                printQualifiers( arrayType );
134                mangleName << "A0";
135                maybeAccept( arrayType->get_base(), *this );
[a08ba92]136        }
[51b7345]137
[d67cdb7]138        void Mangler::visit( ReferenceType * refType ) {
[25bd9074]139                printQualifiers( refType );
140                mangleName << "R";
141                maybeAccept( refType->get_base(), *this );
142        }
143
[a08ba92]144        namespace {
[0dd3a2f]145                inline std::list< Type* > getTypes( const std::list< DeclarationWithType* > decls ) {
146                        std::list< Type* > ret;
147                        std::transform( decls.begin(), decls.end(), std::back_inserter( ret ),
148                                                        std::mem_fun( &DeclarationWithType::get_type ) );
149                        return ret;
150                }
[a08ba92]151        }
[51b7345]152
[d67cdb7]153        void Mangler::visit( FunctionType * functionType ) {
[0dd3a2f]154                printQualifiers( functionType );
155                mangleName << "F";
156                std::list< Type* > returnTypes = getTypes( functionType->get_returnVals() );
157                acceptAll( returnTypes, *this );
158                mangleName << "_";
159                std::list< Type* > paramTypes = getTypes( functionType->get_parameters() );
160                acceptAll( paramTypes, *this );
161                mangleName << "_";
[a08ba92]162        }
[51b7345]163
[d67cdb7]164        void Mangler::mangleRef( ReferenceToType * refType, std::string prefix ) {
[0dd3a2f]165                printQualifiers( refType );
[8360977]166
[0dd3a2f]167                mangleName << ( refType->get_name().length() + prefix.length() ) << prefix << refType->get_name();
[a08ba92]168        }
[51b7345]169
[d67cdb7]170        void Mangler::mangleGenericRef( ReferenceToType * refType, std::string prefix ) {
[8360977]171                printQualifiers( refType );
172
173                std::ostringstream oldName( mangleName.str() );
174                mangleName.clear();
175
176                mangleName << prefix << refType->get_name();
177
178                std::list< Expression* >& params = refType->get_parameters();
179                if ( ! params.empty() ) {
180                        mangleName << "_";
181                        for ( std::list< Expression* >::const_iterator param = params.begin(); param != params.end(); ++param ) {
182                                TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param );
[064cb18]183                                assertf(paramType, "Aggregate parameters should be type expressions: %s", toString(*param).c_str());
[69911c11]184                                maybeAccept( paramType->get_type(), *this );
[8360977]185                        }
186                        mangleName << "_";
187                }
188
189                oldName << mangleName.str().length() << mangleName.str();
190                mangleName.str( oldName.str() );
191        }
192
[d67cdb7]193        void Mangler::visit( StructInstType * aggregateUseType ) {
[69911c11]194                if ( typeMode ) mangleGenericRef( aggregateUseType, "s" );
195                else mangleRef( aggregateUseType, "s" );
[a08ba92]196        }
[51b7345]197
[d67cdb7]198        void Mangler::visit( UnionInstType * aggregateUseType ) {
[69911c11]199                if ( typeMode ) mangleGenericRef( aggregateUseType, "u" );
200                else mangleRef( aggregateUseType, "u" );
[a08ba92]201        }
[51b7345]202
[d67cdb7]203        void Mangler::visit( EnumInstType * aggregateUseType ) {
[0dd3a2f]204                mangleRef( aggregateUseType, "e" );
[a08ba92]205        }
[51b7345]206
[d67cdb7]207        void Mangler::visit( TypeInstType * typeInst ) {
[0dd3a2f]208                VarMapType::iterator varNum = varNums.find( typeInst->get_name() );
209                if ( varNum == varNums.end() ) {
210                        mangleRef( typeInst, "t" );
211                } else {
212                        printQualifiers( typeInst );
[5f2f2d7]213                        std::ostringstream numStream;
[0dd3a2f]214                        numStream << varNum->second.first;
215                        switch ( (TypeDecl::Kind )varNum->second.second ) {
216                          case TypeDecl::Any:
217                                mangleName << "t";
218                                break;
219                          case TypeDecl::Dtype:
220                                mangleName << "d";
221                                break;
222                          case TypeDecl::Ftype:
223                                mangleName << "f";
224                                break;
[8bf784a]225                                case TypeDecl::Ttype:
226                                mangleName << "tVARGS";
227                                break;
228                                default:
229                                assert( false );
[0dd3a2f]230                        } // switch
[5f2f2d7]231                        mangleName << numStream.str();
[0dd3a2f]232                } // if
[a08ba92]233        }
[51b7345]234
[d67cdb7]235        void Mangler::visit( TupleType * tupleType ) {
[0dd3a2f]236                printQualifiers( tupleType );
237                mangleName << "T";
[d67cdb7]238                acceptAll( tupleType->types, *this );
[0dd3a2f]239                mangleName << "_";
[a08ba92]240        }
[51b7345]241
[d67cdb7]242        void Mangler::visit( VarArgsType * varArgsType ) {
[540ddb7d]243                printQualifiers( varArgsType );
[44b7088]244                mangleName << "VARGS";
245        }
246
[d67cdb7]247        void Mangler::visit( ZeroType * ) {
[89e6ffc]248                mangleName << "Z";
249        }
250
[d67cdb7]251        void Mangler::visit( OneType * ) {
[89e6ffc]252                mangleName << "O";
253        }
254
[d67cdb7]255        void Mangler::visit( TypeDecl * decl ) {
[0dd3a2f]256                static const char *typePrefix[] = { "BT", "BD", "BF" };
[d67cdb7]257                mangleName << typePrefix[ decl->get_kind() ] << ( decl->name.length() + 1 ) << decl->name;
[a08ba92]258        }
[51b7345]259
[a08ba92]260        void printVarMap( const std::map< std::string, std::pair< int, int > > &varMap, std::ostream &os ) {
[0dd3a2f]261                for ( std::map< std::string, std::pair< int, int > >::const_iterator i = varMap.begin(); i != varMap.end(); ++i ) {
262                        os << i->first << "(" << i->second.first << "/" << i->second.second << ")" << std::endl;
263                } // for
[a08ba92]264        }
[51b7345]265
[d67cdb7]266        void Mangler::printQualifiers( Type * type ) {
[78dd0da]267                // skip if not including qualifiers
[69911c11]268                if ( typeMode ) return;
[8c49c0e]269
[0dd3a2f]270                if ( ! type->get_forall().empty() ) {
271                        std::list< std::string > assertionNames;
[8bf784a]272                        int tcount = 0, dcount = 0, fcount = 0, vcount = 0;
[0dd3a2f]273                        mangleName << "A";
[d67cdb7]274                        for ( Type::ForallList::iterator i = type->forall.begin(); i != type->forall.end(); ++i ) {
[0dd3a2f]275                                switch ( (*i)->get_kind() ) {
276                                  case TypeDecl::Any:
277                                        tcount++;
278                                        break;
279                                  case TypeDecl::Dtype:
280                                        dcount++;
281                                        break;
282                                  case TypeDecl::Ftype:
283                                        fcount++;
284                                        break;
[8bf784a]285                                  case TypeDecl::Ttype:
286                                        vcount++;
287                                        break;
288                                  default:
289                                        assert( false );
[0dd3a2f]290                                } // switch
[d67cdb7]291                                varNums[ (*i)->name ] = std::pair< int, int >( nextVarNum++, (int)(*i)->get_kind() );
292                                for ( std::list< DeclarationWithType* >::iterator assert = (*i)->assertions.begin(); assert != (*i)->assertions.end(); ++assert ) {
[69911c11]293                                        Mangler sub_mangler( mangleOverridable, typeMode );
[0dd3a2f]294                                        sub_mangler.nextVarNum = nextVarNum;
295                                        sub_mangler.isTopLevel = false;
296                                        sub_mangler.varNums = varNums;
297                                        (*assert)->accept( sub_mangler );
[5f2f2d7]298                                        assertionNames.push_back( sub_mangler.mangleName.str() );
[0dd3a2f]299                                } // for
300                        } // for
[8bf784a]301                        mangleName << tcount << "_" << dcount << "_" << fcount << "_" << vcount << "_";
[0dd3a2f]302                        std::copy( assertionNames.begin(), assertionNames.end(), std::ostream_iterator< std::string >( mangleName, "" ) );
303                        mangleName << "_";
304                } // if
[615a096]305                if ( type->get_const() ) {
[0dd3a2f]306                        mangleName << "C";
307                } // if
[615a096]308                if ( type->get_volatile() ) {
[0dd3a2f]309                        mangleName << "V";
310                } // if
[d67cdb7]311                if ( type->get_mutex() ) {
312                        mangleName << "M";
313                } // if
[8884112]314                // Removed due to restrict not affecting function compatibility in GCC
315//              if ( type->get_isRestrict() ) {
[25bd9074]316//                      mangleName << "E";
[8884112]317//              } // if
[615a096]318                if ( type->get_lvalue() ) {
[d67cdb7]319                        // mangle based on whether the type is lvalue, so that the resolver can differentiate lvalues and rvalues
[0dd3a2f]320                        mangleName << "L";
[d67cdb7]321                }
[615a096]322                if ( type->get_atomic() ) {
[0dd3a2f]323                        mangleName << "A";
324                } // if
[a08ba92]325        }
[0dd3a2f]326} // namespace SymTab
327
328// Local Variables: //
329// tab-width: 4 //
330// mode: c++ //
331// compile-command: "make install" //
332// End: //
Note: See TracBrowser for help on using the repository browser.