Re: Multiple translation unit regression

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, Jul 5, 2009 at 4:06 PM, Ramsay Jones<ramsay@xxxxxxxxxxxxxxxxxxx> wrote:
>
> pre-process.c:609 in function expand():
>        struct arg args[nargs];

That is a known limit of sparse. It does not handle dynamic sized array.
In kernel that is not a good thing because kernel stack is very limited.

> sparse:
>        cgcc -no-compile $(ALL_CFLAGS) $(SPARSE_FLAGS) $(SRC_C)

I think libgit2 should make sparse to compile the file one by one.
Do them all at once might overflow your memory.

>
> this results in the follwing warnings (on cygwin):
>
> .../byteorder.h:39:1: warning: multiple definitions for function '__ntohl'
> .../byteorder.h:39:1:  the previous one is here
> .../byteorder.h:56:1: warning: multiple definitions for function '__ntohs'
> .../byteorder.h:56:1:  the previous one is here

GNU C has special treatment for "extern inline". It does not generate
the stand alone copy of the function. Sparse does not handle that very
well yet. I think the easiest way to fix is just run those source file
in sparse one by one.


>
> The third hunk of the diff to parse.c actually triggers the problem,
> but is not the real cause of the regression.

I think that is the right thing to do. The problem is that sparse currently
does not have way to mark a function as inline only without the standalone
copy.


>
> I think the problem is mainly caused by bind_symbol() binding the
> global_scope to some symbols. Indeed, the global_scope/file_scope
> seems to be a bit confused and confusing. Note that the global_scope

Global scope is for store global visible symbols.
File scopes is use for file local symbols like static functions.

> is not changed at all once intialised. In particular, each translation
> unit keeps adding to the, one and only, global_scope; which is
> effectively the same as the builtin_scope!

What is wrong with only one global scope?

Chris

> Hmm, the following diff shows a quick fix:
>
> --->8---
> diff --git a/scope.c b/scope.c
> index 27e38bc..fb4c039 100644
> --- a/scope.c
> +++ b/scope.c
> @@ -49,6 +49,7 @@ void start_file_scope(void)
>        /* top-level stuff defaults to file scope, "extern" etc will choose global scope */
>        function_scope = scope;
>        block_scope = scope;
> +       start_scope(&global_scope);
>  }
>
>  void start_symbol_scope(void)
> @@ -87,6 +88,7 @@ static void end_scope(struct scope **s)
>  void end_file_scope(void)
>  {
>        end_scope(&file_scope);
> +       end_scope(&global_scope);
>  }
>
>  void new_file_scope(void)
> --->8---
>
> But this is not the correct fix. In fact it may have broken c2xml
> and ctags. I haven't checked, but look at the main() code in c2xml.c
> and ctags.c; again the semantics of global_scope vs. file_scope
> seems confused and confusing. At least to me. ;-)

As you said, that is not the right fix. Ctags needs to use global scope
to look for symbol has been define but does not used in the file.

Chris
--
To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Newbies FAQ]     [LKML]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Trinity Fuzzer Tool]

  Powered by Linux