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