Save address space in pointer types

This commit is contained in:
baldurk
2020-06-18 17:22:41 +01:00
parent b54248ad49
commit 77d60b72da
3 changed files with 31 additions and 10 deletions
@@ -741,9 +741,7 @@ Program::Program(const byte *bytes, size_t length)
{
m_Types[typeIndex].type = Type::Pointer;
m_Types[typeIndex].inner = &m_Types[(size_t)typ.ops[0]];
if(typ.ops.size() > 1 && typ.ops[1] != 0)
RDCERR("Ignoring address space on pointer type");
m_Types[typeIndex].addrSpace = Type::PointerAddrSpace(typ.ops[1]);
typeIndex++;
}
+17 -2
View File
@@ -62,12 +62,27 @@ struct Type
Int,
} scalarType = Void;
enum PointerAddrSpace
{
Default = 0,
DeviceMemory = 1,
CBuffer = 2,
GroupShared = 3,
GenericPointer = 4,
ImmediateCBuffer = 5,
};
bool isVoid() const { return type == Scalar && scalarType == Void; }
rdcstr toString() const;
rdcstr declFunction(rdcstr funcName) const;
// for scalars, arrays, vectors
uint32_t bitWidth = 0, elemCount = 0;
// for scalars, arrays, vectors, pointers
union
{
uint32_t bitWidth = 0;
PointerAddrSpace addrSpace;
};
uint32_t elemCount = 0;
// the single inner type for pointers, vectors, or arrays, the return type for functions
const Type *inner = NULL;
@@ -340,12 +340,16 @@ void Program::MakeDisassemblyString()
m_Disassembly += "external ";
else
m_Disassembly += "internal ";
if(g.type->addrSpace)
m_Disassembly += StringFormat::Fmt("addrspace(%d) ", g.type->addrSpace);
if(g.flags & GlobalFlags::LocalUnnamedAddr)
m_Disassembly += "local_unnamed_addr ";
else if(g.flags & GlobalFlags::GlobalUnnamedAddr)
m_Disassembly += "unnamed_addr ";
if(g.flags & GlobalFlags::IsConst)
m_Disassembly += "constant ";
else
m_Disassembly += "global ";
if(g.initialiser.type == SymbolType::Constant)
m_Disassembly += m_Values[g.initialiser.idx].toString(true);
@@ -1041,16 +1045,20 @@ rdcstr Type::toString() const
}
}
case Vector: return StringFormat::Fmt("<%u x %s>", elemCount, inner->toString().c_str());
case Pointer: return StringFormat::Fmt("%s*", inner->toString().c_str());
case Pointer:
if(addrSpace == 0)
return StringFormat::Fmt("%s*", inner->toString().c_str());
else
return StringFormat::Fmt("%s addrspace(%d)*", inner->toString().c_str(), addrSpace);
case Array: return StringFormat::Fmt("[%u x %s]", elemCount, inner->toString().c_str());
case Function: return declFunction(rdcstr());
case Struct:
{
rdcstr ret;
if(packedStruct)
ret = "<{";
ret = "<{ ";
else
ret = "{";
ret = "{ ";
for(size_t i = 0; i < members.size(); i++)
{
if(i > 0)
@@ -1058,9 +1066,9 @@ rdcstr Type::toString() const
ret += members[i]->toString();
}
if(packedStruct)
ret += "}>";
ret += " }>";
else
ret += "}";
ret += " }";
return ret;
}