source: src/CodeGen/FixNames.cc @ 5ddb8bf

Last change on this file since 5ddb8bf was 61efa42, checked in by Andrew Beach <ajbeach@…>, 12 months ago

Took the special main linkage code out of FunctionDecl? and put it into a new pass. There is also a lot of related clean-up done.

  • Property mode set to 100644
File size: 2.5 KB
RevLine 
[51587aa]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//
[11df881]7// FixNames.cc -- Adjustments to typed declarations.
[51587aa]8//
9// Author           : Richard C. Bilson
10// Created On       : Mon May 18 07:44:20 2015
[f42fc13]11// Last Modified By : Andrew Beach
[b585593]12// Last Modified On : Wed Jul 20 11:49:00 2022
13// Update Count     : 24
[51587aa]14//
[51b7345]15
16#include "FixNames.h"
[bf2438c]17
18#include <memory>                  // for unique_ptr
19#include <string>                  // for string, operator!=, operator==
20
[0c577f7]21#include "AST/Chain.hpp"
22#include "AST/Expr.hpp"
23#include "AST/Pass.hpp"
[bf2438c]24#include "Common/SemanticError.h"  // for SemanticError
25#include "FixMain.h"               // for FixMain
26#include "SymTab/Mangler.h"        // for Mangler
[16ba4a6f]27#include "CompilationState.h"
[0270824]28
[51b7345]29namespace CodeGen {
[61efa42]30
31namespace {
32
[0c577f7]33/// Does work with the main function and scopeLevels.
[61efa42]34class FixNames final {
[0c577f7]35        int scopeLevel = 1;
36
37        bool shouldSetScopeLevel( const ast::DeclWithType * dwt ) {
38                return !dwt->name.empty() && dwt->linkage.is_mangled
39                        && dwt->scopeLevel != scopeLevel;
40        }
41public:
42        const ast::ObjectDecl *postvisit( const ast::ObjectDecl *objectDecl ) {
43                if ( shouldSetScopeLevel( objectDecl ) ) {
44                        return ast::mutate_field( objectDecl, &ast::ObjectDecl::scopeLevel, scopeLevel );
45                }
46                return objectDecl;
47        }
48
49        const ast::FunctionDecl *postvisit( const ast::FunctionDecl *functionDecl ) {
[61efa42]50                if ( isMain( functionDecl ) ) {
[2fd0de0]51                        auto mutDecl = ast::mutate( functionDecl );
52
53                        if ( shouldSetScopeLevel( mutDecl ) ) {
54                                mutDecl->scopeLevel = scopeLevel;
55                        }
[0c577f7]56
57                        int nargs = mutDecl->params.size();
58                        if ( 0 != nargs && 2 != nargs && 3 != nargs ) {
59                                SemanticError( functionDecl, "Main expected to have 0, 2 or 3 arguments\n" );
60                        }
61                        ast::chain_mutate( mutDecl->stmts )->kids.push_back(
62                                new ast::ReturnStmt(
63                                        mutDecl->location,
64                                        ast::ConstantExpr::from_int( mutDecl->location, 0 )
65                                )
66                        );
[2fd0de0]67
68                        return mutDecl;
69                } else if ( shouldSetScopeLevel( functionDecl ) ) {
70                        return ast::mutate_field( functionDecl, &ast::FunctionDecl::scopeLevel, scopeLevel );
71                } else {
72                        return functionDecl;
[0c577f7]73                }
74        }
75
76        void previsit( const ast::CompoundStmt * ) {
[b585593]77                scopeLevel += 1;
78        }
79
80        void postvisit( const ast::CompoundStmt * ) {
81                scopeLevel -= 1;
[0c577f7]82        }
83};
84
[61efa42]85} // namespace
86
[0c577f7]87void fixNames( ast::TranslationUnit & translationUnit ) {
[61efa42]88        ast::Pass<FixNames>::run( translationUnit );
[0c577f7]89}
90
[51b7345]91} // namespace CodeGen
[51587aa]92
93// Local Variables: //
94// tab-width: 4 //
95// mode: c++ //
96// compile-command: "make install" //
97// End: //
Note: See TracBrowser for help on using the repository browser.