Multitaget function return types fixed
This commit is contained in:
@@ -756,8 +756,7 @@ Module::AddGlobalVariable(const std::string &name, const Type *type, Expr *initE
|
|||||||
This functions returns true and issues an error if are any illegal
|
This functions returns true and issues an error if are any illegal
|
||||||
types are found and returns false otherwise.
|
types are found and returns false otherwise.
|
||||||
*/
|
*/
|
||||||
static bool
|
bool lRecursiveCheckValidParamType(const Type *t, bool vectorOk) {
|
||||||
lRecursiveCheckValidParamType(const Type *t, bool vectorOk) {
|
|
||||||
const StructType *st = CastType<StructType>(t);
|
const StructType *st = CastType<StructType>(t);
|
||||||
if (st != NULL) {
|
if (st != NULL) {
|
||||||
for (int i = 0; i < st->GetElementCount(); ++i)
|
for (int i = 0; i < st->GetElementCount(); ++i)
|
||||||
|
|||||||
2
module.h
2
module.h
@@ -55,6 +55,8 @@ namespace llvm
|
|||||||
|
|
||||||
struct DispatchHeaderInfo;
|
struct DispatchHeaderInfo;
|
||||||
|
|
||||||
|
bool lRecursiveCheckValidParamType(const Type *t, bool vectorOk);
|
||||||
|
|
||||||
class Module {
|
class Module {
|
||||||
public:
|
public:
|
||||||
/** The name of the source file being compiled should be passed as the
|
/** The name of the source file being compiled should be passed as the
|
||||||
|
|||||||
28
type.cpp
28
type.cpp
@@ -1847,24 +1847,26 @@ static std::map<std::string, llvm::StructType *> lStructTypeMap;
|
|||||||
different memory layouts...
|
different memory layouts...
|
||||||
*/
|
*/
|
||||||
static std::string
|
static std::string
|
||||||
lMangleStructName(const std::string &name, Variability variability) {
|
lMangleStructName(const std::string &name, const Type *type,
|
||||||
|
Variability variability) {
|
||||||
char buf[32];
|
char buf[32];
|
||||||
std::string n;
|
std::string n;
|
||||||
|
|
||||||
// Encode vector width
|
// Encode vector width if required
|
||||||
sprintf(buf, "v%d", g->target->getVectorWidth());
|
if (!lRecursiveCheckValidParamType(type, false)) {
|
||||||
n += buf;
|
sprintf(buf, "v%d_", g->target->getVectorWidth());
|
||||||
|
n += buf;
|
||||||
|
}
|
||||||
// Variability
|
// Variability
|
||||||
switch (variability.type) {
|
switch (variability.type) {
|
||||||
case Variability::Uniform:
|
case Variability::Uniform:
|
||||||
n += "_uniform_";
|
n += "uniform_";
|
||||||
break;
|
break;
|
||||||
case Variability::Varying:
|
case Variability::Varying:
|
||||||
n += "_varying_";
|
n += "varying_";
|
||||||
break;
|
break;
|
||||||
case Variability::SOA:
|
case Variability::SOA:
|
||||||
sprintf(buf, "_soa%d_", variability.soaWidth);
|
sprintf(buf, "soa%d_", variability.soaWidth);
|
||||||
n += buf;
|
n += buf;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -1905,7 +1907,7 @@ StructType::StructType(const std::string &n, const llvm::SmallVector<const Type
|
|||||||
// If a non-opaque LLVM struct for this type has already been
|
// If a non-opaque LLVM struct for this type has already been
|
||||||
// created, we're done. For an opaque struct type, we'll override
|
// created, we're done. For an opaque struct type, we'll override
|
||||||
// the old definition now that we have a full definition.
|
// the old definition now that we have a full definition.
|
||||||
std::string mname = lMangleStructName(name, variability);
|
std::string mname = lMangleStructName(name, this, variability);
|
||||||
if (lStructTypeMap.find(mname) != lStructTypeMap.end() &&
|
if (lStructTypeMap.find(mname) != lStructTypeMap.end() &&
|
||||||
lStructTypeMap[mname]->isOpaque() == false)
|
lStructTypeMap[mname]->isOpaque() == false)
|
||||||
return;
|
return;
|
||||||
@@ -1952,7 +1954,7 @@ StructType::GetCStructName() const {
|
|||||||
// compatibility...
|
// compatibility...
|
||||||
|
|
||||||
if (variability == Variability::Varying) {
|
if (variability == Variability::Varying) {
|
||||||
return lMangleStructName(name, variability);
|
return lMangleStructName(name, this, variability);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return GetStructName();
|
return GetStructName();
|
||||||
@@ -2187,7 +2189,7 @@ StructType::GetCDeclaration(const std::string &n) const {
|
|||||||
llvm::Type *
|
llvm::Type *
|
||||||
StructType::LLVMType(llvm::LLVMContext *ctx) const {
|
StructType::LLVMType(llvm::LLVMContext *ctx) const {
|
||||||
Assert(variability != Variability::Unbound);
|
Assert(variability != Variability::Unbound);
|
||||||
std::string mname = lMangleStructName(name, variability);
|
std::string mname = lMangleStructName(name, this, variability);
|
||||||
if (lStructTypeMap.find(mname) == lStructTypeMap.end()) {
|
if (lStructTypeMap.find(mname) == lStructTypeMap.end()) {
|
||||||
Assert(m->errorCount > 0);
|
Assert(m->errorCount > 0);
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -2341,7 +2343,7 @@ UndefinedStructType::UndefinedStructType(const std::string &n,
|
|||||||
Assert(name != "");
|
Assert(name != "");
|
||||||
if (variability != Variability::Unbound) {
|
if (variability != Variability::Unbound) {
|
||||||
// Create a new opaque LLVM struct type for this struct name
|
// Create a new opaque LLVM struct type for this struct name
|
||||||
std::string mname = lMangleStructName(name, variability);
|
std::string mname = lMangleStructName(name, this, variability);
|
||||||
if (lStructTypeMap.find(mname) == lStructTypeMap.end())
|
if (lStructTypeMap.find(mname) == lStructTypeMap.end())
|
||||||
lStructTypeMap[mname] = llvm::StructType::create(*g->ctx, mname);
|
lStructTypeMap[mname] = llvm::StructType::create(*g->ctx, mname);
|
||||||
}
|
}
|
||||||
@@ -2476,7 +2478,7 @@ UndefinedStructType::GetCDeclaration(const std::string &n) const {
|
|||||||
llvm::Type *
|
llvm::Type *
|
||||||
UndefinedStructType::LLVMType(llvm::LLVMContext *ctx) const {
|
UndefinedStructType::LLVMType(llvm::LLVMContext *ctx) const {
|
||||||
Assert(variability != Variability::Unbound);
|
Assert(variability != Variability::Unbound);
|
||||||
std::string mname = lMangleStructName(name, variability);
|
std::string mname = lMangleStructName(name, this, variability);
|
||||||
if (lStructTypeMap.find(mname) == lStructTypeMap.end()) {
|
if (lStructTypeMap.find(mname) == lStructTypeMap.end()) {
|
||||||
Assert(m->errorCount > 0);
|
Assert(m->errorCount > 0);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user