mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-01 00:33:09 +00:00
[NVPTX] Add query support for read-write images and managed variables
This also fixes a bug in the annotation cache where the cache will not be cleared between modules if multiple modules are compiled in the same process. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205905 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
46d36be2eb
commit
ff7dcc527f
@ -43,14 +43,16 @@ enum PropertyAnnotation {
|
|||||||
PROPERTY_ISSAMPLER,
|
PROPERTY_ISSAMPLER,
|
||||||
PROPERTY_ISREADONLY_IMAGE_PARAM,
|
PROPERTY_ISREADONLY_IMAGE_PARAM,
|
||||||
PROPERTY_ISWRITEONLY_IMAGE_PARAM,
|
PROPERTY_ISWRITEONLY_IMAGE_PARAM,
|
||||||
|
PROPERTY_ISREADWRITE_IMAGE_PARAM,
|
||||||
PROPERTY_ISKERNEL_FUNCTION,
|
PROPERTY_ISKERNEL_FUNCTION,
|
||||||
PROPERTY_ALIGN,
|
PROPERTY_ALIGN,
|
||||||
|
PROPERTY_MANAGED,
|
||||||
|
|
||||||
// last property
|
// last property
|
||||||
PROPERTY_LAST
|
PROPERTY_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
const unsigned AnnotationNameLen = 8; // length of each annotation name
|
const unsigned AnnotationNameLen = 9; // length of each annotation name
|
||||||
const char PropertyAnnotationNames[PROPERTY_LAST + 1][AnnotationNameLen + 1] = {
|
const char PropertyAnnotationNames[PROPERTY_LAST + 1][AnnotationNameLen + 1] = {
|
||||||
"maxntidx", // PROPERTY_MAXNTID_X
|
"maxntidx", // PROPERTY_MAXNTID_X
|
||||||
"maxntidy", // PROPERTY_MAXNTID_Y
|
"maxntidy", // PROPERTY_MAXNTID_Y
|
||||||
@ -64,8 +66,10 @@ const char PropertyAnnotationNames[PROPERTY_LAST + 1][AnnotationNameLen + 1] = {
|
|||||||
"sampler", // PROPERTY_ISSAMPLER
|
"sampler", // PROPERTY_ISSAMPLER
|
||||||
"rdoimage", // PROPERTY_ISREADONLY_IMAGE_PARAM
|
"rdoimage", // PROPERTY_ISREADONLY_IMAGE_PARAM
|
||||||
"wroimage", // PROPERTY_ISWRITEONLY_IMAGE_PARAM
|
"wroimage", // PROPERTY_ISWRITEONLY_IMAGE_PARAM
|
||||||
|
"rdwrimage", // PROPERTY_ISREADWRITE_IMAGE_PARAM
|
||||||
"kernel", // PROPERTY_ISKERNEL_FUNCTION
|
"kernel", // PROPERTY_ISKERNEL_FUNCTION
|
||||||
"align", // PROPERTY_ALIGN
|
"align", // PROPERTY_ALIGN
|
||||||
|
"managed", // PROPERTY_MANAGED
|
||||||
|
|
||||||
// last property
|
// last property
|
||||||
"proplast", // PROPERTY_LAST
|
"proplast", // PROPERTY_LAST
|
||||||
|
@ -1010,6 +1010,8 @@ bool NVPTXAsmPrinter::doFinalization(Module &M) {
|
|||||||
for (i = 0; i < n; i++)
|
for (i = 0; i < n; i++)
|
||||||
global_list.insert(global_list.end(), gv_array[i]);
|
global_list.insert(global_list.end(), gv_array[i]);
|
||||||
|
|
||||||
|
clearAnnotationCache(&M);
|
||||||
|
|
||||||
delete[] gv_array;
|
delete[] gv_array;
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -22,9 +22,9 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
//#include <iostream>
|
|
||||||
#include "llvm/Support/ManagedStatic.h"
|
#include "llvm/Support/ManagedStatic.h"
|
||||||
#include "llvm/IR/InstIterator.h"
|
#include "llvm/IR/InstIterator.h"
|
||||||
|
#include "llvm/Support/MutexGuard.h"
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
@ -33,8 +33,15 @@ typedef std::map<const GlobalValue *, key_val_pair_t> global_val_annot_t;
|
|||||||
typedef std::map<const Module *, global_val_annot_t> per_module_annot_t;
|
typedef std::map<const Module *, global_val_annot_t> per_module_annot_t;
|
||||||
|
|
||||||
ManagedStatic<per_module_annot_t> annotationCache;
|
ManagedStatic<per_module_annot_t> annotationCache;
|
||||||
|
static sys::Mutex Lock;
|
||||||
|
|
||||||
|
void llvm::clearAnnotationCache(const llvm::Module *Mod) {
|
||||||
|
MutexGuard Guard(Lock);
|
||||||
|
annotationCache->erase(Mod);
|
||||||
|
}
|
||||||
|
|
||||||
static void cacheAnnotationFromMD(const MDNode *md, key_val_pair_t &retval) {
|
static void cacheAnnotationFromMD(const MDNode *md, key_val_pair_t &retval) {
|
||||||
|
MutexGuard Guard(Lock);
|
||||||
assert(md && "Invalid mdnode for annotation");
|
assert(md && "Invalid mdnode for annotation");
|
||||||
assert((md->getNumOperands() % 2) == 1 && "Invalid number of operands");
|
assert((md->getNumOperands() % 2) == 1 && "Invalid number of operands");
|
||||||
// start index = 1, to skip the global variable key
|
// start index = 1, to skip the global variable key
|
||||||
@ -60,6 +67,7 @@ static void cacheAnnotationFromMD(const MDNode *md, key_val_pair_t &retval) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void cacheAnnotationFromMD(const Module *m, const GlobalValue *gv) {
|
static void cacheAnnotationFromMD(const Module *m, const GlobalValue *gv) {
|
||||||
|
MutexGuard Guard(Lock);
|
||||||
NamedMDNode *NMD = m->getNamedMetadata(llvm::NamedMDForAnnotations);
|
NamedMDNode *NMD = m->getNamedMetadata(llvm::NamedMDForAnnotations);
|
||||||
if (!NMD)
|
if (!NMD)
|
||||||
return;
|
return;
|
||||||
@ -92,6 +100,7 @@ static void cacheAnnotationFromMD(const Module *m, const GlobalValue *gv) {
|
|||||||
|
|
||||||
bool llvm::findOneNVVMAnnotation(const GlobalValue *gv, std::string prop,
|
bool llvm::findOneNVVMAnnotation(const GlobalValue *gv, std::string prop,
|
||||||
unsigned &retval) {
|
unsigned &retval) {
|
||||||
|
MutexGuard Guard(Lock);
|
||||||
const Module *m = gv->getParent();
|
const Module *m = gv->getParent();
|
||||||
if ((*annotationCache).find(m) == (*annotationCache).end())
|
if ((*annotationCache).find(m) == (*annotationCache).end())
|
||||||
cacheAnnotationFromMD(m, gv);
|
cacheAnnotationFromMD(m, gv);
|
||||||
@ -105,6 +114,7 @@ bool llvm::findOneNVVMAnnotation(const GlobalValue *gv, std::string prop,
|
|||||||
|
|
||||||
bool llvm::findAllNVVMAnnotation(const GlobalValue *gv, std::string prop,
|
bool llvm::findAllNVVMAnnotation(const GlobalValue *gv, std::string prop,
|
||||||
std::vector<unsigned> &retval) {
|
std::vector<unsigned> &retval) {
|
||||||
|
MutexGuard Guard(Lock);
|
||||||
const Module *m = gv->getParent();
|
const Module *m = gv->getParent();
|
||||||
if ((*annotationCache).find(m) == (*annotationCache).end())
|
if ((*annotationCache).find(m) == (*annotationCache).end())
|
||||||
cacheAnnotationFromMD(m, gv);
|
cacheAnnotationFromMD(m, gv);
|
||||||
@ -195,8 +205,37 @@ bool llvm::isImageWriteOnly(const llvm::Value &val) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool llvm::isImageReadWrite(const llvm::Value &val) {
|
||||||
|
if (const Argument *arg = dyn_cast<Argument>(&val)) {
|
||||||
|
const Function *func = arg->getParent();
|
||||||
|
std::vector<unsigned> annot;
|
||||||
|
if (llvm::findAllNVVMAnnotation(func,
|
||||||
|
llvm::PropertyAnnotationNames[
|
||||||
|
llvm::PROPERTY_ISREADWRITE_IMAGE_PARAM],
|
||||||
|
annot)) {
|
||||||
|
if (std::find(annot.begin(), annot.end(), arg->getArgNo()) != annot.end())
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool llvm::isImage(const llvm::Value &val) {
|
bool llvm::isImage(const llvm::Value &val) {
|
||||||
return llvm::isImageReadOnly(val) || llvm::isImageWriteOnly(val);
|
return llvm::isImageReadOnly(val) || llvm::isImageWriteOnly(val) ||
|
||||||
|
llvm::isImageReadWrite(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool llvm::isManaged(const llvm::Value &val) {
|
||||||
|
if(const GlobalValue *gv = dyn_cast<GlobalValue>(&val)) {
|
||||||
|
unsigned annot;
|
||||||
|
if(llvm::findOneNVVMAnnotation(gv,
|
||||||
|
llvm::PropertyAnnotationNames[llvm::PROPERTY_MANAGED],
|
||||||
|
annot)) {
|
||||||
|
assert((annot == 1) && "Unexpected annotation on a managed symbol");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string llvm::getTextureName(const llvm::Value &val) {
|
std::string llvm::getTextureName(const llvm::Value &val) {
|
||||||
|
@ -28,6 +28,8 @@ namespace llvm {
|
|||||||
#define NVCL_IMAGE2D_READONLY_FUNCNAME "__is_image2D_readonly"
|
#define NVCL_IMAGE2D_READONLY_FUNCNAME "__is_image2D_readonly"
|
||||||
#define NVCL_IMAGE3D_READONLY_FUNCNAME "__is_image3D_readonly"
|
#define NVCL_IMAGE3D_READONLY_FUNCNAME "__is_image3D_readonly"
|
||||||
|
|
||||||
|
void clearAnnotationCache(const llvm::Module *);
|
||||||
|
|
||||||
bool findOneNVVMAnnotation(const llvm::GlobalValue *, std::string, unsigned &);
|
bool findOneNVVMAnnotation(const llvm::GlobalValue *, std::string, unsigned &);
|
||||||
bool findAllNVVMAnnotation(const llvm::GlobalValue *, std::string,
|
bool findAllNVVMAnnotation(const llvm::GlobalValue *, std::string,
|
||||||
std::vector<unsigned> &);
|
std::vector<unsigned> &);
|
||||||
@ -38,6 +40,8 @@ bool isSampler(const llvm::Value &);
|
|||||||
bool isImage(const llvm::Value &);
|
bool isImage(const llvm::Value &);
|
||||||
bool isImageReadOnly(const llvm::Value &);
|
bool isImageReadOnly(const llvm::Value &);
|
||||||
bool isImageWriteOnly(const llvm::Value &);
|
bool isImageWriteOnly(const llvm::Value &);
|
||||||
|
bool isImageReadWrite(const llvm::Value &);
|
||||||
|
bool isManaged(const llvm::Value &);
|
||||||
|
|
||||||
std::string getTextureName(const llvm::Value &);
|
std::string getTextureName(const llvm::Value &);
|
||||||
std::string getSurfaceName(const llvm::Value &);
|
std::string getSurfaceName(const llvm::Value &);
|
||||||
|
Loading…
Reference in New Issue
Block a user