
Intrinsic module procedures ieee_get_modes, ieee_set_modes, ieee_get_status, and ieee_set_status store and retrieve opaque data values whose size varies by machine and OS environment. These data values are usually, but not always small. Their sizes are not directly known in a cross compilation environment. Address this issue by implementing two mechanisms for processing these data values. Environments that use typical small data sizes can access storage defined at compile time. When this is not valid, data storage of any size can be allocated at runtime.
59 lines
2.5 KiB
C++
59 lines
2.5 KiB
C++
//===-- Exceptions.cpp ----------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "flang/Optimizer/Builder/Runtime/Exceptions.h"
|
|
#include "flang/Optimizer/Builder/FIRBuilder.h"
|
|
#include "flang/Optimizer/Builder/Runtime/RTBuilder.h"
|
|
#include "flang/Runtime/exceptions.h"
|
|
|
|
using namespace Fortran::runtime;
|
|
|
|
mlir::Value fir::runtime::genMapExcept(fir::FirOpBuilder &builder,
|
|
mlir::Location loc,
|
|
mlir::Value excepts) {
|
|
mlir::func::FuncOp func{
|
|
fir::runtime::getRuntimeFunc<mkRTKey(MapException)>(loc, builder)};
|
|
return builder.create<fir::CallOp>(loc, func, excepts).getResult(0);
|
|
}
|
|
|
|
mlir::Value fir::runtime::genSupportHalting(fir::FirOpBuilder &builder,
|
|
mlir::Location loc,
|
|
mlir::Value excepts) {
|
|
mlir::func::FuncOp func{
|
|
fir::runtime::getRuntimeFunc<mkRTKey(SupportHalting)>(loc, builder)};
|
|
return builder.create<fir::CallOp>(loc, func, excepts).getResult(0);
|
|
}
|
|
|
|
mlir::Value fir::runtime::genGetUnderflowMode(fir::FirOpBuilder &builder,
|
|
mlir::Location loc) {
|
|
mlir::func::FuncOp func{
|
|
fir::runtime::getRuntimeFunc<mkRTKey(GetUnderflowMode)>(loc, builder)};
|
|
return builder.create<fir::CallOp>(loc, func).getResult(0);
|
|
}
|
|
|
|
void fir::runtime::genSetUnderflowMode(fir::FirOpBuilder &builder,
|
|
mlir::Location loc, mlir::Value flag) {
|
|
mlir::func::FuncOp func{
|
|
fir::runtime::getRuntimeFunc<mkRTKey(SetUnderflowMode)>(loc, builder)};
|
|
builder.create<fir::CallOp>(loc, func, flag);
|
|
}
|
|
|
|
mlir::Value fir::runtime::genGetModesTypeSize(fir::FirOpBuilder &builder,
|
|
mlir::Location loc) {
|
|
mlir::func::FuncOp func{
|
|
fir::runtime::getRuntimeFunc<mkRTKey(GetModesTypeSize)>(loc, builder)};
|
|
return builder.create<fir::CallOp>(loc, func).getResult(0);
|
|
}
|
|
|
|
mlir::Value fir::runtime::genGetStatusTypeSize(fir::FirOpBuilder &builder,
|
|
mlir::Location loc) {
|
|
mlir::func::FuncOp func{
|
|
fir::runtime::getRuntimeFunc<mkRTKey(GetStatusTypeSize)>(loc, builder)};
|
|
return builder.create<fir::CallOp>(loc, func).getResult(0);
|
|
}
|