3#ifndef _SAGEINTERFACE_ADA_H
4#define _SAGEINTERFACE_ADA_H 1
6#include "sage3basic.hhh"
7#include "sageInterface.h"
11#include <boost/optional.hpp>
19 template <
class SageRefExp>
21 auto symOf(
const SageRefExp& n) ->
decltype( *n.get_symbol() )
23 auto* symp = n.get_symbol();
24 ASSERT_not_null(symp);
29 template <
class SageSymbol>
31 auto declOf(
const SageSymbol& n) ->
decltype( *n.get_declaration() )
33 auto* dclp = n.get_declaration();
34 ASSERT_not_null(dclp);
42 return declOf(symOf(n));
48 return declOf(symOf(n));
55 template <
class SageAdaRefExp>
57 auto declOfRef(
const SageAdaRefExp& n) ->
decltype( *n.get_decl() )
59 auto* dclp = n.get_decl();
60 ASSERT_not_null(dclp);
98 return declOf(symOf(n));
125 template <
class SageRefExp>
127 auto nameOf(
const SageRefExp& n) ->
decltype( nameOf(symOf(n)) )
129 return nameOf(symOf(n));
170 extern const std::string roseOperatorPrefix;
171 extern const std::string packageStandardName;
172 extern const std::string durationTypeName;
173 extern const std::string exceptionName;
198 using StatementRange = std::pair<SgDeclarationStatementPtrList::iterator, SgDeclarationStatementPtrList::iterator>;
233 SgArrayType* type()
const {
return std::get<0>(*
this); }
234 std::vector<SgExpression*>
const& dims()
const {
return std::get<1>(*
this); }
235 std::vector<SgExpression*>& dims() {
return std::get<1>(*
this); }
259 using RecordFieldBase = std::tuple<const SgSymbol*>;
263 using base = RecordFieldBase;
267 const SgSymbol& originalSymbol()
const;
269 bool inherited()
const {
return isSgAliasSymbol(&symbol()); }
270 bool discriminant()
const;
279 std::vector<RecordField>
282 std::vector<RecordField>
288 template <
class SageLocatedNode>
289 struct IfInfo : std::tuple<SgExpression*, SageLocatedNode*>
291 using base = std::tuple<SgExpression*, SageLocatedNode*>;
294 SgExpression* condition()
const {
return std::get<0>(*
this); }
295 SageLocatedNode* trueBranch()
const {
return std::get<1>(*
this); }
296 bool isElse()
const {
return condition() ==
nullptr; }
305 std::vector<IfExpressionInfo>
309 std::vector<IfStatementInfo>
494 boost::optional<bool>
497 boost::optional<bool>
556 using TypeDescriptionBase = std::tuple<SgType*, bool, std::vector<SgAdaTypeConstraint*> >;
560 static constexpr bool classwide =
true;
562 using base = TypeDescriptionBase;
566 : base(&ty, polymorph, std::move(constr))
571 : base(ty,
false, {})
574 SgType* typerep()
const {
return std::get<0>(*
this); }
575 SgType& typerep_ref()
const;
576 bool polymorphic()
const {
return std::get<1>(*
this); }
578 const std::vector<SgAdaTypeConstraint*>&
579 toplevelConstraints()
const & {
return std::get<2>(*
this); }
581 std::vector<SgAdaTypeConstraint*>
582 toplevelConstraints() && {
return std::move(std::get<2>(*
this)); }
609 using DominantArgInfoBase = std::tuple<const SgType*, std::size_t>;
613 using base = DominantArgInfoBase;
616 const SgType* type()
const {
return std::get<0>(*
this); }
617 std::size_t pos()
const {
return std::get<1>(*
this); }
621 operatorArgumentWithNamedRootIfAvail(
const SgTypePtrList& argtypes);
623 using OperatorScopeInfoBase = std::tuple<SgScopeStatement*, std::size_t>;
627 using base = OperatorScopeInfoBase;
634 std::size_t argpos()
const {
return std::get<1>(*
this); }
683 const std::string& name()
const {
return std::get<0>(*
this); }
687 ASSERT_not_null(std::get<1>(*
this));
688 return *(std::get<1>(*
this));
695 ASSERT_not_null(std::get<3>(*
this));
696 return *std::get<3>(*
this);
701 std::vector<ImportedUnitResult>
720 SgExpressionPtrList::const_iterator,
721 SgExpressionPtrList::const_iterator
733 SgExpressionPtrList::const_iterator
begin()
const {
return std::get<1>(*
this); }
736 SgExpressionPtrList::const_iterator
end()
const {
return std::get<2>(*
this); }
787 using PrimitiveParameterDescBase = std::tuple<size_t, const SgInitializedName*, const SgDeclarationStatement*>;
791 using base = PrimitiveParameterDescBase;
796 pos()
const {
return std::get<0>(*
this); }
800 name()
const {
return std::get<1>(*
this); }
825 std::vector<PrimitiveParameterDesc>
828 std::vector<PrimitiveParameterDesc>
833 , std::vector<PrimitiveParameterDesc>
838 using base = PrimitiveSignatureElementsDescBase;
842 result()
const {
return std::get<0>(*
this); }
844 const std::vector<PrimitiveParameterDesc>&
845 parameters()
const & {
return std::get<1>(*
this); }
847 std::vector<PrimitiveParameterDesc>
848 parameters() && {
return std::move(std::get<1>(*
this)); }
942 std::tuple<const SgScopeStatement*, const SgSymbol*>
1171 struct ScopePath :
private std::vector<const SgScopeStatement*>
1173 using base = std::vector<const SgScopeStatement*>;
1176 using base::const_reverse_iterator;
1177 using base::reverse_iterator;
1178 using base::const_iterator;
1179 using base::value_type;
1180 using base::reference;
1193 ROSE_ASSERT(isSgScopeStatement(ptr) || isSgDeclarationStatement(ptr));
1194 ROSE_ASSERT(!isSgGlobal(ptr));
1196 base::push_back(ptr);
This class represents the concept of a block (not a basic block from control flow analysis).
This class represents the concept of a class definition in C++.
This class represents the concept of a C trinary conditional expression (e.g. "test ?...
This class represents the concept of a declaration statement.
This class represents the concept of an enum declaration.
This class represents the concept of a C and C++ expression list.
This class represents the notion of an expression. Expressions are derived from SgLocatedNodes,...
This class represents the variable declaration or variable initialization withn a for loop.
This class represents the concept of a for loop.
This class represents the concept of a C++ function call (which is an expression).
This class represents the concept of a function declaration statement.
This class represents the concept of a scope in C++ (e.g. global scope, fuction scope,...
This class represents the concept of a declaration list.
This class represents the function being called and must be assembled in the SgFunctionCall with the ...
This class represents a type for all functions.
This class represents the concept of a namespace definition.
This class represents the concept of an "if" construct.
This class represents the notion of a declared variable.
This class represents the concept of a C or C++ label statement.
This class represents the notion of an expression or statement which has a position within the source...
This class represents strings within the IR nodes.
This class represents the base class for all IR nodes within Sage III.
This class represents the concept of a C Assembler statement (untested).
This class represents the concept of a scope in C++ (e.g. global scope, fuction scope,...
This class represents the notion of a statement.
This class represents the concept of a name within the compiler.
virtual SgName get_name() const =0
Access function for getting name from declarations or types internally.
This class represents the concept of try statement within the try-catch support for exception handlin...
This class represents the base class for all types.
This class represents the variable refernece in expressions.
This class represents the concept of a C or C++ variable declaration.
bool tryFollowsDeclarativeBlock(const SgTryStmt &n)
returns true iff n is a try block following a declarative region
std::string convertRoseOperatorNameToAdaOperator(const std::string &nameInRose)
takes a function name as used in ROSE and converts it to an operator in Ada (i.e.,...
void conversionTraversal(std::function< void(SgNode *)> &&fn, SgNode *root)
bool isFixedType(const SgType *ty)
returns if the type ty is a fixed point type
SgAdaPackageBody & getBodyDefinition(const SgAdaPackageSpec &spec)
returns the body definition (scope) of the package specification
bool isBooleanType(const SgType *ty)
return if the type ty is the corresponding universal type representation in ROSE
SgScopeStatement * overridingScope(const SgExprListExp &args, const std::vector< PrimitiveParameterDesc > &primitiveArgs)
returns the overriding scope of a primitive function based on the associated arguments as defined by ...
PrimitiveSignatureElementsDesc primitiveSignatureElements(const SgFunctionDeclaration &)
returns the descriptions for result type and parameters that make an operation primitive.
FlatArrayType getArrayTypeInfo(SgType *atype)
returns a flattened representation of Ada array types.
SgFunctionSymbol * findPubliclyVisibleFunction(SgFunctionSymbol &fnsym, const SgFunctionType &drvFunTy, const SgNamedType &dervTy)
finds the function symbol for a publicly accessible function.
bool denotesRange(const SgExpression &e)
returns true if the expression e denotes a range
bool resolvesToFixedType(const SgType *ty)
returns if the type ty resolves to a fixed point type
std::tuple< SgAdaAncestorInitializer *, SgExpressionPtrList::const_iterator, SgExpressionPtrList::const_iterator > AggregateInfoBase
Details of expression aggregates.
StatementRange declsInPackage(SgGlobal &globalScope, const std::string &mainFile)
returns all statements/declarations in the global scope that were defined in the source file.
SgExpressionPtrList normalizedCallArguments2(const SgFunctionCallExp &n, const SgFunctionParameterList &arglist, bool withDefaultArguments=false)
returns a list of arguments with named arguments placed at the correct position by taking into accoun...
std::string convertStringLiteral(const char *img)
converts text to constant values
std::vector< IfExpressionInfo > flattenIfExpressions(const SgConditionalExp &n)
returns a flat representation of if expressions
void convertToCaseSensitiveSymbolTables(SgNode *root)
converts all symbol tables from case insensitive to case sensitive
SgAdaDiscriminatedTypeDecl * getAdaDiscriminatedTypeDecl(const SgDeclarationStatement &n)
returns the SgAdaDiscriminatedTypeDecl iff n is discriminated null otherwise
void copyFileInfo(SgLocatedNode &tgt, const SgLocatedNode &src)
copies the source code location from src to tgt.
bool isObjectRenaming(const SgAdaRenamingDecl *dcl)
returns true iff ty refers to an object renaming
void setSourcePositionInSubtreeToCompilerGenerated(SgLocatedNode *n)
sets source position in entire subtree of n to compiler generated
AggregateInfo splitAggregate(const SgExprListExp &exp)
returns the ancestor initializer, if exp refers to an extension aggregate null otherwise
bool isFloatingPointType(const SgType &ty)
return if the type ty is the corresponding universal type representation in ROSE
const SgFunctionType * functionType(const SgFunctionSymbol *fnsy)
returns the static type of the function symbol fnsy
void simpleTraversal(std::function< void(SgNode *)> &&fn, SgNode *root)
Traverses all AST nodes in an unspecified order.
bool isAnyAccessAttribute(const SgAdaAttributeExp &attr)
tests if attr is an access attribute
size_t positionalArgumentLimit(const SgExpressionPtrList &arglst)
finds the one past the last positional argument (aka the first named argument position).
SgScopeStatement * logicalParentScope(const SgScopeStatement &s)
returns the logical parent scope of a scope s.
SgAdaPackageSpecDecl * renamedPackage(const SgAdaRenamingDecl &n)
returns a package spec decl if the declaration n renames a package returns nullptr otherwise
SgExprListExp * isPragma(const SgPragmaDeclaration &prgdcl, const std::string &pragmaname)
tests if prgdcl is a pragma with name pragmaname.
bool isSeparatedDefinition(const SgFunctionDeclaration &n)
returns true iff n is a separated function definition is separated
SgExpression * underlyingExpr(const SgStatement *s)
returns the expression of an expression statement, or nullptr if s is some other node
long long int convertIntegerLiteral(const char *img)
converts text to constant values
SgScopeStatement * pkgStandardScope()
do not use, this is temporary
bool isSeparatedBody(const SgDeclarationStatement &n)
returns true iff n is a unit definition that has been separated
bool isScalarType(const SgType *ty)
returns true if ty refers to a scalar type
SgDeclarationStatement * associatedDeclaration(const SgSymbol &n)
returns the associated declaration for symbol n or nullptr if there is none.
const SgVariableDeclaration * exceptionTypeDecl(const SgVariableDeclaration &n)
returns n or a pointer to n if n declares an exception type.
bool explicitNullProcedure(const SgFunctionDefinition &fndef)
returns true, iff fndef is the body of an explicit null procedure
SgEnumType * characterBaseType(SgEnumType *ty)
checks if the type is based on one of the Standard character types.
bool isDiscreteType(const SgType *ty)
return if the type ty is the corresponding universal type representation in ROSE
bool explicitNullRecord(const SgClassDefinition &recdef)
returns true, iff recdef is the body of an explicit null record
std::tuple< SgArrayType *, std::vector< SgExpression * > > FlatArrayTypeBase
defines the result type for getArrayTypeInfo
OperatorScopeInfo operatorScope(const std::string &opname, const SgTypePtrList &argtypes)
returns the scope where an operator with name opname and argument types in argtypes shall be declared...
bool unconstrained(const SgArrayType *ty)
tests if ty is an unconstrained array
bool isDiscreteArrayType(const SgType &ty)
returns true if ty refers to a discrete array type
std::vector< PrimitiveParameterDesc > primitiveParameterPositions(const SgFunctionDeclaration &fn)
returns the descriptions for parameters that make an operation primitive.
std::tuple< const SgScopeStatement *, const SgSymbol * > findSymbolInContext(std::string id, const SgScopeStatement &scope, const SgScopeStatement *limit=nullptr)
finds the symbol with Naming tips in the context of scope or its logical parents in the range [scope,...
void convertToOperatorRepresentation(SgNode *root, bool convertCallSyntax=false, bool convertNamedArguments=false)
converts AST from a function call representation to operator form for fundamental operator declaratio...
SgFunctionParameterList * calleeParameterList(const SgFunctionCallExp &n)
returns the function parameter list of the associated callee (if available).
boost::optional< bool > booleanConstant(const SgExpression *e)
if e denotes an Ada boolean constant, it is returned; otherwise an empty result is returned.
bool isIntegerType(const SgType &ty)
return if the type ty is the corresponding universal type representation in ROSE
bool isReverseForLoop(const SgForStatement *n)
returns true, iff n is a reverse for loop; returns false otherwise
const SgScopeStatement * canonicalScope(const SgScopeStatement *scope)
returns the canonical scope of some Ada scope scope.
SgAdaGenericDecl & getGenericDecl(const SgAdaGenericInstanceDecl &n)
Returns SgAdaGenericDecl for a given SgAdaGenericInstanceDecl.
SgAdaGenericDecl * isGenericDecl(const SgDeclarationStatement &n)
Returns the SgAdaGenericDecl node that makes a declaration (either function/procedure or package) gen...
SgType & standardType(const std::string &name)
returns a type from the standard package with name Naming tips.
bool isModularType(const SgType &ty)
return if the type ty is the corresponding universal type representation in ROSE
bool unitRefDenotesGenericInstance(const SgAdaUnitRefExp &n)
returns true iff n refers to a generic declaration from inside said declaration false otherwise (e....
bool anonymousAccess(const SgType *ty)
tests if ty is an anonymous access type
bool isFunction(const SgFunctionType &ty)
returns true iff ty refers to a function type (as opposed to procedure)
bool isAttribute(const SgAdaAttributeExp &attr, const std::string &attrname)
tests if attr is an attribute with name attrname.
std::tuple< std::string, const SgDeclarationStatement *, const SgAdaRenamingDecl *, const SgExpression * > ImportedUnitResultBase
describes properties of imported units
char convertCharLiteral(const char *img)
converts text to constant values
SgRangeExp * range(const SgAdaAttributeExp *rangeAttribute)
returns a range for the range attribute rangeAttribute.
long double convertRealLiteral(const char *img)
converts text to constant values
bool isExceptionRenaming(const SgAdaRenamingDecl *dcl)
returns true iff ty refers to an exception renaming
std::vector< IfStatementInfo > flattenIfStatements(const SgIfStmt &n)
returns a flat representation of if-elsif-else statements
bool isDecimalFixedType(const SgType *ty)
returns if the type ty is a decimal fixed point type
TypeDescription typeOfExpr(const SgExpression &)
returns the type of an expression corrects for some peculiarities in the AST
SgType * baseOfAccessType(const SgType *ty)
returns the base type if ty is an access type
SgEnumDeclaration * baseEnumDeclaration(SgType *ty)
finds the underlying enum declaration of a type ty
bool blockExistsInSource(const SgBasicBlock *blk)
checks if the block blk is present in the Ada source code.
SgStatementPtrList::iterator declarationLimit(SgStatementPtrList &list)
returns the iterator to one past the last declaration (the limit) in the statement sequence.
std::vector< RecordField > getAllRecordFields(const SgClassDefinition &rec)
returns all fields (defined and inherited) of a record.
SgAdaPackageSpec & getSpecificationDefinition(const SgAdaPackageBody &body)
returns the specification definition (scope) of the package body
bool isPackageTryBlock(const SgTryStmt &n)
returns true iff n is an Ada package try block
SgType * baseType(const SgType &ty)
returns the base type of a type ty
bool hasSeparatedBody(const SgDeclarationStatement &dcl)
tests if the declaration decl corresponds to a stub (aka separated unit)
std::size_t normalizedArgumentPosition(const SgFunctionCallExp &call, const SgExpression &arg)
returns the parameter position of arg in the callee, after the parameters have been normalized.
int firstLastDimension(SgExprListExp &args)
returns an integer value for args[0] as used by type attributes first and last
bool isOutInoutArgument(const SgFunctionCallExp &call, const SgExpression &arg)
returns true if arg is a used as l-value in the call
bool withPrivateDefinition(const SgDeclarationStatement *dcl)
tests if the declaration dcl defines a public type that is completed in a private section.
bool sameCanonicalScope(const SgScopeStatement *lhs, const SgScopeStatement *rhs)
tests if lhs and have the same canonical scope.
void convertAdaToCxxComments(SgNode *root, bool cxxLineComments=true)
/}
ScopePath pathToGlobal(const SgScopeStatement &n)
Constructs a path from a scope statement to the top-level (global) scope.
SgAdaPackageSpecDecl & getSpecificationDeclaration(const SgAdaPackageBodyDecl &bodyDecl)
returns the declaration node for the package specification
const SgScopeStatement * correspondingBody(const SgScopeStatement *scope)
returns the body scope (aka definition) of a task, package, or protected object.
std::vector< ImportedUnitResult > importedUnits(const SgImportStatement &impdcl)
queries properties of all units in an import statement
SgScopeStatement * declarationScope(const SgType *ty)
returns the scope where type ty has been declared
TypeDescription typeRoot(SgType &)
returns the most fundamental type after skipping subtypes, typedefs, etc.
SgAdaPackageBodyDecl & getPackageBodyDeclaration(const SgAdaPackageSpecDecl &specDecl)
returns the declaration node for the package body, if available
long long int staticIntegralValue(SgExpression *n)
integer constant folding
bool hasUnknownDiscriminants(const SgAdaDiscriminatedTypeDecl &n)
returns true iff n has an unknown discriminant part
std::string convertRoseOperatorNameToAdaName(const std::string &nameInRose)
takes a function name as used in ROSE and converts it to a name in Ada (i.e., '"' + operator_text + '...
SgExpressionPtrList normalizedCallArguments(const SgFunctionCallExp &n, bool withDefaultArguments=false)
attempts to identify the argument list automatically and uses it to invoke the preceding normalizedCa...
Functions that are useful when operating on the AST.
std::string get_name(const SgNode *node)
Generate a useful name to describe the SgNode.
SgExpressionPtrList::const_iterator begin() const
returns the remaining range-begin without the ancestor initializer (if it existed)
SgExpressionPtrList::const_iterator end() const
returns the underlying's list end iterator
bool nullRecord() const
returns if the remaining range (w/o the ancestor initializer) indicates a null record.
SgAdaAncestorInitializer * ancestor() const
returns the ancestor initializer iff it exists, otherwise null
represents a branch in an if elsif else context (either statement or expression).
const SgDeclarationStatement * typeDeclaration() const
the associated type declaration
const SgInitializedName * name() const
the parameter's name in form of an SgInitializedName
size_t pos() const
the position within the parameter list
stores a path from an innermost scope to the global scope (not part of the path) in form of a sequenc...
void push_back(base::value_type ptr)
overload vector's push_back to check element validity