[PATCH] Value.h, linkage, and NDEBUG differences between llvm lib build-time and client usage

Todd Fiala via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 2 15:39:03 PST 2016


Added missing [PATCH] to subject...

On Tue, Feb 2, 2016 at 3:38 PM, Todd Fiala <todd.fiala at gmail.com> wrote:

> Hello all!
>
> On LLDB, if I build LLVM and clang with Release + Asserts, and then build
> LLDB in Debug mode, I find the llvm::Value class presents itself in a way
> that creates a linkage issue.
>
> I fixed it with the diff at the end of the email.
>
> Essentially what happens is that during the LLVM/clang lib build step,
> NDEBUG is defined, so Value::assertModuleIsMaterialized() is defined inline
> (empty method).  This method is called via inline definitions elsewhere in
> the Value class that clients may call.
>
> Now, when a client of this library uses it (in this case LLDB), and that
> client is being built without NDEBUG, then the inline definitions in the
> header for the Value class are seeing the definition of
> Value::assertModuleIsMaterialized() that is claiming to be *not* inlined.
> However, when the LLVM lib was compiled, no such method was defined and
> therefore is not in the lib.  This leads to the symbol missing at link time
> because LLDB's usage of the header with the inline definitions expected to
> find a non-inlined version of the assertModuleIsMaterialized() method.
>
> The header is broken w/r/t whether NDEBUG is defined at the time the LLVM
> library is built vs. when it is used by a client.
>
> The patch below is a simplistic solution that says
> "assertModuleIsMaterialized() is always defined in the .cpp file".
> Therefore it makes it always a function call, and the call exists
> regardless of the NDEBUG state of the caller vs. the time the LLVM lib was
> built.  However, this also means all those assert calls in the
> header-implemented methods now turn into function calls instead of no-ops.
> If there's a better pattern for handling this in LLVM, feel free to suggest.
>
> Thanks!
>
> -Todd
>
> diff --git a/include/llvm/IR/Value.h b/include/llvm/IR/Value.h
> index 348ad97..c2997e9 100644
> --- a/include/llvm/IR/Value.h
> +++ b/include/llvm/IR/Value.h
> @@ -280,11 +280,7 @@ public:
>    // when using them since you might not get all uses.
>    // The methods that don't start with materialized_ assert that modules
> is
>    // fully materialized.
> -#ifdef NDEBUG
> -  void assertModuleIsMaterialized() const {}
> -#else
>    void assertModuleIsMaterialized() const;
> -#endif
>
>    bool use_empty() const {
>      assertModuleIsMaterialized();
> diff --git a/lib/IR/Value.cpp b/lib/IR/Value.cpp
> index 250f451..955204a 100644
> --- a/lib/IR/Value.cpp
> +++ b/lib/IR/Value.cpp
> @@ -314,8 +314,8 @@ void Value::takeName(Value *V) {
>      ST->reinsertValue(this);
>  }
>
> -#ifndef NDEBUG
>  void Value::assertModuleIsMaterialized() const {
> +#ifndef NDEBUG
>    const GlobalValue *GV = dyn_cast<GlobalValue>(this);
>    if (!GV)
>      return;
> @@ -323,8 +323,10 @@ void Value::assertModuleIsMaterialized() const {
>    if (!M)
>      return;
>    assert(M->isMaterialized());
> +#endif
>  }
>
> +#ifndef NDEBUG
>  static bool contains(SmallPtrSetImpl<ConstantExpr *> &Cache, ConstantExpr
> *Expr,
>                       Constant *C) {
>    if (!Cache.insert(Expr).second)
>
>


-- 
-Todd
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160202/d8b2338f/attachment.html>


More information about the llvm-commits mailing list