FLANG
CrossToolHelpers.h
1//===-- Tools/CrossToolHelpers.h --------------------------------- *-C++-*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8// A header file for containing functionallity that is used across Flang tools,
9// such as helper functions which apply or generate information needed accross
10// tools like bbc and flang.
11//===----------------------------------------------------------------------===//
12
13#ifndef FORTRAN_TOOLS_CROSS_TOOL_HELPERS_H
14#define FORTRAN_TOOLS_CROSS_TOOL_HELPERS_H
15
16#include "flang/Frontend/CodeGenOptions.h"
18#include "flang/Support/LangOptions.h"
20#include <cstdint>
21
22#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
23#include "mlir/Pass/PassRegistry.h"
24#include "llvm/ADT/SmallVector.h"
25#include "llvm/Frontend/Debug/Options.h"
26#include "llvm/Passes/OptimizationLevel.h"
27
28// Flang Extension Point Callbacks
30public:
31 void registerFIROptEarlyEPCallbacks(
32 const std::function<void(mlir::PassManager &, llvm::OptimizationLevel)>
33 &C) {
34 FIROptEarlyEPCallbacks.push_back(C);
35 }
36
37 void registerFIRInlinerCallback(
38 const std::function<void(mlir::PassManager &, llvm::OptimizationLevel)>
39 &C) {
40 FIRInlinerCallback.push_back(C);
41 }
42
43 void registerFIROptLastEPCallbacks(
44 const std::function<void(mlir::PassManager &, llvm::OptimizationLevel)>
45 &C) {
46 FIROptLastEPCallbacks.push_back(C);
47 }
48
49 void registerHLFIROptEarlyEPCallbacks(
50 const std::function<void(mlir::PassManager &, llvm::OptimizationLevel)>
51 &C) {
52 HLFIROptEarlyEPCallbacks.push_back(C);
53 }
54
55 void registerHLFIROptLastEPCallbacks(
56 const std::function<void(mlir::PassManager &, llvm::OptimizationLevel)>
57 &C) {
58 HLFIROptLastEPCallbacks.push_back(C);
59 }
60
61 void invokeFIROptEarlyEPCallbacks(
62 mlir::PassManager &pm, llvm::OptimizationLevel optLevel) {
63 for (auto &C : FIROptEarlyEPCallbacks)
64 C(pm, optLevel);
65 };
66
67 void invokeFIRInlinerCallback(
68 mlir::PassManager &pm, llvm::OptimizationLevel optLevel) {
69 for (auto &C : FIRInlinerCallback)
70 C(pm, optLevel);
71 };
72
73 void invokeFIROptLastEPCallbacks(
74 mlir::PassManager &pm, llvm::OptimizationLevel optLevel) {
75 for (auto &C : FIROptLastEPCallbacks)
76 C(pm, optLevel);
77 };
78
79 void invokeHLFIROptEarlyEPCallbacks(
80 mlir::PassManager &pm, llvm::OptimizationLevel optLevel) const {
81 for (auto &C : HLFIROptEarlyEPCallbacks)
82 C(pm, optLevel);
83 };
84
85 void invokeHLFIROptLastEPCallbacks(
86 mlir::PassManager &pm, llvm::OptimizationLevel optLevel) const {
87 for (auto &C : HLFIROptLastEPCallbacks)
88 C(pm, optLevel);
89 };
90
91private:
93 std::function<void(mlir::PassManager &, llvm::OptimizationLevel)>, 1>
94 FIROptEarlyEPCallbacks;
95
97 std::function<void(mlir::PassManager &, llvm::OptimizationLevel)>, 1>
98 FIRInlinerCallback;
99
101 std::function<void(mlir::PassManager &, llvm::OptimizationLevel)>, 1>
102 FIROptLastEPCallbacks;
103
105 std::function<void(mlir::PassManager &, llvm::OptimizationLevel)>, 1>
106 HLFIROptEarlyEPCallbacks;
107
109 std::function<void(mlir::PassManager &, llvm::OptimizationLevel)>, 1>
110 HLFIROptLastEPCallbacks;
111};
112
114struct MLIRToLLVMPassPipelineConfig : public FlangEPCallBacks {
115 explicit MLIRToLLVMPassPipelineConfig(llvm::OptimizationLevel level)
116 : OptLevel(level),
117 optimizeArrayExpression(level != llvm::OptimizationLevel::O0) {}
118 explicit MLIRToLLVMPassPipelineConfig(llvm::OptimizationLevel level,
120 const Fortran::common::MathOptionsBase &mathOpts)
121 : MLIRToLLVMPassPipelineConfig(level) {
122 StackArrays = opts.StackArrays;
123 EnableSafeTrampoline = opts.EnableSafeTrampoline;
124 Underscoring = opts.Underscoring;
125 LoopVersioning = opts.LoopVersioning;
126 LoopTripCountVersioning = opts.LoopTripCountVersioning;
127 DebugInfo = opts.getDebugInfo();
128 AliasAnalysis = opts.AliasAnalysis;
129 FramePointerKind = opts.getFramePointer();
130 // The logic for setting these attributes is intended to match the logic
131 // used in Clang.
132 NoInfsFPMath = mathOpts.getNoHonorInfs();
133 NoNaNsFPMath = mathOpts.getNoHonorNaNs();
134 ApproxFuncFPMath = mathOpts.getApproxFunc();
135 NoSignedZerosFPMath = mathOpts.getNoSignedZeros();
136 UnsafeFPMath = mathOpts.getAssociativeMath() &&
137 mathOpts.getReciprocalMath() && NoSignedZerosFPMath &&
138 ApproxFuncFPMath && mathOpts.getFPContractEnabled();
141 UseSampleProfile = !opts.SampleProfileFile.empty();
142 UniqueInternalLinkageNames = opts.UniqueInternalLinkageNames;
143 DebugInfoForProfiling = opts.DebugInfoForProfiling;
144 if (opts.InstrumentFunctions) {
145 InstrumentFunctionEntry = "__cyg_profile_func_enter";
146 InstrumentFunctionExit = "__cyg_profile_func_exit";
147 }
148 DisableTailCalls = opts.DisableTailCalls;
149 DwarfVersion = opts.DwarfVersion;
152 }
153
154 llvm::OptimizationLevel OptLevel;
157 bool StackArrays = false;
159 bool Underscoring = true;
160 bool LoopVersioning = false;
162 bool AliasAnalysis = false;
163 llvm::codegenoptions::DebugInfoKind DebugInfo =
164 llvm::codegenoptions::NoDebugInfo;
165 llvm::FramePointerKind FramePointerKind =
166 llvm::FramePointerKind::None;
167 unsigned VScaleMin = 0;
168 unsigned VScaleMax = 0;
169 bool NoInfsFPMath = false;
170 bool NoNaNsFPMath = false;
171 bool ApproxFuncFPMath = false;
173 false;
174 bool UnsafeFPMath = false;
175 std::string Reciprocals = "";
177 std::string PreferVectorWidth = "";
179 bool NSWOnLoopVarInc = true;
180 bool EnableOpenACC = false;
181 bool EnableOpenMP = false;
182 bool UseSampleProfile = false;
186 bool DisableTailCalls = false;
187 bool EnableOpenMPSimd = false;
190 "";
193 "";
196 Fortran::frontend::CodeGenOptions::ComplexRangeKind::
197 CX_Full;
198 int32_t DwarfVersion = 0;
199 std::string SplitDwarfFile = "";
200 std::string DwarfDebugFlags = "";
201 Fortran::common::FPMaxminBehavior fpMaxminBehavior =
202 Fortran::common::FPMaxminBehavior::Legacy;
203};
204
206[[maybe_unused]] static mlir::omp::OffloadModuleOpts makeOffloadModuleOpts(
208 return mlir::omp::OffloadModuleOpts(Opts.OpenMPTargetDebug,
209 Opts.OpenMPTeamSubscription, Opts.OpenMPThreadSubscription,
210 Opts.OpenMPNoThreadState, Opts.OpenMPNoNestedParallelism,
211 Opts.OpenMPIsTargetDevice, Opts.OpenMPIsGPU, Opts.OpenMPForceUSM,
212 Opts.OpenMPVersion, Opts.OMPHostIRFile, Opts.OMPTargetTriples,
213 Opts.NoGPULib);
214}
215
216#endif // FORTRAN_TOOLS_CROSS_TOOL_HELPERS_H
Definition CrossToolHelpers.h:29
Definition LangOptions.h:71
std::vector< llvm::Triple > OMPTargetTriples
List of triples passed in using -fopenmp-targets.
Definition LangOptions.h:89
std::string OMPHostIRFile
signed integer overflow handling
Definition LangOptions.h:86
Definition MathOptionsBase.h:22
Definition CodeGenOptions.h:50
std::string PreferVectorWidth
The prefered vector width, if requested by -mprefer-vector-width.
Definition CodeGenOptions.h:57
std::string SplitDwarfFile
Definition CodeGenOptions.h:178
std::string Reciprocals
List of reciprocal estimate sub-options.
Definition CodeGenOptions.h:60
std::string SampleProfileFile
Name of the profile file to use with -fprofile-sample-use.
Definition CodeGenOptions.h:184
ComplexRangeKind
Controls the various implementations for complex division.
Definition CodeGenOptions.h:211
std::string DwarfDebugFlags
Definition CodeGenOptions.h:79
Definition OpenACC.h:20
FPMaxminBehavior
Definition FPMaxminBehavior.h:29
llvm::codegenoptions::DebugInfoKind DebugInfo
Debug info generation.
Definition CrossToolHelpers.h:163
bool LoopTripCountVersioning
Run the trip-count versioning pass.
Definition CrossToolHelpers.h:161
bool EnableSafeTrampoline
Use runtime trampoline pool (W^X).
Definition CrossToolHelpers.h:158
bool NoSignedZerosFPMath
Set no-signed-zeros-fp-math attribute for functions.
Definition CrossToolHelpers.h:172
std::string DwarfDebugFlags
Debug flags to append to DWARF producer.
Definition CrossToolHelpers.h:200
bool LoopVersioning
Run the version loop pass.
Definition CrossToolHelpers.h:160
unsigned VScaleMin
SVE vector range minimum.
Definition CrossToolHelpers.h:167
std::string Reciprocals
Definition CrossToolHelpers.h:175
bool optimizeArrayExpression
Enable HLFIR optimizations; expensive ones still require O3.
Definition CrossToolHelpers.h:156
llvm::FramePointerKind FramePointerKind
Add frame pointer to functions.
Definition CrossToolHelpers.h:165
bool UniqueInternalLinkageNames
Definition CrossToolHelpers.h:183
bool NoNaNsFPMath
Set no-nans-fp-math attribute for functions.
Definition CrossToolHelpers.h:170
std::string SplitDwarfFile
File name for the split debug info.
Definition CrossToolHelpers.h:199
bool Underscoring
add underscores to function names.
Definition CrossToolHelpers.h:159
std::string PreferVectorWidth
Definition CrossToolHelpers.h:177
bool ApproxFuncFPMath
Set afn flag for instructions.
Definition CrossToolHelpers.h:171
unsigned VScaleMax
SVE vector range maximum.
Definition CrossToolHelpers.h:168
bool NoInfsFPMath
Set ninf flag for instructions.
Definition CrossToolHelpers.h:169
llvm::OptimizationLevel OptLevel
Definition CrossToolHelpers.h:154
bool EnableOpenMPSimd
Enable OpenMP simd-only mode.
Definition CrossToolHelpers.h:187
bool DebugInfoForProfiling
Enable extra debugging info.
Definition CrossToolHelpers.h:185
bool NSWOnLoopVarInc
Add nsw flag to loop variable increments.
Definition CrossToolHelpers.h:179
bool AliasAnalysis
Add TBAA tags to generated LLVMIR.
Definition CrossToolHelpers.h:162
Fortran::frontend::CodeGenOptions::ComplexRangeKind ComplexRange
Method for calculating complex number division.
Definition CrossToolHelpers.h:195
bool SkipConvertComplexPow
Do not run complex pow conversion.
Definition CrossToolHelpers.h:188
bool UnsafeFPMath
Set all fast-math flags for instructions.
Definition CrossToolHelpers.h:174
std::string InstrumentFunctionEntry
Definition CrossToolHelpers.h:189
bool DisableTailCalls
Disable tail call optimization.
Definition CrossToolHelpers.h:186
bool StackArrays
convert memory allocations to alloca.
Definition CrossToolHelpers.h:157
bool EnableOpenACC
Enable OpenACC lowering.
Definition CrossToolHelpers.h:180
bool UseSampleProfile
Enable sample based profiling.
Definition CrossToolHelpers.h:182
int32_t DwarfVersion
Version of DWARF debug info to generate.
Definition CrossToolHelpers.h:198
bool EnableOpenMP
Enable OpenMP lowering.
Definition CrossToolHelpers.h:181
std::string InstrumentFunctionExit
Definition CrossToolHelpers.h:192