//===- VFABIDemangler.h - Vector Function ABI demangler ------- -*- C++ -*-===// // // 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 // //===----------------------------------------------------------------------===// // // This file defines the VFABI demangling utility. // //===----------------------------------------------------------------------===// #ifndef LLVM_IR_VFABIDEMANGLER_H #define LLVM_IR_VFABIDEMANGLER_H #include "llvm/ADT/SmallVector.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/Instructions.h" #include "llvm/Support/Alignment.h" #include "llvm/Support/TypeSize.h" namespace llvm { /// Describes the type of Parameters enum class VFParamKind { … }; /// Describes the type of Instruction Set Architecture enum class VFISAKind { … }; /// Encapsulates information needed to describe a parameter. /// /// The description of the parameter is not linked directly to /// OpenMP or any other vector function description. This structure /// is extendible to handle other paradigms that describe vector /// functions and their parameters. struct VFParameter { … }; /// Contains the information about the kind of vectorization /// available. /// /// This object in independent on the paradigm used to /// represent vector functions. in particular, it is not attached to /// any target-specific ABI. struct VFShape { … }; /// Holds the VFShape for a specific scalar to vector function mapping. struct VFInfo { … }; namespace VFABI { /// LLVM Internal VFABI ISA token for vector functions. static constexpr char const *_LLVM_ = …; /// Prefix for internal name redirection for vector function that /// tells the compiler to scalarize the call using the scalar name /// of the function. For example, a mangled name like /// `_ZGV_LLVM_N2v_foo(_LLVM_Scalarize_foo)` would tell the /// vectorizer to vectorize the scalar call `foo`, and to scalarize /// it once vectorization is done. static constexpr char const *_LLVM_Scalarize_ = …; /// Function to construct a VFInfo out of a mangled names in the /// following format: /// /// <VFABI_name>{(<redirection>)} /// /// where <VFABI_name> is the name of the vector function, mangled according /// to the rules described in the Vector Function ABI of the target vector /// extension (or <isa> from now on). The <VFABI_name> is in the following /// format: /// /// _ZGV<isa><mask><vlen><parameters>_<scalarname>[(<redirection>)] /// /// This methods support demangling rules for the following <isa>: /// /// * AArch64: https://developer.arm.com/docs/101129/latest /// /// * x86 (libmvec): https://sourceware.org/glibc/wiki/libmvec and /// https://sourceware.org/glibc/wiki/libmvec?action=AttachFile&do=view&target=VectorABI.txt /// /// \param MangledName -> input string in the format /// _ZGV<isa><mask><vlen><parameters>_<scalarname>[(<redirection>)]. /// \param FTy -> FunctionType of the scalar function which we're trying to find /// a vectorized variant for. This is required to determine the vectorization /// factor for scalable vectors, since the mangled name doesn't encode that; /// it needs to be derived from the widest element types of vector arguments /// or return values. std::optional<VFInfo> tryDemangleForVFABI(StringRef MangledName, const FunctionType *FTy); /// Retrieve the `VFParamKind` from a string token. VFParamKind getVFParamKindFromString(const StringRef Token); // Name of the attribute where the variant mappings are stored. static constexpr char const *MappingsAttrName = …; /// Populates a set of strings representing the Vector Function ABI variants /// associated to the CallInst CI. If the CI does not contain the /// vector-function-abi-variant attribute, we return without populating /// VariantMappings, i.e. callers of getVectorVariantNames need not check for /// the presence of the attribute (see InjectTLIMappings). void getVectorVariantNames(const CallInst &CI, SmallVectorImpl<std::string> &VariantMappings); /// Constructs a FunctionType by applying vector function information to the /// type of a matching scalar function. /// \param Info gets the vectorization factor (VF) and the VFParamKind of the /// parameters. /// \param ScalarFTy gets the Type information of parameters, as it is not /// stored in \p Info. /// \returns a pointer to a newly created vector FunctionType FunctionType *createFunctionType(const VFInfo &Info, const FunctionType *ScalarFTy); /// Overwrite the Vector Function ABI variants attribute with the names provide /// in \p VariantMappings. void setVectorVariantNames(CallInst *CI, ArrayRef<std::string> VariantMappings); } // end namespace VFABI } // namespace llvm #endif // LLVM_IR_VFABIDEMANGLER_H