llvm/llvm/lib/Target/AMDGPU/R600OpenCLImageTypeLoweringPass.cpp

//===- R600OpenCLImageTypeLoweringPass.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
//
//===----------------------------------------------------------------------===//
//
/// \file
/// This pass resolves calls to OpenCL image attribute, image resource ID and
/// sampler resource ID getter functions.
///
/// Image attributes (size and format) are expected to be passed to the kernel
/// as kernel arguments immediately following the image argument itself,
/// therefore this pass adds image size and format arguments to the kernel
/// functions in the module. The kernel functions with image arguments are
/// re-created using the new signature. The new arguments are added to the
/// kernel metadata with kernel_arg_type set to "image_size" or "image_format".
/// Note: this pass may invalidate pointers to functions.
///
/// Resource IDs of read-only images, write-only images and samplers are
/// defined to be their index among the kernel arguments of the same
/// type and access qualifier.
//
//===----------------------------------------------------------------------===//

#include "R600.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/Pass.h"
#include "llvm/Transforms/Utils/Cloning.h"

usingnamespacellvm;

static StringRef GetImageSizeFunc =;
static StringRef GetImageFormatFunc =;
static StringRef GetImageResourceIDFunc =;
static StringRef GetSamplerResourceIDFunc =;

static StringRef ImageSizeArgMDType =;
static StringRef ImageFormatArgMDType =;

static StringRef KernelsMDNodeName =;
static StringRef KernelArgMDNodeNames[] =;
static const unsigned NumKernelArgMDNodes =;

namespace {

MDVector;
struct KernelArgMD {};

} // end anonymous namespace

static inline bool
IsImageType(StringRef TypeString) {}

static inline bool
IsSamplerType(StringRef TypeString) {}

static Function *
GetFunctionFromMDNode(MDNode *Node) {}

static StringRef
AccessQualFromMD(MDNode *KernelMDNode, unsigned ArgIdx) {}

static StringRef
ArgTypeFromMD(MDNode *KernelMDNode, unsigned ArgIdx) {}

static MDVector
GetArgMD(MDNode *KernelMDNode, unsigned OpIdx) {}

static void
PushArgMD(KernelArgMD &MD, const MDVector &V) {}

namespace {

class R600OpenCLImageTypeLoweringPass : public ModulePass {};

} // end anonymous namespace

char R600OpenCLImageTypeLoweringPass::ID =;

ModulePass *llvm::createR600OpenCLImageTypeLoweringPass() {}