mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-25 05:22:04 +00:00
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
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@192302 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -357,6 +357,19 @@ bool DAE::RemoveDeadArgumentsFromCallers(Function &Fn)
|
||||
if (Fn.hasLocalLinkage() && !Fn.getFunctionType()->isVarArg())
|
||||
return false;
|
||||
|
||||
// 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. These 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.
|
||||
//
|
||||
if (Fn.isWeakForLinker())
|
||||
return false;
|
||||
|
||||
if (Fn.use_empty())
|
||||
return false;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user