Index: llvm/lib/IR/Verifier.cpp =================================================================== --- llvm/lib/IR/Verifier.cpp +++ llvm/lib/IR/Verifier.cpp @@ -1843,6 +1843,13 @@ if (Args.second && !CheckParam("number of elements", *Args.second)) return; } + + if (Attrs.hasFnAttribute("frame-pointer")) { + StringRef FP = Attrs.getAttribute(AttributeList::FunctionIndex, + "frame-pointer").getValueAsString(); + if (FP != "all" && FP != "non-leaf" && FP != "none") + CheckFailed("invalid value for 'frame-pointer' attribute: " + FP, V); + } } void Verifier::verifyFunctionMetadata( Index: llvm/test/Verifier/invalid-frame-pointer-attr-empty.ll =================================================================== --- /dev/null +++ llvm/test/Verifier/invalid-frame-pointer-attr-empty.ll @@ -0,0 +1,9 @@ +; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s + +; CHECK: invalid value for 'frame-pointer' attribute: + +define void @func() #0 { + ret void +} + +attributes #0 = { "frame-pointer"="" } Index: llvm/test/Verifier/invalid-frame-pointer-attr-no-value.ll =================================================================== --- /dev/null +++ llvm/test/Verifier/invalid-frame-pointer-attr-no-value.ll @@ -0,0 +1,9 @@ +; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s + +; CHECK: invalid value for 'frame-pointer' attribute: + +define void @func() #0 { + ret void +} + +attributes #0 = { "frame-pointer" } Index: llvm/test/Verifier/invalid-frame-pointer-attr.ll =================================================================== --- /dev/null +++ llvm/test/Verifier/invalid-frame-pointer-attr.ll @@ -0,0 +1,9 @@ +; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s + +; CHECK: invalid value for 'frame-pointer' attribute: arst + +define void @func() #0 { + ret void +} + +attributes #0 = { "frame-pointer"="arst" }