aboutsummaryrefslogtreecommitdiff
path: root/gcc/ipa-inline.c
diff options
context:
space:
mode:
authorQing Zhao <qing.zhao@oracle.com>2018-11-29 16:06:03 +0000
committerQing Zhao <qinzhao@gcc.gnu.org>2018-11-29 16:06:03 +0000
commit6fd6a2ffee4bc790123d95fc7e638612aa0d7334 (patch)
treef2ee949591c3fb81f413986103f972a776d98c52 /gcc/ipa-inline.c
parent4aff6d17446ade686d1746716906e8b32499a619 (diff)
downloadgcc-6fd6a2ffee4bc790123d95fc7e638612aa0d7334.zip
gcc-6fd6a2ffee4bc790123d95fc7e638612aa0d7334.tar.gz
gcc-6fd6a2ffee4bc790123d95fc7e638612aa0d7334.tar.bz2
Add a new option -flive-patching={inline-only-static|inline-clone}
to support live patching in GCC. 2018-11-29 qing zhao <qing.zhao@oracle.com> gcc/ChangeLog: * cif-code.def (EXTERN_LIVE_ONLY_STATIC): New CIF code. * common.opt: Add -flive-patching flag. * doc/invoke.texi: Document -flive-patching. * flag-types.h (enum live_patching_level): New enum. * ipa-inline.c (can_inline_edge_p): Disable external functions from inlining when flag_live_patching is LIVE_PATCHING_INLINE_ONLY_STATIC. * opts.c (control_options_for_live_patching): New function. (finish_options): Make flag_live_patching incompatible with flag_lto. Control IPA optimizations based on different levels of flag_live_patching. gcc/testsuite/ChangeLog: * gcc.dg/live-patching-1.c: New test. * gcc.dg/live-patching-2.c: New test. * gcc.dg/live-patching-3.c: New test. * gcc.dg/tree-ssa/writeonly-3.c: New test. * gcc.target/i386/ipa-stack-alignment-2.c: New test. From-SVN: r266627
Diffstat (limited to 'gcc/ipa-inline.c')
-rw-r--r--gcc/ipa-inline.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index 173808a..bd6ab22 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -379,6 +379,12 @@ can_inline_edge_p (struct cgraph_edge *e, bool report,
e->inline_failed = CIF_ATTRIBUTE_MISMATCH;
inlinable = false;
}
+ else if (callee->externally_visible
+ && flag_live_patching == LIVE_PATCHING_INLINE_ONLY_STATIC)
+ {
+ e->inline_failed = CIF_EXTERN_LIVE_ONLY_STATIC;
+ inlinable = false;
+ }
if (!inlinable && report)
report_inline_failed_reason (e);
return inlinable;