Liste des Groupes | Revenir à cl c |
Kaz Kylheku <433-929-6894@kylheku.com> writes:Since ISO C says that the semantic analysis has been done (that>
unit having gone through phase 7), we can take it for granted as a
done-and-dusted property of that translation unit that it calls bar
whenever its foo is invoked.
We can take it for granted that the output performed by the printf call
will be performed, because output is observable behavior. If the
external function bar is modified, the LTO step has to be redone.
>Say I have a call to foo in main, and the definition of foo is in>
another translation unit. In the absence of LTO, the compiler will have
to generate a call to foo. If LTO is able to determine that foo doesn't
do anything, it can remove the code for the function call, and the
resulting behavior of the linked program is unchanged.
There always situations in which optimizations that have been forbidden
don't cause a problem, and are even desirable.
>
If you have LTO turned on, you might be programming in GNU C or Clang C
or whatever, not standard C.
>
Sometimes programs have the same interpretation in GNU C and standard
C, or the same interpretation to someone who doesn't care about certain
differences.
Are you claiming that a function call is observable behavior?
Consider:
>
main.c:
#include "foo.h"
int main(void) {
foo();
}
>
>
foo.h:
#ifndef FOO_H
#define FOO_H
void foo(void);
#endif
>
>
foo.c:
void foo(void) {
// do nothing
}
>
>
Are you saying that the "call" instruction generated for the function
call is *observable behavior*?
If an implementation doesn't generate
that "call" instruction because it's able to determine at link time that
the call does nothing, that optimization is forbidden?
I presume you'd agree that omitting the "call" instruction is allowed if
the call and the function definition are in the same translation unit.
What wording in the standard requires a "call" instruction to be
generated if they're in different translation units?
>
That's a trivial example, but other link time optimizations that don't
change a program's observable behavior (insert weasel words about
unspecified behavior) are also allowed.
In phase 8:
All external object and function references are resolved. Library
components are linked to satisfy external references to functions
and objects not defined in the current translation. All such
translator output is collected into a program image which contains
information needed for execution in its execution environment.
>
I don't see anything about required CPU instructions.
Les messages affichés proviennent d'usenet.