diff options
author | Shuxin Yang <shuxin.llvm@gmail.com> | 2013-10-09 17:21:44 +0000 |
---|---|---|
committer | Shuxin Yang <shuxin.llvm@gmail.com> | 2013-10-09 17:21:44 +0000 |
commit | 1cab418ce228f33537322753c7befc51428a525f (patch) | |
tree | 973687adf38f85224d6348d449281a2ef1d06d79 /clang/lib/Frontend/CompilerInvocation.cpp | |
parent | 9e9919f0431cc2ddc297813bdb772c776d14281c (diff) | |
download | llvm-1cab418ce228f33537322753c7befc51428a525f.zip llvm-1cab418ce228f33537322753c7befc51428a525f.tar.gz llvm-1cab418ce228f33537322753c7befc51428a525f.tar.bz2 |
Fix a bug in Dead Argument Elimination.
If a function seen at compile time is not necessarily the one linked to
the binary being built, it is illegal to change the actual arguments
passing to it.
e.g.
--------------------------
void foo(int lol) {
// foo() has linkage satisifying isWeakForLinker()
// "lol" is not used at all.
}
void bar(int lo2) {
// xform to foo(undef) is illegal, as compiler dose not know which
// instance of foo() will be linked to the the binary being built.
foo(lol2);
}
-----------------------------
Such functions can be captured by isWeakForLinker(). NOTE that
mayBeOverridden() is insufficient for this purpose as it dosen't include
linkage types like AvailableExternallyLinkage and LinkOnceODRLinkage.
Take link_odr* as an example, it indicates a set of *EQUIVALENT* globals
that can be merged at link-time. However, the semantic of
*EQUIVALENT*-functions includes parameters. Changing parameters breaks
the assumption.
Thank John McCall for help, especially for the explanation of subtle
difference between linkage types.
rdar://11546243
llvm-svn: 192302
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
0 files changed, 0 insertions, 0 deletions