Changeset 54cd1a51


Ignore:
Timestamp:
Feb 11, 2025, 6:08:19 PM (7 months ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
master
Children:
502ff9e, a8404d9
Parents:
4d5c5b6a (diff), 691bf0a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

Files:
9 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Expr.cpp

    r4d5c5b6a r54cd1a51  
    2626#include "Stmt.hpp"
    2727#include "Type.hpp"
    28 #include "Util.hpp"                // for TranslationDeps
    2928#include "TypeSubstitution.hpp"
    3029#include "Common/Utility.hpp"
     
    281280// --- SizeofExpr
    282281
    283 SizeofExpr::SizeofExpr( const CodeLocation & loc, const Type * t )
    284 : Expr( loc, ast::TranslationDeps::getSizeType() ), type( t ) {}
     282SizeofExpr::SizeofExpr( const CodeLocation & loc, const Type * type )
     283: SizeofExpr( loc, type, nullptr ) {}
     284
     285SizeofExpr::SizeofExpr( const CodeLocation & loc, const Type * type, const Type * result )
     286: Expr( loc, result ), type( type ) {}
    285287
    286288// --- AlignofExpr
    287289
    288 AlignofExpr::AlignofExpr( const CodeLocation & loc, const Type * t )
    289 : Expr( loc, ast::TranslationDeps::getSizeType() ), type( t ) {}
     290AlignofExpr::AlignofExpr( const CodeLocation & loc, const Type * type )
     291: AlignofExpr( loc, type, nullptr ) {}
     292
     293AlignofExpr::AlignofExpr( const CodeLocation & loc, const Type * type, const Type * result )
     294: Expr( loc, result ), type( type ) {}
    290295
    291296// --- CountofExpr
    292297
    293298CountofExpr::CountofExpr( const CodeLocation & loc, const Type * t )
    294 : Expr( loc, ast::TranslationDeps::getSizeType() ), type( t ) {}
     299: Expr( loc ), type( t ) {}
    295300
    296301// --- OffsetofExpr
    297302
    298303OffsetofExpr::OffsetofExpr( const CodeLocation & loc, const Type * ty, const DeclWithType * mem )
    299 : Expr( loc, ast::TranslationDeps::getSizeType() ), type( ty ), member( mem ) {
     304: OffsetofExpr( loc, ty, mem, nullptr ) {}
     305
     306OffsetofExpr::OffsetofExpr( const CodeLocation & loc, const Type * ty, const DeclWithType * mem, const Type * res )
     307: Expr( loc, res ), type( ty ), member( mem ) {
    300308        assert( type );
    301309        assert( member );
     
    305313
    306314OffsetPackExpr::OffsetPackExpr( const CodeLocation & loc, const StructInstType * ty )
    307 : Expr( loc, new ArrayType{
    308         ast::TranslationDeps::getSizeType(), nullptr, FixedLen, DynamicDim }
    309 ), type( ty ) {
     315: Expr( loc ), type( ty ) {
    310316        assert( type );
    311317}
  • src/AST/Expr.hpp

    r4d5c5b6a r54cd1a51  
    483483
    484484        SizeofExpr( const CodeLocation & loc, const Type * t );
     485        SizeofExpr( const CodeLocation & loc, const Type * t, const Type * r );
    485486
    486487        const Expr * accept( Visitor & v ) const override { return v.visit( this ); }
     
    496497
    497498        AlignofExpr( const CodeLocation & loc, const Type * t );
     499        AlignofExpr( const CodeLocation & loc, const Type * t, const Type * r );
    498500
    499501        const Expr * accept( Visitor & v ) const override { return v.visit( this ); }
     
    538540
    539541        OffsetofExpr( const CodeLocation & loc, const Type * ty, const DeclWithType * mem );
     542        OffsetofExpr( const CodeLocation & loc, const Type * ty, const DeclWithType * mem, const Type * res );
    540543
    541544        const Expr * accept( Visitor & v ) const override { return v.visit( this ); }
  • src/AST/Util.cpp

    r4d5c5b6a r54cd1a51  
    384384}
    385385
    386 namespace {
    387         const TranslationUnit * transUnit = 0;
    388 }
    389 
    390 void TranslationDeps::evolve( TranslationUnit & u ) {
    391         transUnit = &u;
    392 }
    393 
    394 const ast::Type * TranslationDeps::getSizeType() {
    395         static const ast::Type * zd_abstract = new TypeInstType{ "size_t", TypeDecl::Kind::Dtype };
    396         static const ast::Type * ld_concrete = new BasicType( BasicKind::LongUnsignedInt );
    397         if ( ! transUnit ) {
    398                 // early state
    399                 // as if `size_t` in program text were freshly parsed
    400                 return zd_abstract;
    401         } else if ( transUnit->global.sizeType ) {
    402                 // late state, normal run
    403                 // whatever size_t was defined as
    404                 return transUnit->global.sizeType;
    405         } else {
    406                 // late state, no prelude (-n)
    407                 // placeholder: cfa-cpp is being used experimentally, stay out of the way
    408                 return ld_concrete;
    409         }
    410 }
    411 
    412 
    413386} // namespace ast
  • src/AST/Util.hpp

    r4d5c5b6a r54cd1a51  
    2626void checkInvariants( TranslationUnit & );
    2727
    28 /// Maintains an AST-module state for contextual information needed in
    29 /// ast::* implementations, notably constructors:
    30 ///    early: while parsing, use bootstrap versions
    31 ///    late: once a whole TranslationUnit exists, use its answers
    32 /// When the program is in the later state, ast::* construcors effectively get
    33 /// the benefit of WithTranslationUnit, without having to pass them one.
    34 class TranslationDeps {
    35 
    36     TranslationDeps() = delete;
    37 
    38     friend class SizeofExpr;
    39     friend class AlignofExpr;
    40     friend class CountofExpr;
    41     friend class OffsetofExpr;
    42     friend class OffsetPackExpr;
    43 
    44     /// Appropriate return type for built-in expressions that report on sizes
    45     static const Type * getSizeType();
    46 
    47   public:
    48     /// Transition from early to late states
    49     static void evolve( TranslationUnit & );
    50 };
    51 
    5228}
  • src/ResolvExpr/CandidateFinder.cpp

    r4d5c5b6a r54cd1a51  
    14861486
    14871487        void Finder::postvisit( const ast::SizeofExpr * sizeofExpr ) {
     1488                const ast::Type * type = resolveTypeof( sizeofExpr->type, context );
     1489                const ast::Type * sizeType = context.global.sizeType.get();
    14881490                addCandidate(
    1489                         new ast::SizeofExpr{
    1490                                 sizeofExpr->location, resolveTypeof( sizeofExpr->type, context ) },
     1491                        new ast::SizeofExpr( sizeofExpr->location, type, sizeType ),
     1492                        tenv );
     1493        }
     1494
     1495        void Finder::postvisit( const ast::AlignofExpr * alignofExpr ) {
     1496                const ast::Type * type = resolveTypeof( alignofExpr->type, context );
     1497                const ast::Type * sizeType = context.global.sizeType.get();
     1498                addCandidate(
     1499                        new ast::AlignofExpr( alignofExpr->location, type, sizeType ),
    14911500                        tenv );
    14921501        }
     
    15161525        }
    15171526
    1518         void Finder::postvisit( const ast::AlignofExpr * alignofExpr ) {
    1519                 addCandidate(
    1520                         new ast::AlignofExpr{
    1521                                 alignofExpr->location, resolveTypeof( alignofExpr->type, context ) },
    1522                         tenv );
    1523         }
    1524 
    15251527        void Finder::postvisit( const ast::UntypedOffsetofExpr * offsetofExpr ) {
    15261528                const ast::BaseInstType * aggInst;
     
    15291531                else return;
    15301532
     1533                const ast::Type * sizeType = context.global.sizeType.get();
    15311534                for ( const ast::Decl * member : aggInst->lookup( offsetofExpr->member ) ) {
    15321535                        auto dwt = strict_dynamic_cast< const ast::DeclWithType * >( member );
    15331536                        addCandidate(
    1534                                 new ast::OffsetofExpr{ offsetofExpr->location, aggInst, dwt }, tenv );
     1537                                new ast::OffsetofExpr( offsetofExpr->location, aggInst, dwt, sizeType ), tenv );
    15351538                }
    15361539        }
  • src/main.cpp

    r4d5c5b6a r54cd1a51  
    199199                Stats::Time::StopBlock();
    200200
    201                 ast::TranslationDeps::evolve( transUnit );
    202 
    203201                PASS( "Hoist Type Decls", Validate::hoistTypeDecls, transUnit );
    204202
  • tests/.expect/alloc-ERROR.arm64.txt

    r4d5c5b6a r54cd1a51  
    1616          Name: stp
    1717
    18       ... with resolved type:
    19         unsigned long int
    2018
    2119
  • tests/.expect/alloc-ERROR.x64.txt

    r4d5c5b6a r54cd1a51  
    1616          Name: stp
    1717
    18       ... with resolved type:
    19         unsigned long int
    2018
    2119
  • tests/.expect/alloc-ERROR.x86.txt

    r4d5c5b6a r54cd1a51  
    1616          Name: stp
    1717
    18       ... with resolved type:
    19         unsigned int
    2018
    2119
Note: See TracChangeset for help on using the changeset viewer.