diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2020-09-23 11:03:38 -0400 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2020-09-24 09:57:28 -0400 |
commit | d65a7003c435de22b8e30dca292160fea822d887 (patch) | |
tree | 15c19f658c4880ea6c867ebb88476bb2831d8fe4 /llvm/lib/IR/Function.cpp | |
parent | 8f72717ebe27209a11be80629c667332cd5e4e60 (diff) | |
download | llvm-d65a7003c435de22b8e30dca292160fea822d887.zip llvm-d65a7003c435de22b8e30dca292160fea822d887.tar.gz llvm-d65a7003c435de22b8e30dca292160fea822d887.tar.bz2 |
OpaquePtr: Add helpers for sret to mirror byval
Sret should really have a type parameter like byval does.
Diffstat (limited to 'llvm/lib/IR/Function.cpp')
-rw-r--r-- | llvm/lib/IR/Function.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp index ec1000c..16cf1bd 100644 --- a/llvm/lib/IR/Function.cpp +++ b/llvm/lib/IR/Function.cpp @@ -140,12 +140,13 @@ bool Argument::hasPointeeInMemoryValueAttr() const { return false; AttributeList Attrs = getParent()->getAttributes(); return Attrs.hasParamAttribute(getArgNo(), Attribute::ByVal) || + Attrs.hasParamAttribute(getArgNo(), Attribute::StructRet) || Attrs.hasParamAttribute(getArgNo(), Attribute::InAlloca) || Attrs.hasParamAttribute(getArgNo(), Attribute::Preallocated) || Attrs.hasParamAttribute(getArgNo(), Attribute::ByRef); } -/// For a byval, inalloca, or preallocated parameter, get the in-memory +/// For a byval, sret, inalloca, or preallocated parameter, get the in-memory /// parameter type. static Type *getMemoryParamAllocType(AttributeSet ParamAttrs, Type *ArgTy) { // FIXME: All the type carrying attributes are mutually exclusive, so there @@ -157,10 +158,11 @@ static Type *getMemoryParamAllocType(AttributeSet ParamAttrs, Type *ArgTy) { if (Type *PreAllocTy = ParamAttrs.getPreallocatedType()) return PreAllocTy; - // FIXME: inalloca always depends on pointee element type. It's also possible - // for byval to miss it. + // FIXME: sret and inalloca always depends on pointee element type. It's also + // possible for byval to miss it. if (ParamAttrs.hasAttribute(Attribute::InAlloca) || ParamAttrs.hasAttribute(Attribute::ByVal) || + ParamAttrs.hasAttribute(Attribute::StructRet) || ParamAttrs.hasAttribute(Attribute::Preallocated)) return cast<PointerType>(ArgTy)->getElementType(); @@ -196,6 +198,11 @@ Type *Argument::getParamByValType() const { return getParent()->getParamByValType(getArgNo()); } +Type *Argument::getParamStructRetType() const { + assert(getType()->isPointerTy() && "Only pointers have sret types"); + return getParent()->getParamStructRetType(getArgNo()); +} + Type *Argument::getParamByRefType() const { assert(getType()->isPointerTy() && "Only pointers have byval types"); return getParent()->getParamByRefType(getArgNo()); |