[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