[llvm] r176407 - add getUnderlyingObjectSize()
Shuxin Yang
shuxin.llvm at gmail.com
Sat Mar 2 18:18:51 PST 2013
One of my old friend just told me that this revision has similar problem
that i mentioned
in my previous mail (for r176408). That is, the pointer "p" could
pointing to two distinct objects,
however, the getUnderlyingObject(p) could still return some valid value.
e.g.
T t1, t2;
p1 = &t1.field1;
...
p2 = &t2.field2;
p3 = phi(p1, p2);
getUnderlyingObject(p3) gives sizeof(T), and the "underlying object"
take no meaning here.
On 03/02/2013 03:23 AM, Nuno Lopes wrote:
> Author: nlopes
> Date: Sat Mar 2 05:23:34 2013
> New Revision: 176407
>
> URL: http://llvm.org/viewvc/llvm-project?rev=176407&view=rev
> Log:
> add getUnderlyingObjectSize()
> this is similar to getObjectSize(), but doesnt subtract the offset
> tweak the BasicAA code accordingly (per PR14988)
>
> Modified:
> llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h
> llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
> llvm/trunk/lib/Analysis/MemoryBuiltins.cpp
>
> Modified: llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h?rev=176407&r1=176406&r2=176407&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h (original)
> +++ llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h Sat Mar 2 05:23:34 2013
> @@ -144,6 +144,14 @@ static inline CallInst *isFreeCall(Value
> bool getObjectSize(const Value *Ptr, uint64_t &Size, const DataLayout *TD,
> const TargetLibraryInfo *TLI, bool RoundToAlign = false);
>
> +/// \brief Compute the size of the underlying object pointed by Ptr. Returns
> +/// true and the object size in Size if successful, and false otherwise.
> +/// If RoundToAlign is true, then Size is rounded up to the aligment of allocas,
> +/// byval arguments, and global variables.
> +bool getUnderlyingObjectSize(const Value *Ptr, uint64_t &Size,
> + const DataLayout *TD, const TargetLibraryInfo *TLI,
> + bool RoundToAlign = false);
> +
>
>
> typedef std::pair<APInt, APInt> SizeOffsetType;
>
> Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=176407&r1=176406&r2=176407&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)
> +++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Sat Mar 2 05:23:34 2013
> @@ -88,7 +88,7 @@ static uint64_t getObjectSize(const Valu
> const TargetLibraryInfo &TLI,
> bool RoundToAlign = false) {
> uint64_t Size;
> - if (getObjectSize(V, Size, &TD, &TLI, RoundToAlign))
> + if (getUnderlyingObjectSize(V, Size, &TD, &TLI, RoundToAlign))
> return Size;
> return AliasAnalysis::UnknownSize;
> }
> @@ -98,35 +98,6 @@ static uint64_t getObjectSize(const Valu
> static bool isObjectSmallerThan(const Value *V, uint64_t Size,
> const DataLayout &TD,
> const TargetLibraryInfo &TLI) {
> - // Note that the meanings of the "object" are slightly different in the
> - // following contexts:
> - // c1: llvm::getObjectSize()
> - // c2: llvm.objectsize() intrinsic
> - // c3: isObjectSmallerThan()
> - // c1 and c2 share the same meaning; however, the meaning of "object" in c3
> - // refers to the "entire object".
> - //
> - // Consider this example:
> - // char *p = (char*)malloc(100)
> - // char *q = p+80;
> - //
> - // In the context of c1 and c2, the "object" pointed by q refers to the
> - // stretch of memory of q[0:19]. So, getObjectSize(q) should return 20.
> - //
> - // However, in the context of c3, the "object" refers to the chunk of memory
> - // being allocated. So, the "object" has 100 bytes, and q points to the middle
> - // the "object". In case q is passed to isObjectSmallerThan() as the 1st
> - // parameter, before the llvm::getObjectSize() is called to get the size of
> - // entire object, we should:
> - // - either rewind the pointer q to the base-address of the object in
> - // question (in this case rewind to p), or
> - // - just give up. It is up to caller to make sure the pointer is pointing
> - // to the base address the object.
> - //
> - // We go for 2nd option for simplicity.
> - if (!isIdentifiedObject(V))
> - return false;
> -
> // This function needs to use the aligned object size because we allow
> // reads a bit past the end given sufficient alignment.
> uint64_t ObjectSize = getObjectSize(V, TD, TLI, /*RoundToAlign*/true);
>
> Modified: llvm/trunk/lib/Analysis/MemoryBuiltins.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/MemoryBuiltins.cpp?rev=176407&r1=176406&r2=176407&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/MemoryBuiltins.cpp (original)
> +++ llvm/trunk/lib/Analysis/MemoryBuiltins.cpp Sat Mar 2 05:23:34 2013
> @@ -360,6 +360,26 @@ bool llvm::getObjectSize(const Value *Pt
> return true;
> }
>
> +/// \brief Compute the size of the underlying object pointed by Ptr. Returns
> +/// true and the object size in Size if successful, and false otherwise.
> +/// If RoundToAlign is true, then Size is rounded up to the aligment of allocas,
> +/// byval arguments, and global variables.
> +bool llvm::getUnderlyingObjectSize(const Value *Ptr, uint64_t &Size,
> + const DataLayout *TD,
> + const TargetLibraryInfo *TLI,
> + bool RoundToAlign) {
> + if (!TD)
> + return false;
> +
> + ObjectSizeOffsetVisitor Visitor(TD, TLI, Ptr->getContext(), RoundToAlign);
> + SizeOffsetType Data = Visitor.compute(const_cast<Value*>(Ptr));
> + if (!Visitor.knownSize(Data))
> + return false;
> +
> + Size = Data.first.getZExtValue();
> + return true;
> +}
> +
>
> STATISTIC(ObjectVisitorArgument,
> "Number of arguments with unsolved size and offset");
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list