[PATCH] D20713: ValueMapper: fix assertion when null-mapping a constant for linking metadata

Rafael EspĂ­ndola via llvm-commits llvm-commits at lists.llvm.org
Sat May 28 03:56:11 PDT 2016


LGTM

On 27 May 2016 at 21:03, Mehdi AMINI <mehdi.amini at apple.com> wrote:
> mehdi_amini updated this revision to Diff 58873.
> mehdi_amini added a comment.
>
> Fix the assert after extraction in the helper
>
>
> http://reviews.llvm.org/D20713
>
> Files:
>   lib/Transforms/Utils/ValueMapper.cpp
>   test/Linker/null_mapping_constant.ll
>
> Index: test/Linker/null_mapping_constant.ll
> ===================================================================
> --- /dev/null
> +++ test/Linker/null_mapping_constant.ll
> @@ -0,0 +1,11 @@
> +; RUN: llvm-link %s -S -o - | FileCheck %s
> +; Check that the constant is not linked and the metadata is correctly referencing a nullptr
> +; CHECK: !0 = !{!"foo", null, i64 16}
> +
> +
> +
> +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
> +target triple = "x86_64-apple-macosx10.12.0"
> + at foo = external unnamed_addr constant { [4 x i8*], [32 x i8] }, align 32
> +!llvm.bitsets = !{!0}
> +!0 = !{!"foo", [4 x i8*]* getelementptr inbounds ({ [4 x i8*], [32 x i8] }, { [4 x i8*], [32 x i8] }* @foo, i32 0, i32 0), i64 16}
> Index: lib/Transforms/Utils/ValueMapper.cpp
> ===================================================================
> --- lib/Transforms/Utils/ValueMapper.cpp
> +++ lib/Transforms/Utils/ValueMapper.cpp
> @@ -429,13 +429,23 @@
>    if (BlockAddress *BA = dyn_cast<BlockAddress>(C))
>      return mapBlockAddress(*BA);
>
> +  auto mapValueOrNull = [this](Value *V) {
> +    auto Mapped = mapValue(V);
> +    assert((Mapped || (Flags & RF_NullMapMissingGlobalValues)) &&
> +           "Unexpected null mapping for constant operand without "
> +           "NullMapMissingGlobalValues flag");
> +    return Mapped;
> +  };
> +
>    // Otherwise, we have some other constant to remap.  Start by checking to see
>    // if all operands have an identity remapping.
>    unsigned OpNo = 0, NumOperands = C->getNumOperands();
>    Value *Mapped = nullptr;
>    for (; OpNo != NumOperands; ++OpNo) {
>      Value *Op = C->getOperand(OpNo);
> -    Mapped = mapValue(Op);
> +    Mapped = mapValueOrNull(Op);
> +    if (!Mapped)
> +      return nullptr;
>      if (Mapped != Op)
>        break;
>    }
> @@ -462,8 +472,12 @@
>      Ops.push_back(cast<Constant>(Mapped));
>
>      // Map the rest of the operands that aren't processed yet.
> -    for (++OpNo; OpNo != NumOperands; ++OpNo)
> -      Ops.push_back(cast<Constant>(mapValue(C->getOperand(OpNo))));
> +    for (++OpNo; OpNo != NumOperands; ++OpNo) {
> +      Mapped = mapValueOrNull(C->getOperand(OpNo));
> +      if (!Mapped)
> +        return nullptr;
> +      Ops.push_back(cast<Constant>(Mapped));
> +    }
>    }
>    Type *NewSrcTy = nullptr;
>    if (TypeMapper)
>
>


More information about the llvm-commits mailing list