[llvm-commits] [PATCH] Patch to fix bug14172

Duncan Sands baldrick at free.fr
Fri Nov 2 00:39:48 PDT 2012


Hi Micah, -ENOTESTCASE.

Ciao, Duncan.

On 30/10/12 23:44, Micah Villmow wrote:
> http://llvm.org/bugs/show_bug.cgi?id=14172
>
> Null Pointers to structures that have all the types the same are loosing their address space when going through the constant folder. This patch fixes this specific case. A more robust approach needs to be implemented that allows Constant/ConstantFolder to take into account the address space.
>
>
> http://llvm-reviews.chandlerc.com/D88
>
> Files:
>    lib/VMCore/ConstantFold.cpp
>    lib/VMCore/Constants.cpp
>    include/llvm/Constants.h
>
> Index: lib/VMCore/ConstantFold.cpp
> ===================================================================
> --- lib/VMCore/ConstantFold.cpp
> +++ lib/VMCore/ConstantFold.cpp
> @@ -334,10 +334,10 @@
>   /// bouncing an unfoldable expression back into the top-level folder.
>   ///
>   static Constant *getFoldedSizeOf(Type *Ty, Type *DestTy,
> -                                 bool Folded) {
> +                                 bool Folded, unsigned AS) {
>     if (ArrayType *ATy = dyn_cast<ArrayType>(Ty)) {
>       Constant *N = ConstantInt::get(DestTy, ATy->getNumElements());
> -    Constant *E = getFoldedSizeOf(ATy->getElementType(), DestTy, true);
> +    Constant *E = getFoldedSizeOf(ATy->getElementType(), DestTy, true, AS);
>       return ConstantExpr::getNUWMul(E, N);
>     }
>
> @@ -349,11 +349,11 @@
>           return ConstantExpr::getNullValue(DestTy);
>         // Check for a struct with all members having the same size.
>         Constant *MemberSize =
> -        getFoldedSizeOf(STy->getElementType(0), DestTy, true);
> +        getFoldedSizeOf(STy->getElementType(0), DestTy, true, AS);
>         bool AllSame = true;
>         for (unsigned i = 1; i != NumElems; ++i)
>           if (MemberSize !=
> -            getFoldedSizeOf(STy->getElementType(i), DestTy, true)) {
> +            getFoldedSizeOf(STy->getElementType(i), DestTy, true, AS)) {
>             AllSame = false;
>             break;
>           }
> @@ -368,9 +368,8 @@
>     if (PointerType *PTy = dyn_cast<PointerType>(Ty))
>       if (!PTy->getElementType()->isIntegerTy(1))
>         return
> -        getFoldedSizeOf(PointerType::get(IntegerType::get(PTy->getContext(), 1),
> -                                         PTy->getAddressSpace()),
> -                        DestTy, true);
> +        getFoldedSizeOf(PointerType::get(IntegerType::get(PTy->getContext(), 1), AS),
> +                        DestTy, true, AS);
>
>     // If there's no interesting folding happening, bail so that we don't create
>     // a constant that looks like it needs folding but really doesn't.
> @@ -378,7 +377,7 @@
>       return 0;
>
>     // Base case: Get a regular sizeof expression.
> -  Constant *C = ConstantExpr::getSizeOf(Ty);
> +  Constant *C = ConstantExpr::getSizeOf(Ty, AS);
>     C = ConstantExpr::getCast(CastInst::getCastOpcode(C, false,
>                                                       DestTy, false),
>                               C, DestTy);
> @@ -458,12 +457,12 @@
>   ///
>   static Constant *getFoldedOffsetOf(Type *Ty, Constant *FieldNo,
>                                      Type *DestTy,
> -                                   bool Folded) {
> +                                   bool Folded, unsigned AS) {
>     if (ArrayType *ATy = dyn_cast<ArrayType>(Ty)) {
>       Constant *N = ConstantExpr::getCast(CastInst::getCastOpcode(FieldNo, false,
>                                                                   DestTy, false),
>                                           FieldNo, DestTy);
> -    Constant *E = getFoldedSizeOf(ATy->getElementType(), DestTy, true);
> +    Constant *E = getFoldedSizeOf(ATy->getElementType(), DestTy, true, AS);
>       return ConstantExpr::getNUWMul(E, N);
>     }
>
> @@ -475,11 +474,11 @@
>           return 0;
>         // Check for a struct with all members having the same size.
>         Constant *MemberSize =
> -        getFoldedSizeOf(STy->getElementType(0), DestTy, true);
> +        getFoldedSizeOf(STy->getElementType(0), DestTy, true, AS);
>         bool AllSame = true;
>         for (unsigned i = 1; i != NumElems; ++i)
>           if (MemberSize !=
> -            getFoldedSizeOf(STy->getElementType(i), DestTy, true)) {
> +            getFoldedSizeOf(STy->getElementType(i), DestTy, true, AS)) {
>             AllSame = false;
>             break;
>           }
> @@ -611,11 +610,12 @@
>             CE->getOperand(0)->isNullValue()) {
>           Type *Ty =
>             cast<PointerType>(CE->getOperand(0)->getType())->getElementType();
> +        unsigned AS = CE->getOperand(0)->getType()->getPointerAddressSpace();
>           if (CE->getNumOperands() == 2) {
>             // Handle a sizeof-like expression.
>             Constant *Idx = CE->getOperand(1);
>             bool isOne = isa<ConstantInt>(Idx) && cast<ConstantInt>(Idx)->isOne();
> -          if (Constant *C = getFoldedSizeOf(Ty, DestTy, !isOne)) {
> +          if (Constant *C = getFoldedSizeOf(Ty, DestTy, !isOne, AS)) {
>               Idx = ConstantExpr::getCast(CastInst::getCastOpcode(Idx, true,
>                                                                   DestTy, false),
>                                           Idx, DestTy);
> @@ -636,7 +636,7 @@
>             // Handle an offsetof-like expression.
>             if (Ty->isStructTy() || Ty->isArrayTy()) {
>               if (Constant *C = getFoldedOffsetOf(Ty, CE->getOperand(2),
> -                                                DestTy, false))
> +                                                DestTy, false, AS))
>                 return C;
>             }
>           }
> Index: lib/VMCore/Constants.cpp
> ===================================================================
> --- lib/VMCore/Constants.cpp
> +++ lib/VMCore/Constants.cpp
> @@ -1658,12 +1658,12 @@
>     return pImpl->ExprConstants.getOrCreate(C1->getType(), Key);
>   }
>
> -Constant *ConstantExpr::getSizeOf(Type* Ty) {
> -  // sizeof is implemented as: (i64) gep (Ty*)null, 1
> +Constant *ConstantExpr::getSizeOf(Type* Ty, unsigned AS) {
> +  // sizeof is implemented as: (i64) gep (Ty addrspace(AS)*)null, 1
>     // Note that a non-inbounds gep is used, as null isn't within any object.
>     Constant *GEPIdx = ConstantInt::get(Type::getInt32Ty(Ty->getContext()), 1);
>     Constant *GEP = getGetElementPtr(
> -                 Constant::getNullValue(PointerType::getUnqual(Ty)), GEPIdx);
> +                 Constant::getNullValue(PointerType::get(Ty, AS)), GEPIdx);
>     return getPtrToInt(GEP,
>                        Type::getInt64Ty(Ty->getContext()));
>   }
> Index: include/llvm/Constants.h
> ===================================================================
> --- include/llvm/Constants.h
> +++ include/llvm/Constants.h
> @@ -814,7 +814,7 @@
>     /// address-units, not bits) in a target independent way (Note: the return
>     /// type is an i64).
>     ///
> -  static Constant *getSizeOf(Type *Ty);
> +  static Constant *getSizeOf(Type *Ty, unsigned AS = 0);
>
>     /// getOffsetOf constant expr - computes the offset of a struct field in a
>     /// target independent way (Note: the return type is an i64).
>
>
>
> _______________________________________________
> 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