|
FLANG
|
Helper to facilitate lowering of CHARACTER in FIR. More...
#include <flang/Optimizer/Builder/Character.h>
Public Member Functions | |
| CharacterExprHelper (FirOpBuilder &builder, mlir::Location loc) | |
| Constructor. | |
| CharacterExprHelper (const CharacterExprHelper &)=delete | |
| void | createCopy (const fir::CharBoxValue &dest, const fir::CharBoxValue &src, mlir::Value count) |
| void | createPadding (const fir::CharBoxValue &str, mlir::Value lower, mlir::Value upper) |
| fir::CharBoxValue | createSubstring (const fir::CharBoxValue &str, llvm::ArrayRef< mlir::Value > bounds) |
| mlir::Value | genSubstringBase (mlir::Value stringRawAddr, mlir::Value lowerBound, mlir::Type substringAddrType, mlir::Value one={}) |
| mlir::Value | createBlankConstant (fir::CharacterType type) |
Return blank character of given type !fir.char<kind> | |
| void | createAssign (const fir::ExtendedValue &lhs, const fir::ExtendedValue &rhs) |
| fir::CharBoxValue | createConcatenate (const fir::CharBoxValue &lhs, const fir::CharBoxValue &rhs) |
| Create lhs // rhs in temp obtained with fir.alloca. | |
| fir::CharBoxValue | createCharExtremum (bool predIsMin, llvm::ArrayRef< fir::CharBoxValue > opCBVs) |
| Create {max,min}(lhs,rhs) in temp obtained with fir.alloca. | |
| mlir::Value | createLenTrim (const fir::CharBoxValue &str) |
| LEN_TRIM intrinsic. | |
| mlir::Value | createEmboxChar (mlir::Value addr, mlir::Value len) |
| mlir::Value | createEmbox (const fir::CharBoxValue &str) |
| mlir::Value | createEmbox (const fir::CharArrayBoxValue &str) |
| fir::CharBoxValue | toScalarCharacter (const fir::CharArrayBoxValue &) |
| std::pair< mlir::Value, mlir::Value > | createUnboxChar (mlir::Value boxChar) |
Unbox boxchar into (fir.ref<fir.char<kind>>, character length type). | |
| fir::CharBoxValue | createCharacterTemp (mlir::Type type, mlir::Value len) |
| fir::CharBoxValue | createCharacterTemp (mlir::Type type, int len) |
| fir::CharBoxValue | createTempFrom (const fir::ExtendedValue &source) |
| Create a temporary with the same kind, length, and value as source. | |
| fir::ExtendedValue | toExtendedValue (mlir::Value character, mlir::Value len={}) |
| fir::ExtendedValue | cleanUpCharacterExtendedValue (const fir::ExtendedValue &) |
| mlir::Value | createSingletonFromCode (mlir::Value code, int kind) |
Create fir.char<kind> singleton from code integer value. | |
| mlir::Value | extractCodeFromSingleton (mlir::Value singleton) |
| Returns integer value held in a character singleton. | |
| mlir::Value | getLength (mlir::Value memref) |
| mlir::Value | readLengthFromBox (mlir::Value box) |
| mlir::Value | readLengthFromBox (mlir::Value box, fir::CharacterType charTy) |
| Same as readLengthFromBox but the CharacterType is provided. | |
Static Public Member Functions | |
| static bool | isCharacterLiteral (mlir::Type type) |
| static bool | isCharacterScalar (mlir::Type type) |
| static bool | hasConstantLengthInType (const fir::ExtendedValue &) |
| static fir::KindTy | getCharacterKind (mlir::Type type) |
| Extract the kind of a character type. | |
| static fir::KindTy | getCharacterOrSequenceKind (mlir::Type type) |
| Extract the kind of a character or array of character type. | |
| static fir::CharacterType | getCharType (mlir::Type type) |
| static fir::CharacterType | getCharacterType (mlir::Type type) |
| Get fir.char<kind> type with the same kind as inside str. | |
| static fir::CharacterType | getCharacterType (const fir::CharBoxValue &box) |
| static fir::CharacterType | getCharacterType (mlir::Value str) |
| static bool | isArray (mlir::Type type) |
Helper to facilitate lowering of CHARACTER in FIR.
| fir::ExtendedValue fir::factory::CharacterExprHelper::cleanUpCharacterExtendedValue | ( | const fir::ExtendedValue & | ) |
Temporary helper to help migrating towards properties of ExtendedValue containing characters. Mainly, this ensure that characters are always CharArrayBoxValue, CharBoxValue, or BoxValue and that the base address is not a boxchar. Return the argument if this is not a character. TODO: Create and propagate ExtendedValue according to properties listed above instead of fixing it when needed.
| void fir::factory::CharacterExprHelper::createAssign | ( | const fir::ExtendedValue & | lhs, |
| const fir::ExtendedValue & | rhs ) |
Lower lhs = rhs where lhs and rhs are scalar characters. It handles cases where lhs and rhs may overlap.
| fir::CharBoxValue fir::factory::CharacterExprHelper::createCharacterTemp | ( | mlir::Type | type, |
| int | len ) |
Allocate a temp of compile time constant length. Returns related fir.ref<fir.array<len x fir.char<kind>>>.
| fir::CharBoxValue fir::factory::CharacterExprHelper::createCharacterTemp | ( | mlir::Type | type, |
| mlir::Value | len ) |
Allocate a temp of fir::CharacterType type and length len. Returns related fir.ref<fir.array<? x fir.char<kind>>>.
| void fir::factory::CharacterExprHelper::createCopy | ( | const fir::CharBoxValue & | dest, |
| const fir::CharBoxValue & | src, | ||
| mlir::Value | count ) |
Copy the count first characters of src into dest. count can have any integer type.
Create a loop to copy count characters from src to dest. Note that the KIND indicates the number of bits in a code point. (ASCII, UCS-2, or UCS-4.)
| mlir::Value fir::factory::CharacterExprHelper::createEmbox | ( | const fir::CharArrayBoxValue & | str | ) |
Embox a string array. Note that the size/shape of the array is not retrievable from the resulting mlir::Value.
| mlir::Value fir::factory::CharacterExprHelper::createEmbox | ( | const fir::CharBoxValue & | str | ) |
Create a fir.boxchar for str. If str is not in memory, a temp is allocated to create the fir.boxchar.
| mlir::Value fir::factory::CharacterExprHelper::createEmboxChar | ( | mlir::Value | addr, |
| mlir::Value | len ) |
Embox addr and len and return fir.boxchar. Take care of type conversions before emboxing. len is converted to the integer type for character lengths if needed.
| void fir::factory::CharacterExprHelper::createPadding | ( | const fir::CharBoxValue & | str, |
| mlir::Value | lower, | ||
| mlir::Value | upper ) |
Set characters of str at position [lower, upper) to blanks. lower and \upper bounds are zero based. If upper <= lower, no padding is done. upper and lower can have any integer type.
| fir::CharBoxValue fir::factory::CharacterExprHelper::createSubstring | ( | const fir::CharBoxValue & | str, |
| llvm::ArrayRef< mlir::Value > | bounds ) |
Create str(lb:ub), lower bounds must always be specified, upper bound is optional.
| mlir::Value fir::factory::CharacterExprHelper::genSubstringBase | ( | mlir::Value | stringRawAddr, |
| mlir::Value | lowerBound, | ||
| mlir::Type | substringAddrType, | ||
| mlir::Value | one = {} ) |
Compute substring base address given the raw address (not fir.boxchar) of a scalar string, a substring / lower bound, and the substring type.
|
static |
Determine the inner character type. Unwraps references, boxes, and sequences to find the !fir.char element type.
| mlir::Value fir::factory::CharacterExprHelper::getLength | ( | mlir::Value | memref | ) |
Create a value for the length of a character based on its memory reference that may be a boxchar, box or !fir.[ptr|ref|heap]<fir.char<kind, len>>. If the memref is a simple address and the length is not constant in type, the returned length will be empty.
|
static |
Does this extended value base type is fir.char<kind,len> where len is not the unknown extent ?
|
static |
Is type a sequence (array) of CHARACTER type? Return true for any of the following cases:
In certain contexts, Fortran allows an array of CHARACTERs to be treated as if it were one longer CHARACTER scalar, each element append to the previous.
|
static |
Return true if type is a character literal type (is fir.array<len x fir.char<kind>>).;
|
static |
Return true if type is one of the following type
| mlir::Value fir::factory::CharacterExprHelper::readLengthFromBox | ( | mlir::Value | box | ) |
Compute length given a fir.box describing a character entity. It adjusts the length from the number of bytes per the descriptor to the number of characters per the Fortran KIND.
| fir::ExtendedValue fir::factory::CharacterExprHelper::toExtendedValue | ( | mlir::Value | character, |
| mlir::Value | len = {} ) |
Create an extended value from a value of type:
Does the heavy lifting of converting the value character (along with an optional len value) to an extended value. If len is null, a length value is extracted from character (or its type). This will produce an error if it's not possible. The returned value is a CharBoxValue if character is a scalar, otherwise it is a CharArrayBoxValue.
| fir::CharBoxValue fir::factory::CharacterExprHelper::toScalarCharacter | ( | const fir::CharArrayBoxValue & | box | ) |
Convert character array to a scalar by reducing the extents into the length. Will fail if call on non reference like base.