Revert "sparse, llvm: Don't redefine module local functions"
commit014de231b87ad9ba3f62b21abd4a591de742a5f4
authorPekka Enberg <penberg@kernel.org>
Tue, 30 Aug 2011 17:26:57 +0000 (30 20:26 +0300)
committerPekka Enberg <penberg@kernel.org>
Tue, 30 Aug 2011 17:28:46 +0000 (30 20:28 +0300)
treef8c9664addc2e43e5ef7560bc2527615091f8151
parentbe40b1a0e49a97f084c67d2ffc866b1445445d44
Revert "sparse, llvm: Don't redefine module local functions"

This reverts commit be40b1a0e49a97f084c67d2ffc866b1445445d44.

Jeff Garzik explains:

  That last commit isn't quite right.  The code before wasn't quite right either,
  but the new commit doesn't do a whole lot:

  commit be40b1a0e49a97f084c67d2ffc866b1445445d44
  Author: Pekka Enberg <penberg@kernel.org>
  Date:   Tue Aug 30 18:10:25 2011 +0300

      sparse, llvm: Don't redefine module local functions

Signed-off-by: Pekka Enberg <penberg@kernel.org>
  First problem:  we already have a list of function calling conventions cached
  for use.  That is what llfunc_list is.

  However...  this is _very wrong_ for varargs functions.  Your commit changes to
  using an LLVM list from a local list, but that does not fix the problem.

  This test case should demonstrate the broken code:

  int foo(int x, int y)
  {
     printf("%d\n", x);
     printf("%d, %d\n", x, y);
     return 0;
  }

  The first printf() cached [incorrectly] the list of arguments.  c.f. this code
  comment:

        /* to avoid strangeness with varargs [for now], we build
         * the function and type anew, for each call.  This
         * is probably wrong.  We should look up the
         * symbol declaration info.
         */
sparse-llvm.c