diff --git a/regression/ansi-c/static1/main.c b/regression/ansi-c/static1/main.c new file mode 100644 index 00000000000..05691451b49 --- /dev/null +++ b/regression/ansi-c/static1/main.c @@ -0,0 +1,4 @@ +static int fun(int a) +{ + return a+1; +} diff --git a/regression/ansi-c/static_inline2/test.desc b/regression/ansi-c/static1/test.desc similarity index 64% rename from regression/ansi-c/static_inline2/test.desc rename to regression/ansi-c/static1/test.desc index 6a006f47021..bbbfc657697 100644 --- a/regression/ansi-c/static_inline2/test.desc +++ b/regression/ansi-c/static1/test.desc @@ -1,8 +1,7 @@ -KNOWNBUG +CORE main.c --function fun ^EXIT=0$ ^SIGNAL=0$ -^VERIFICATION SUCCESSFUL$ -- ^warning: ignoring diff --git a/regression/ansi-c/static2/main.c b/regression/ansi-c/static2/main.c new file mode 100644 index 00000000000..550c44b77f0 --- /dev/null +++ b/regression/ansi-c/static2/main.c @@ -0,0 +1,4 @@ +int foo(int a) +{ + return a+1; +} diff --git a/regression/ansi-c/static2/main2.c b/regression/ansi-c/static2/main2.c new file mode 100644 index 00000000000..c83d10bd8be --- /dev/null +++ b/regression/ansi-c/static2/main2.c @@ -0,0 +1,4 @@ +static int foo(int a) +{ + return a+1; +} diff --git a/regression/ansi-c/static2/test.desc b/regression/ansi-c/static2/test.desc new file mode 100644 index 00000000000..490502d10c5 --- /dev/null +++ b/regression/ansi-c/static2/test.desc @@ -0,0 +1,6 @@ +CORE +main.c +main2.c --function foo +^main symbol `foo' is ambiguous$ +-- +^warning: ignoring diff --git a/regression/ansi-c/static3/main.c b/regression/ansi-c/static3/main.c new file mode 100644 index 00000000000..c83d10bd8be --- /dev/null +++ b/regression/ansi-c/static3/main.c @@ -0,0 +1,4 @@ +static int foo(int a) +{ + return a+1; +} diff --git a/regression/ansi-c/static3/main2.c b/regression/ansi-c/static3/main2.c new file mode 100644 index 00000000000..c83d10bd8be --- /dev/null +++ b/regression/ansi-c/static3/main2.c @@ -0,0 +1,4 @@ +static int foo(int a) +{ + return a+1; +} diff --git a/regression/ansi-c/static3/test.desc b/regression/ansi-c/static3/test.desc new file mode 100644 index 00000000000..490502d10c5 --- /dev/null +++ b/regression/ansi-c/static3/test.desc @@ -0,0 +1,6 @@ +CORE +main.c +main2.c --function foo +^main symbol `foo' is ambiguous$ +-- +^warning: ignoring diff --git a/regression/ansi-c/static_inline1/test.desc b/regression/ansi-c/static_inline1/test.desc index 52168c7eba4..932cbf87ce3 100644 --- a/regression/ansi-c/static_inline1/test.desc +++ b/regression/ansi-c/static_inline1/test.desc @@ -1,8 +1,7 @@ -KNOWNBUG +CORE main.c ^EXIT=0$ ^SIGNAL=0$ -^VERIFICATION SUCCESSFUL$ -- ^warning: ignoring diff --git a/regression/ansi-c/static_inline2/main.c b/regression/ansi-c/static_inline2/main.c deleted file mode 100644 index c67e498b4f5..00000000000 --- a/regression/ansi-c/static_inline2/main.c +++ /dev/null @@ -1,4 +0,0 @@ -inline static int fun(int a) -{ - return a+1; -} diff --git a/regression/cbmc/Static4/main.c b/regression/cbmc/Static4/main.c new file mode 100644 index 00000000000..c83d10bd8be --- /dev/null +++ b/regression/cbmc/Static4/main.c @@ -0,0 +1,4 @@ +static int foo(int a) +{ + return a+1; +} diff --git a/regression/cbmc/Static4/test.desc b/regression/cbmc/Static4/test.desc new file mode 100644 index 00000000000..1d4a527e6f2 --- /dev/null +++ b/regression/cbmc/Static4/test.desc @@ -0,0 +1,7 @@ +CORE +main.c +--show-symbol-table +^EXIT=0$ +^SIGNAL=0$ +-- +^Symbol......: foo diff --git a/src/goto-programs/goto_inline.cpp b/src/goto-programs/goto_inline.cpp index efe049ec146..5ca3e1d55c3 100644 --- a/src/goto-programs/goto_inline.cpp +++ b/src/goto-programs/goto_inline.cpp @@ -213,7 +213,12 @@ void goto_partial_inline( // called function const goto_functiont &goto_function=f_it->second; - if(!goto_function.body_available()) + // We can't take functions without bodies to find functions + // inside them to be inlined. + // We also don't allow for the _start function to have any of its + // function calls to be inlined + if(!goto_function.body_available() || + f_it->first==goto_functions.entry_point()) continue; const goto_programt &goto_program=goto_function.body; diff --git a/src/linking/remove_internal_symbols.cpp b/src/linking/remove_internal_symbols.cpp index f3dd5cf5e68..5b4a7b13625 100644 --- a/src/linking/remove_internal_symbols.cpp +++ b/src/linking/remove_internal_symbols.cpp @@ -11,6 +11,7 @@ Author: Daniel Kroening #include #include #include +#include #include "remove_internal_symbols.h" @@ -149,7 +150,8 @@ void remove_internal_symbols( else if(is_function) { // body? not local (i.e., "static")? - if(has_body && !is_file_local) + if(has_body && + (!is_file_local || (config.main==symbol.name.c_str()))) get_symbols_rec(ns, symbol, exported); } else