[llvm] r231577 - Make the assertion macros in Verifier and Linter truly variadic.

Duncan P. N. Exon Smith dexonsmith at apple.com
Fri Mar 13 20:14:27 PDT 2015


> On 2015 Mar 7, at 13:15, Benjamin Kramer <benny.kra at googlemail.com> wrote:
> 
> Author: d0k
> Date: Sat Mar  7 15:15:40 2015
> New Revision: 231577
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=231577&view=rev
> Log:
> Make the assertion macros in Verifier and Linter truly variadic.
> 

Nice cleanup!

> NFC.

Actually... (see below)

> 
> Modified:
>    llvm/trunk/lib/Analysis/Lint.cpp
>    llvm/trunk/lib/IR/Verifier.cpp
> 
> Modified: llvm/trunk/lib/Analysis/Lint.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/Lint.cpp?rev=231577&r1=231576&r2=231577&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/Lint.cpp (original)
> +++ llvm/trunk/lib/Analysis/Lint.cpp Sat Mar  7 15:15:40 2015
> @@ -129,27 +129,26 @@ namespace {
>     }
>     void print(raw_ostream &O, const Module *M) const override {}
> 
> -    void WriteValue(const Value *V) {
> -      if (!V) return;
> -      if (isa<Instruction>(V)) {
> -        MessagesStr << *V << '\n';
> -      } else {
> -        V->printAsOperand(MessagesStr, true, Mod);
> -        MessagesStr << '\n';
> +    void WriteValues(ArrayRef<const Value *> Vs) {
> +      for (const Value *V : Vs) {
> +        if (!V)
> +          continue;
> +        if (isa<Instruction>(V)) {
> +          MessagesStr << *V << '\n';
> +        } else {
> +          V->printAsOperand(MessagesStr, true, Mod);
> +          MessagesStr << '\n';
> +        }
>       }
>     }
> 
>     // CheckFailed - A check failed, so print out the condition and the message
>     // that failed.  This provides a nice place to put a breakpoint if you want
>     // to see why something is not correct.

This is no longer true.  I was playing with a similar patch myself
while I was on holiday -- strange timing -- and I noticed that
`b CheckFailed` no longer works (at least, not in `lldb`).  The
problem is that you need to specify `CheckFailed<...>` as the
breakpoint target.

My workaround was to add a `CheckFailedMsg()` function:

    void CheckFailedMsg(const Twine &Message) {
      MessagesStr << Message.str() << "\n";
    }

and have `CheckFailed()` call it.  Then `CheckFailedMsg()` serves
as a nice target for a breakpoint.

Any other ideas?

> -    void CheckFailed(const Twine &Message,
> -                     const Value *V1 = nullptr, const Value *V2 = nullptr,
> -                     const Value *V3 = nullptr, const Value *V4 = nullptr) {
> -      MessagesStr << Message.str() << "\n";
> -      WriteValue(V1);
> -      WriteValue(V2);
> -      WriteValue(V3);
> -      WriteValue(V4);
> +    template <typename... Ts>
> +    void CheckFailed(const Twine &Message, const Ts &...Vs) {
> +      MessagesStr << Message << '\n';
> +      WriteValues({Vs...});
>     }
>   };
> 




More information about the llvm-commits mailing list