aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Frontend/CompilerInvocation.cpp
diff options
context:
space:
mode:
authorShuxin Yang <shuxin.llvm@gmail.com>2013-10-09 17:21:44 +0000
committerShuxin Yang <shuxin.llvm@gmail.com>2013-10-09 17:21:44 +0000
commit1cab418ce228f33537322753c7befc51428a525f (patch)
tree973687adf38f85224d6348d449281a2ef1d06d79 /clang/lib/Frontend/CompilerInvocation.cpp
parent9e9919f0431cc2ddc297813bdb772c776d14281c (diff)
downloadllvm-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