GCC Code Coverage Report


Directory: ../
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 100.0% 2 / 0 / 2
Functions: 100.0% 1 / 0 / 1
Branches: -% 0 / 0 / 0

src/irgenerator/OpRuleConversionManager.h
Line Branch Exec Source
1 // Copyright (c) 2021-2026 ChilliBits. All rights reserved.
2
3 #pragma once
4
5 #include <irgenerator/LLVMExprResult.h>
6 #include <symboltablebuilder/QualType.h>
7
8 #include <llvm/IR/IRBuilder.h>
9
10 // Forward declarations
11 namespace llvm {
12 class Value;
13 } // namespace llvm
14
15 namespace spice::compiler {
16
17 // Forward declarations
18 class SourceFile;
19 class IRGenerator;
20 class StdFunctionManager;
21 class SymbolTableEntry;
22 struct CodeLoc;
23
24 // Typedefs
25 using ResolverFct = const std::function<llvm::Value *()>;
26
27 #define COMB(en1, en2) ((en1) | ((en2) << 16))
28
29 static constexpr size_t DEFAULT_OP_IDX = 0;
30
31 /**
32 * Helper class for the IRGenerator to resolve operator instructions for each valid operator/type combination
33 */
34 class OpRuleConversionManager {
35 public:
36 // Constructors
37 OpRuleConversionManager(SourceFile *sourceFile, IRGenerator *irGenerator);
38
39 // Public methods
40 LLVMExprResult getPlusEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs,
41 QualType rhsSTy);
42 LLVMExprResult getMinusEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs,
43 QualType rhsSTy);
44 LLVMExprResult getMulEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs, QualType rhsSTy);
45 LLVMExprResult getDivEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs, QualType rhsSTy);
46 LLVMExprResult getRemEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs, QualType rhsSTy);
47 LLVMExprResult getSHLEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs, QualType rhsSTy);
48 LLVMExprResult getSHREqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs, QualType rhsSTy);
49 LLVMExprResult getAndEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs, QualType rhsSTy);
50 LLVMExprResult getOrEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs, QualType rhsSTy);
51 LLVMExprResult getXorEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs, QualType rhsSTy);
52 LLVMExprResult getBitwiseOrInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs, QualType rhsSTy,
53 size_t opIdx);
54 LLVMExprResult getBitwiseXorInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs,
55 QualType rhsSTy, size_t opIdx);
56 LLVMExprResult getBitwiseAndInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs,
57 QualType rhsSTy, size_t opIdx);
58 LLVMExprResult getEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs, QualType rhsSTy);
59 LLVMExprResult getNotEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs, QualType rhsSTy);
60 LLVMExprResult getLessInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs, QualType rhsSTy);
61 LLVMExprResult getGreaterInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs, QualType rhsSTy);
62 LLVMExprResult getLessEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs,
63 QualType rhsSTy);
64 LLVMExprResult getGreaterEqualInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs,
65 QualType rhsSTy);
66 LLVMExprResult getShiftLeftInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs, QualType rhsSTy,
67 size_t opIdx);
68 LLVMExprResult getShiftRightInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs,
69 QualType rhsSTy, size_t opIdx);
70 LLVMExprResult getPlusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs, QualType rhsSTy,
71 size_t opIdx);
72 LLVMExprResult getMinusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs, QualType rhsSTy,
73 size_t opIdx);
74 LLVMExprResult getMulInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs, QualType rhsSTy,
75 size_t opIdx);
76 LLVMExprResult getDivInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs, QualType rhsSTy,
77 size_t opIdx);
78 LLVMExprResult getRemInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy, LLVMExprResult &rhs,
79 QualType rhsSTy) const;
80 LLVMExprResult getPrefixMinusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) const;
81 LLVMExprResult getPrefixPlusPlusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) const;
82 LLVMExprResult getPrefixMinusMinusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) const;
83 LLVMExprResult getPrefixNotInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy) const;
84 LLVMExprResult getPrefixBitwiseNotInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy);
85 LLVMExprResult getPostfixPlusPlusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy);
86 LLVMExprResult getPostfixMinusMinusInst(const ASTNode *node, LLVMExprResult &lhs, QualType lhsSTy);
87 LLVMExprResult getCastInst(const ASTNode *node, QualType lhsSTy, LLVMExprResult &rhs, QualType rhsSTy) const;
88
89 // Operator overloading
90 bool callsOverloadedOpFct(const ASTNode *node, size_t opIdx) const;
91 template <size_t N>
92 LLVMExprResult callOperatorOverloadFct(const ASTNode *node, const std::array<ResolverFct, N * 2> &opV, size_t opIdx);
93
94 private:
95 // Members
96 llvm::IRBuilder<> &builder;
97 IRGenerator *irGenerator;
98 const StdFunctionManager &stdFunctionManager;
99
100 // Private methods
101 [[nodiscard]] llvm::Value *generateIToFp(const QualType &srcSTy, llvm::Value *srcV, llvm::Type *tgtT) const;
102 [[nodiscard]] llvm::Value *generateSHR(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
103 llvm::Value *rhsV) const;
104 [[nodiscard]] llvm::Value *generateLT(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
105 llvm::Value *rhsV) const;
106 [[nodiscard]] llvm::Value *generateGT(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
107 llvm::Value *rhsV) const;
108 [[nodiscard]] llvm::Value *generateLE(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
109 llvm::Value *rhsV) const;
110 [[nodiscard]] llvm::Value *generateGE(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
111 llvm::Value *rhsV) const;
112 [[nodiscard]] llvm::Value *generateDiv(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
113 llvm::Value *rhsV) const;
114 [[nodiscard]] llvm::Value *generateRem(const QualType &lhsSTy, const QualType &rhsSTy, llvm::Value *lhsV,
115 llvm::Value *rhsV) const;
116 41345 [[nodiscard]] static uint32_t getTypeCombination(const QualType &lhsTy, const QualType &rhsTy) {
117 41345 return COMB(lhsTy.getSuperType(), rhsTy.getSuperType());
118 }
119 };
120
121 } // namespace spice::compiler
122