diff options
author | Martin Liska <mliska@suse.cz> | 2022-01-14 16:56:44 +0100 |
---|---|---|
committer | Martin Liska <mliska@suse.cz> | 2022-01-17 22:12:04 +0100 |
commit | 5c69acb32329d49e58c26fa41ae74229a52b9106 (patch) | |
tree | ddb05f9d73afb6f998457d2ac4b720e3b3b60483 /gcc/gimple.c | |
parent | 490e23032baaece71f2ec09fa1805064b150fbc2 (diff) | |
download | gcc-5c69acb32329d49e58c26fa41ae74229a52b9106.zip gcc-5c69acb32329d49e58c26fa41ae74229a52b9106.tar.gz gcc-5c69acb32329d49e58c26fa41ae74229a52b9106.tar.bz2 |
Rename .c files to .cc files.
gcc/ada/ChangeLog:
* adadecode.c: Moved to...
* adadecode.cc: ...here.
* affinity.c: Moved to...
* affinity.cc: ...here.
* argv-lynxos178-raven-cert.c: Moved to...
* argv-lynxos178-raven-cert.cc: ...here.
* argv.c: Moved to...
* argv.cc: ...here.
* aux-io.c: Moved to...
* aux-io.cc: ...here.
* cio.c: Moved to...
* cio.cc: ...here.
* cstreams.c: Moved to...
* cstreams.cc: ...here.
* env.c: Moved to...
* env.cc: ...here.
* exit.c: Moved to...
* exit.cc: ...here.
* expect.c: Moved to...
* expect.cc: ...here.
* final.c: Moved to...
* final.cc: ...here.
* gcc-interface/cuintp.c: Moved to...
* gcc-interface/cuintp.cc: ...here.
* gcc-interface/decl.c: Moved to...
* gcc-interface/decl.cc: ...here.
* gcc-interface/misc.c: Moved to...
* gcc-interface/misc.cc: ...here.
* gcc-interface/targtyps.c: Moved to...
* gcc-interface/targtyps.cc: ...here.
* gcc-interface/trans.c: Moved to...
* gcc-interface/trans.cc: ...here.
* gcc-interface/utils.c: Moved to...
* gcc-interface/utils.cc: ...here.
* gcc-interface/utils2.c: Moved to...
* gcc-interface/utils2.cc: ...here.
* init.c: Moved to...
* init.cc: ...here.
* initialize.c: Moved to...
* initialize.cc: ...here.
* libgnarl/thread.c: Moved to...
* libgnarl/thread.cc: ...here.
* link.c: Moved to...
* link.cc: ...here.
* locales.c: Moved to...
* locales.cc: ...here.
* mkdir.c: Moved to...
* mkdir.cc: ...here.
* raise.c: Moved to...
* raise.cc: ...here.
* rtfinal.c: Moved to...
* rtfinal.cc: ...here.
* rtinit.c: Moved to...
* rtinit.cc: ...here.
* seh_init.c: Moved to...
* seh_init.cc: ...here.
* sigtramp-armdroid.c: Moved to...
* sigtramp-armdroid.cc: ...here.
* sigtramp-ios.c: Moved to...
* sigtramp-ios.cc: ...here.
* sigtramp-qnx.c: Moved to...
* sigtramp-qnx.cc: ...here.
* sigtramp-vxworks.c: Moved to...
* sigtramp-vxworks.cc: ...here.
* socket.c: Moved to...
* socket.cc: ...here.
* tracebak.c: Moved to...
* tracebak.cc: ...here.
* version.c: Moved to...
* version.cc: ...here.
* vx_stack_info.c: Moved to...
* vx_stack_info.cc: ...here.
gcc/ChangeLog:
* adjust-alignment.c: Moved to...
* adjust-alignment.cc: ...here.
* alias.c: Moved to...
* alias.cc: ...here.
* alloc-pool.c: Moved to...
* alloc-pool.cc: ...here.
* asan.c: Moved to...
* asan.cc: ...here.
* attribs.c: Moved to...
* attribs.cc: ...here.
* auto-inc-dec.c: Moved to...
* auto-inc-dec.cc: ...here.
* auto-profile.c: Moved to...
* auto-profile.cc: ...here.
* bb-reorder.c: Moved to...
* bb-reorder.cc: ...here.
* bitmap.c: Moved to...
* bitmap.cc: ...here.
* btfout.c: Moved to...
* btfout.cc: ...here.
* builtins.c: Moved to...
* builtins.cc: ...here.
* caller-save.c: Moved to...
* caller-save.cc: ...here.
* calls.c: Moved to...
* calls.cc: ...here.
* ccmp.c: Moved to...
* ccmp.cc: ...here.
* cfg.c: Moved to...
* cfg.cc: ...here.
* cfganal.c: Moved to...
* cfganal.cc: ...here.
* cfgbuild.c: Moved to...
* cfgbuild.cc: ...here.
* cfgcleanup.c: Moved to...
* cfgcleanup.cc: ...here.
* cfgexpand.c: Moved to...
* cfgexpand.cc: ...here.
* cfghooks.c: Moved to...
* cfghooks.cc: ...here.
* cfgloop.c: Moved to...
* cfgloop.cc: ...here.
* cfgloopanal.c: Moved to...
* cfgloopanal.cc: ...here.
* cfgloopmanip.c: Moved to...
* cfgloopmanip.cc: ...here.
* cfgrtl.c: Moved to...
* cfgrtl.cc: ...here.
* cgraph.c: Moved to...
* cgraph.cc: ...here.
* cgraphbuild.c: Moved to...
* cgraphbuild.cc: ...here.
* cgraphclones.c: Moved to...
* cgraphclones.cc: ...here.
* cgraphunit.c: Moved to...
* cgraphunit.cc: ...here.
* collect-utils.c: Moved to...
* collect-utils.cc: ...here.
* collect2-aix.c: Moved to...
* collect2-aix.cc: ...here.
* collect2.c: Moved to...
* collect2.cc: ...here.
* combine-stack-adj.c: Moved to...
* combine-stack-adj.cc: ...here.
* combine.c: Moved to...
* combine.cc: ...here.
* common/common-targhooks.c: Moved to...
* common/common-targhooks.cc: ...here.
* common/config/aarch64/aarch64-common.c: Moved to...
* common/config/aarch64/aarch64-common.cc: ...here.
* common/config/alpha/alpha-common.c: Moved to...
* common/config/alpha/alpha-common.cc: ...here.
* common/config/arc/arc-common.c: Moved to...
* common/config/arc/arc-common.cc: ...here.
* common/config/arm/arm-common.c: Moved to...
* common/config/arm/arm-common.cc: ...here.
* common/config/avr/avr-common.c: Moved to...
* common/config/avr/avr-common.cc: ...here.
* common/config/bfin/bfin-common.c: Moved to...
* common/config/bfin/bfin-common.cc: ...here.
* common/config/bpf/bpf-common.c: Moved to...
* common/config/bpf/bpf-common.cc: ...here.
* common/config/c6x/c6x-common.c: Moved to...
* common/config/c6x/c6x-common.cc: ...here.
* common/config/cr16/cr16-common.c: Moved to...
* common/config/cr16/cr16-common.cc: ...here.
* common/config/cris/cris-common.c: Moved to...
* common/config/cris/cris-common.cc: ...here.
* common/config/csky/csky-common.c: Moved to...
* common/config/csky/csky-common.cc: ...here.
* common/config/default-common.c: Moved to...
* common/config/default-common.cc: ...here.
* common/config/epiphany/epiphany-common.c: Moved to...
* common/config/epiphany/epiphany-common.cc: ...here.
* common/config/fr30/fr30-common.c: Moved to...
* common/config/fr30/fr30-common.cc: ...here.
* common/config/frv/frv-common.c: Moved to...
* common/config/frv/frv-common.cc: ...here.
* common/config/gcn/gcn-common.c: Moved to...
* common/config/gcn/gcn-common.cc: ...here.
* common/config/h8300/h8300-common.c: Moved to...
* common/config/h8300/h8300-common.cc: ...here.
* common/config/i386/i386-common.c: Moved to...
* common/config/i386/i386-common.cc: ...here.
* common/config/ia64/ia64-common.c: Moved to...
* common/config/ia64/ia64-common.cc: ...here.
* common/config/iq2000/iq2000-common.c: Moved to...
* common/config/iq2000/iq2000-common.cc: ...here.
* common/config/lm32/lm32-common.c: Moved to...
* common/config/lm32/lm32-common.cc: ...here.
* common/config/m32r/m32r-common.c: Moved to...
* common/config/m32r/m32r-common.cc: ...here.
* common/config/m68k/m68k-common.c: Moved to...
* common/config/m68k/m68k-common.cc: ...here.
* common/config/mcore/mcore-common.c: Moved to...
* common/config/mcore/mcore-common.cc: ...here.
* common/config/microblaze/microblaze-common.c: Moved to...
* common/config/microblaze/microblaze-common.cc: ...here.
* common/config/mips/mips-common.c: Moved to...
* common/config/mips/mips-common.cc: ...here.
* common/config/mmix/mmix-common.c: Moved to...
* common/config/mmix/mmix-common.cc: ...here.
* common/config/mn10300/mn10300-common.c: Moved to...
* common/config/mn10300/mn10300-common.cc: ...here.
* common/config/msp430/msp430-common.c: Moved to...
* common/config/msp430/msp430-common.cc: ...here.
* common/config/nds32/nds32-common.c: Moved to...
* common/config/nds32/nds32-common.cc: ...here.
* common/config/nios2/nios2-common.c: Moved to...
* common/config/nios2/nios2-common.cc: ...here.
* common/config/nvptx/nvptx-common.c: Moved to...
* common/config/nvptx/nvptx-common.cc: ...here.
* common/config/or1k/or1k-common.c: Moved to...
* common/config/or1k/or1k-common.cc: ...here.
* common/config/pa/pa-common.c: Moved to...
* common/config/pa/pa-common.cc: ...here.
* common/config/pdp11/pdp11-common.c: Moved to...
* common/config/pdp11/pdp11-common.cc: ...here.
* common/config/pru/pru-common.c: Moved to...
* common/config/pru/pru-common.cc: ...here.
* common/config/riscv/riscv-common.c: Moved to...
* common/config/riscv/riscv-common.cc: ...here.
* common/config/rs6000/rs6000-common.c: Moved to...
* common/config/rs6000/rs6000-common.cc: ...here.
* common/config/rx/rx-common.c: Moved to...
* common/config/rx/rx-common.cc: ...here.
* common/config/s390/s390-common.c: Moved to...
* common/config/s390/s390-common.cc: ...here.
* common/config/sh/sh-common.c: Moved to...
* common/config/sh/sh-common.cc: ...here.
* common/config/sparc/sparc-common.c: Moved to...
* common/config/sparc/sparc-common.cc: ...here.
* common/config/tilegx/tilegx-common.c: Moved to...
* common/config/tilegx/tilegx-common.cc: ...here.
* common/config/tilepro/tilepro-common.c: Moved to...
* common/config/tilepro/tilepro-common.cc: ...here.
* common/config/v850/v850-common.c: Moved to...
* common/config/v850/v850-common.cc: ...here.
* common/config/vax/vax-common.c: Moved to...
* common/config/vax/vax-common.cc: ...here.
* common/config/visium/visium-common.c: Moved to...
* common/config/visium/visium-common.cc: ...here.
* common/config/xstormy16/xstormy16-common.c: Moved to...
* common/config/xstormy16/xstormy16-common.cc: ...here.
* common/config/xtensa/xtensa-common.c: Moved to...
* common/config/xtensa/xtensa-common.cc: ...here.
* compare-elim.c: Moved to...
* compare-elim.cc: ...here.
* config/aarch64/aarch64-bti-insert.c: Moved to...
* config/aarch64/aarch64-bti-insert.cc: ...here.
* config/aarch64/aarch64-builtins.c: Moved to...
* config/aarch64/aarch64-builtins.cc: ...here.
* config/aarch64/aarch64-c.c: Moved to...
* config/aarch64/aarch64-c.cc: ...here.
* config/aarch64/aarch64-d.c: Moved to...
* config/aarch64/aarch64-d.cc: ...here.
* config/aarch64/aarch64.c: Moved to...
* config/aarch64/aarch64.cc: ...here.
* config/aarch64/cortex-a57-fma-steering.c: Moved to...
* config/aarch64/cortex-a57-fma-steering.cc: ...here.
* config/aarch64/driver-aarch64.c: Moved to...
* config/aarch64/driver-aarch64.cc: ...here.
* config/aarch64/falkor-tag-collision-avoidance.c: Moved to...
* config/aarch64/falkor-tag-collision-avoidance.cc: ...here.
* config/aarch64/host-aarch64-darwin.c: Moved to...
* config/aarch64/host-aarch64-darwin.cc: ...here.
* config/alpha/alpha.c: Moved to...
* config/alpha/alpha.cc: ...here.
* config/alpha/driver-alpha.c: Moved to...
* config/alpha/driver-alpha.cc: ...here.
* config/arc/arc-c.c: Moved to...
* config/arc/arc-c.cc: ...here.
* config/arc/arc.c: Moved to...
* config/arc/arc.cc: ...here.
* config/arc/driver-arc.c: Moved to...
* config/arc/driver-arc.cc: ...here.
* config/arm/aarch-common.c: Moved to...
* config/arm/aarch-common.cc: ...here.
* config/arm/arm-builtins.c: Moved to...
* config/arm/arm-builtins.cc: ...here.
* config/arm/arm-c.c: Moved to...
* config/arm/arm-c.cc: ...here.
* config/arm/arm-d.c: Moved to...
* config/arm/arm-d.cc: ...here.
* config/arm/arm.c: Moved to...
* config/arm/arm.cc: ...here.
* config/arm/driver-arm.c: Moved to...
* config/arm/driver-arm.cc: ...here.
* config/avr/avr-c.c: Moved to...
* config/avr/avr-c.cc: ...here.
* config/avr/avr-devices.c: Moved to...
* config/avr/avr-devices.cc: ...here.
* config/avr/avr-log.c: Moved to...
* config/avr/avr-log.cc: ...here.
* config/avr/avr.c: Moved to...
* config/avr/avr.cc: ...here.
* config/avr/driver-avr.c: Moved to...
* config/avr/driver-avr.cc: ...here.
* config/avr/gen-avr-mmcu-specs.c: Moved to...
* config/avr/gen-avr-mmcu-specs.cc: ...here.
* config/avr/gen-avr-mmcu-texi.c: Moved to...
* config/avr/gen-avr-mmcu-texi.cc: ...here.
* config/bfin/bfin.c: Moved to...
* config/bfin/bfin.cc: ...here.
* config/bpf/bpf.c: Moved to...
* config/bpf/bpf.cc: ...here.
* config/bpf/coreout.c: Moved to...
* config/bpf/coreout.cc: ...here.
* config/c6x/c6x.c: Moved to...
* config/c6x/c6x.cc: ...here.
* config/cr16/cr16.c: Moved to...
* config/cr16/cr16.cc: ...here.
* config/cris/cris.c: Moved to...
* config/cris/cris.cc: ...here.
* config/csky/csky.c: Moved to...
* config/csky/csky.cc: ...here.
* config/darwin-c.c: Moved to...
* config/darwin-c.cc: ...here.
* config/darwin-d.c: Moved to...
* config/darwin-d.cc: ...here.
* config/darwin-driver.c: Moved to...
* config/darwin-driver.cc: ...here.
* config/darwin-f.c: Moved to...
* config/darwin-f.cc: ...here.
* config/darwin.c: Moved to...
* config/darwin.cc: ...here.
* config/default-c.c: Moved to...
* config/default-c.cc: ...here.
* config/default-d.c: Moved to...
* config/default-d.cc: ...here.
* config/dragonfly-d.c: Moved to...
* config/dragonfly-d.cc: ...here.
* config/epiphany/epiphany.c: Moved to...
* config/epiphany/epiphany.cc: ...here.
* config/epiphany/mode-switch-use.c: Moved to...
* config/epiphany/mode-switch-use.cc: ...here.
* config/epiphany/resolve-sw-modes.c: Moved to...
* config/epiphany/resolve-sw-modes.cc: ...here.
* config/fr30/fr30.c: Moved to...
* config/fr30/fr30.cc: ...here.
* config/freebsd-d.c: Moved to...
* config/freebsd-d.cc: ...here.
* config/frv/frv.c: Moved to...
* config/frv/frv.cc: ...here.
* config/ft32/ft32.c: Moved to...
* config/ft32/ft32.cc: ...here.
* config/gcn/driver-gcn.c: Moved to...
* config/gcn/driver-gcn.cc: ...here.
* config/gcn/gcn-run.c: Moved to...
* config/gcn/gcn-run.cc: ...here.
* config/gcn/gcn-tree.c: Moved to...
* config/gcn/gcn-tree.cc: ...here.
* config/gcn/gcn.c: Moved to...
* config/gcn/gcn.cc: ...here.
* config/gcn/mkoffload.c: Moved to...
* config/gcn/mkoffload.cc: ...here.
* config/glibc-c.c: Moved to...
* config/glibc-c.cc: ...here.
* config/glibc-d.c: Moved to...
* config/glibc-d.cc: ...here.
* config/h8300/h8300.c: Moved to...
* config/h8300/h8300.cc: ...here.
* config/host-darwin.c: Moved to...
* config/host-darwin.cc: ...here.
* config/host-hpux.c: Moved to...
* config/host-hpux.cc: ...here.
* config/host-linux.c: Moved to...
* config/host-linux.cc: ...here.
* config/host-netbsd.c: Moved to...
* config/host-netbsd.cc: ...here.
* config/host-openbsd.c: Moved to...
* config/host-openbsd.cc: ...here.
* config/host-solaris.c: Moved to...
* config/host-solaris.cc: ...here.
* config/i386/djgpp.c: Moved to...
* config/i386/djgpp.cc: ...here.
* config/i386/driver-i386.c: Moved to...
* config/i386/driver-i386.cc: ...here.
* config/i386/driver-mingw32.c: Moved to...
* config/i386/driver-mingw32.cc: ...here.
* config/i386/gnu-property.c: Moved to...
* config/i386/gnu-property.cc: ...here.
* config/i386/host-cygwin.c: Moved to...
* config/i386/host-cygwin.cc: ...here.
* config/i386/host-i386-darwin.c: Moved to...
* config/i386/host-i386-darwin.cc: ...here.
* config/i386/host-mingw32.c: Moved to...
* config/i386/host-mingw32.cc: ...here.
* config/i386/i386-builtins.c: Moved to...
* config/i386/i386-builtins.cc: ...here.
* config/i386/i386-c.c: Moved to...
* config/i386/i386-c.cc: ...here.
* config/i386/i386-d.c: Moved to...
* config/i386/i386-d.cc: ...here.
* config/i386/i386-expand.c: Moved to...
* config/i386/i386-expand.cc: ...here.
* config/i386/i386-features.c: Moved to...
* config/i386/i386-features.cc: ...here.
* config/i386/i386-options.c: Moved to...
* config/i386/i386-options.cc: ...here.
* config/i386/i386.c: Moved to...
* config/i386/i386.cc: ...here.
* config/i386/intelmic-mkoffload.c: Moved to...
* config/i386/intelmic-mkoffload.cc: ...here.
* config/i386/msformat-c.c: Moved to...
* config/i386/msformat-c.cc: ...here.
* config/i386/winnt-cxx.c: Moved to...
* config/i386/winnt-cxx.cc: ...here.
* config/i386/winnt-d.c: Moved to...
* config/i386/winnt-d.cc: ...here.
* config/i386/winnt-stubs.c: Moved to...
* config/i386/winnt-stubs.cc: ...here.
* config/i386/winnt.c: Moved to...
* config/i386/winnt.cc: ...here.
* config/i386/x86-tune-sched-atom.c: Moved to...
* config/i386/x86-tune-sched-atom.cc: ...here.
* config/i386/x86-tune-sched-bd.c: Moved to...
* config/i386/x86-tune-sched-bd.cc: ...here.
* config/i386/x86-tune-sched-core.c: Moved to...
* config/i386/x86-tune-sched-core.cc: ...here.
* config/i386/x86-tune-sched.c: Moved to...
* config/i386/x86-tune-sched.cc: ...here.
* config/ia64/ia64-c.c: Moved to...
* config/ia64/ia64-c.cc: ...here.
* config/ia64/ia64.c: Moved to...
* config/ia64/ia64.cc: ...here.
* config/iq2000/iq2000.c: Moved to...
* config/iq2000/iq2000.cc: ...here.
* config/linux.c: Moved to...
* config/linux.cc: ...here.
* config/lm32/lm32.c: Moved to...
* config/lm32/lm32.cc: ...here.
* config/m32c/m32c-pragma.c: Moved to...
* config/m32c/m32c-pragma.cc: ...here.
* config/m32c/m32c.c: Moved to...
* config/m32c/m32c.cc: ...here.
* config/m32r/m32r.c: Moved to...
* config/m32r/m32r.cc: ...here.
* config/m68k/m68k.c: Moved to...
* config/m68k/m68k.cc: ...here.
* config/mcore/mcore.c: Moved to...
* config/mcore/mcore.cc: ...here.
* config/microblaze/microblaze-c.c: Moved to...
* config/microblaze/microblaze-c.cc: ...here.
* config/microblaze/microblaze.c: Moved to...
* config/microblaze/microblaze.cc: ...here.
* config/mips/driver-native.c: Moved to...
* config/mips/driver-native.cc: ...here.
* config/mips/frame-header-opt.c: Moved to...
* config/mips/frame-header-opt.cc: ...here.
* config/mips/mips-d.c: Moved to...
* config/mips/mips-d.cc: ...here.
* config/mips/mips.c: Moved to...
* config/mips/mips.cc: ...here.
* config/mmix/mmix.c: Moved to...
* config/mmix/mmix.cc: ...here.
* config/mn10300/mn10300.c: Moved to...
* config/mn10300/mn10300.cc: ...here.
* config/moxie/moxie.c: Moved to...
* config/moxie/moxie.cc: ...here.
* config/msp430/driver-msp430.c: Moved to...
* config/msp430/driver-msp430.cc: ...here.
* config/msp430/msp430-c.c: Moved to...
* config/msp430/msp430-c.cc: ...here.
* config/msp430/msp430-devices.c: Moved to...
* config/msp430/msp430-devices.cc: ...here.
* config/msp430/msp430.c: Moved to...
* config/msp430/msp430.cc: ...here.
* config/nds32/nds32-cost.c: Moved to...
* config/nds32/nds32-cost.cc: ...here.
* config/nds32/nds32-fp-as-gp.c: Moved to...
* config/nds32/nds32-fp-as-gp.cc: ...here.
* config/nds32/nds32-intrinsic.c: Moved to...
* config/nds32/nds32-intrinsic.cc: ...here.
* config/nds32/nds32-isr.c: Moved to...
* config/nds32/nds32-isr.cc: ...here.
* config/nds32/nds32-md-auxiliary.c: Moved to...
* config/nds32/nds32-md-auxiliary.cc: ...here.
* config/nds32/nds32-memory-manipulation.c: Moved to...
* config/nds32/nds32-memory-manipulation.cc: ...here.
* config/nds32/nds32-pipelines-auxiliary.c: Moved to...
* config/nds32/nds32-pipelines-auxiliary.cc: ...here.
* config/nds32/nds32-predicates.c: Moved to...
* config/nds32/nds32-predicates.cc: ...here.
* config/nds32/nds32-relax-opt.c: Moved to...
* config/nds32/nds32-relax-opt.cc: ...here.
* config/nds32/nds32-utils.c: Moved to...
* config/nds32/nds32-utils.cc: ...here.
* config/nds32/nds32.c: Moved to...
* config/nds32/nds32.cc: ...here.
* config/netbsd-d.c: Moved to...
* config/netbsd-d.cc: ...here.
* config/netbsd.c: Moved to...
* config/netbsd.cc: ...here.
* config/nios2/nios2.c: Moved to...
* config/nios2/nios2.cc: ...here.
* config/nvptx/mkoffload.c: Moved to...
* config/nvptx/mkoffload.cc: ...here.
* config/nvptx/nvptx-c.c: Moved to...
* config/nvptx/nvptx-c.cc: ...here.
* config/nvptx/nvptx.c: Moved to...
* config/nvptx/nvptx.cc: ...here.
* config/openbsd-d.c: Moved to...
* config/openbsd-d.cc: ...here.
* config/or1k/or1k.c: Moved to...
* config/or1k/or1k.cc: ...here.
* config/pa/pa-d.c: Moved to...
* config/pa/pa-d.cc: ...here.
* config/pa/pa.c: Moved to...
* config/pa/pa.cc: ...here.
* config/pdp11/pdp11.c: Moved to...
* config/pdp11/pdp11.cc: ...here.
* config/pru/pru-passes.c: Moved to...
* config/pru/pru-passes.cc: ...here.
* config/pru/pru-pragma.c: Moved to...
* config/pru/pru-pragma.cc: ...here.
* config/pru/pru.c: Moved to...
* config/pru/pru.cc: ...here.
* config/riscv/riscv-builtins.c: Moved to...
* config/riscv/riscv-builtins.cc: ...here.
* config/riscv/riscv-c.c: Moved to...
* config/riscv/riscv-c.cc: ...here.
* config/riscv/riscv-d.c: Moved to...
* config/riscv/riscv-d.cc: ...here.
* config/riscv/riscv-shorten-memrefs.c: Moved to...
* config/riscv/riscv-shorten-memrefs.cc: ...here.
* config/riscv/riscv-sr.c: Moved to...
* config/riscv/riscv-sr.cc: ...here.
* config/riscv/riscv.c: Moved to...
* config/riscv/riscv.cc: ...here.
* config/rl78/rl78-c.c: Moved to...
* config/rl78/rl78-c.cc: ...here.
* config/rl78/rl78.c: Moved to...
* config/rl78/rl78.cc: ...here.
* config/rs6000/driver-rs6000.c: Moved to...
* config/rs6000/driver-rs6000.cc: ...here.
* config/rs6000/host-darwin.c: Moved to...
* config/rs6000/host-darwin.cc: ...here.
* config/rs6000/host-ppc64-darwin.c: Moved to...
* config/rs6000/host-ppc64-darwin.cc: ...here.
* config/rs6000/rbtree.c: Moved to...
* config/rs6000/rbtree.cc: ...here.
* config/rs6000/rs6000-c.c: Moved to...
* config/rs6000/rs6000-c.cc: ...here.
* config/rs6000/rs6000-call.c: Moved to...
* config/rs6000/rs6000-call.cc: ...here.
* config/rs6000/rs6000-d.c: Moved to...
* config/rs6000/rs6000-d.cc: ...here.
* config/rs6000/rs6000-gen-builtins.c: Moved to...
* config/rs6000/rs6000-gen-builtins.cc: ...here.
* config/rs6000/rs6000-linux.c: Moved to...
* config/rs6000/rs6000-linux.cc: ...here.
* config/rs6000/rs6000-logue.c: Moved to...
* config/rs6000/rs6000-logue.cc: ...here.
* config/rs6000/rs6000-p8swap.c: Moved to...
* config/rs6000/rs6000-p8swap.cc: ...here.
* config/rs6000/rs6000-pcrel-opt.c: Moved to...
* config/rs6000/rs6000-pcrel-opt.cc: ...here.
* config/rs6000/rs6000-string.c: Moved to...
* config/rs6000/rs6000-string.cc: ...here.
* config/rs6000/rs6000.c: Moved to...
* config/rs6000/rs6000.cc: ...here.
* config/rx/rx.c: Moved to...
* config/rx/rx.cc: ...here.
* config/s390/driver-native.c: Moved to...
* config/s390/driver-native.cc: ...here.
* config/s390/s390-c.c: Moved to...
* config/s390/s390-c.cc: ...here.
* config/s390/s390-d.c: Moved to...
* config/s390/s390-d.cc: ...here.
* config/s390/s390.c: Moved to...
* config/s390/s390.cc: ...here.
* config/sh/divtab-sh4-300.c: Moved to...
* config/sh/divtab-sh4-300.cc: ...here.
* config/sh/divtab-sh4.c: Moved to...
* config/sh/divtab-sh4.cc: ...here.
* config/sh/divtab.c: Moved to...
* config/sh/divtab.cc: ...here.
* config/sh/sh-c.c: Moved to...
* config/sh/sh-c.cc: ...here.
* config/sh/sh.c: Moved to...
* config/sh/sh.cc: ...here.
* config/sol2-c.c: Moved to...
* config/sol2-c.cc: ...here.
* config/sol2-cxx.c: Moved to...
* config/sol2-cxx.cc: ...here.
* config/sol2-d.c: Moved to...
* config/sol2-d.cc: ...here.
* config/sol2-stubs.c: Moved to...
* config/sol2-stubs.cc: ...here.
* config/sol2.c: Moved to...
* config/sol2.cc: ...here.
* config/sparc/driver-sparc.c: Moved to...
* config/sparc/driver-sparc.cc: ...here.
* config/sparc/sparc-c.c: Moved to...
* config/sparc/sparc-c.cc: ...here.
* config/sparc/sparc-d.c: Moved to...
* config/sparc/sparc-d.cc: ...here.
* config/sparc/sparc.c: Moved to...
* config/sparc/sparc.cc: ...here.
* config/stormy16/stormy16.c: Moved to...
* config/stormy16/stormy16.cc: ...here.
* config/tilegx/mul-tables.c: Moved to...
* config/tilegx/mul-tables.cc: ...here.
* config/tilegx/tilegx-c.c: Moved to...
* config/tilegx/tilegx-c.cc: ...here.
* config/tilegx/tilegx.c: Moved to...
* config/tilegx/tilegx.cc: ...here.
* config/tilepro/mul-tables.c: Moved to...
* config/tilepro/mul-tables.cc: ...here.
* config/tilepro/tilepro-c.c: Moved to...
* config/tilepro/tilepro-c.cc: ...here.
* config/tilepro/tilepro.c: Moved to...
* config/tilepro/tilepro.cc: ...here.
* config/v850/v850-c.c: Moved to...
* config/v850/v850-c.cc: ...here.
* config/v850/v850.c: Moved to...
* config/v850/v850.cc: ...here.
* config/vax/vax.c: Moved to...
* config/vax/vax.cc: ...here.
* config/visium/visium.c: Moved to...
* config/visium/visium.cc: ...here.
* config/vms/vms-c.c: Moved to...
* config/vms/vms-c.cc: ...here.
* config/vms/vms-f.c: Moved to...
* config/vms/vms-f.cc: ...here.
* config/vms/vms.c: Moved to...
* config/vms/vms.cc: ...here.
* config/vxworks-c.c: Moved to...
* config/vxworks-c.cc: ...here.
* config/vxworks.c: Moved to...
* config/vxworks.cc: ...here.
* config/winnt-c.c: Moved to...
* config/winnt-c.cc: ...here.
* config/xtensa/xtensa.c: Moved to...
* config/xtensa/xtensa.cc: ...here.
* context.c: Moved to...
* context.cc: ...here.
* convert.c: Moved to...
* convert.cc: ...here.
* coverage.c: Moved to...
* coverage.cc: ...here.
* cppbuiltin.c: Moved to...
* cppbuiltin.cc: ...here.
* cppdefault.c: Moved to...
* cppdefault.cc: ...here.
* cprop.c: Moved to...
* cprop.cc: ...here.
* cse.c: Moved to...
* cse.cc: ...here.
* cselib.c: Moved to...
* cselib.cc: ...here.
* ctfc.c: Moved to...
* ctfc.cc: ...here.
* ctfout.c: Moved to...
* ctfout.cc: ...here.
* data-streamer-in.c: Moved to...
* data-streamer-in.cc: ...here.
* data-streamer-out.c: Moved to...
* data-streamer-out.cc: ...here.
* data-streamer.c: Moved to...
* data-streamer.cc: ...here.
* dbgcnt.c: Moved to...
* dbgcnt.cc: ...here.
* dbxout.c: Moved to...
* dbxout.cc: ...here.
* dce.c: Moved to...
* dce.cc: ...here.
* ddg.c: Moved to...
* ddg.cc: ...here.
* debug.c: Moved to...
* debug.cc: ...here.
* df-core.c: Moved to...
* df-core.cc: ...here.
* df-problems.c: Moved to...
* df-problems.cc: ...here.
* df-scan.c: Moved to...
* df-scan.cc: ...here.
* dfp.c: Moved to...
* dfp.cc: ...here.
* diagnostic-color.c: Moved to...
* diagnostic-color.cc: ...here.
* diagnostic-show-locus.c: Moved to...
* diagnostic-show-locus.cc: ...here.
* diagnostic-spec.c: Moved to...
* diagnostic-spec.cc: ...here.
* diagnostic.c: Moved to...
* diagnostic.cc: ...here.
* dojump.c: Moved to...
* dojump.cc: ...here.
* dominance.c: Moved to...
* dominance.cc: ...here.
* domwalk.c: Moved to...
* domwalk.cc: ...here.
* double-int.c: Moved to...
* double-int.cc: ...here.
* dse.c: Moved to...
* dse.cc: ...here.
* dumpfile.c: Moved to...
* dumpfile.cc: ...here.
* dwarf2asm.c: Moved to...
* dwarf2asm.cc: ...here.
* dwarf2cfi.c: Moved to...
* dwarf2cfi.cc: ...here.
* dwarf2ctf.c: Moved to...
* dwarf2ctf.cc: ...here.
* dwarf2out.c: Moved to...
* dwarf2out.cc: ...here.
* early-remat.c: Moved to...
* early-remat.cc: ...here.
* edit-context.c: Moved to...
* edit-context.cc: ...here.
* emit-rtl.c: Moved to...
* emit-rtl.cc: ...here.
* errors.c: Moved to...
* errors.cc: ...here.
* et-forest.c: Moved to...
* et-forest.cc: ...here.
* except.c: Moved to...
* except.cc: ...here.
* explow.c: Moved to...
* explow.cc: ...here.
* expmed.c: Moved to...
* expmed.cc: ...here.
* expr.c: Moved to...
* expr.cc: ...here.
* fibonacci_heap.c: Moved to...
* fibonacci_heap.cc: ...here.
* file-find.c: Moved to...
* file-find.cc: ...here.
* file-prefix-map.c: Moved to...
* file-prefix-map.cc: ...here.
* final.c: Moved to...
* final.cc: ...here.
* fixed-value.c: Moved to...
* fixed-value.cc: ...here.
* fold-const-call.c: Moved to...
* fold-const-call.cc: ...here.
* fold-const.c: Moved to...
* fold-const.cc: ...here.
* fp-test.c: Moved to...
* fp-test.cc: ...here.
* function-tests.c: Moved to...
* function-tests.cc: ...here.
* function.c: Moved to...
* function.cc: ...here.
* fwprop.c: Moved to...
* fwprop.cc: ...here.
* gcc-ar.c: Moved to...
* gcc-ar.cc: ...here.
* gcc-main.c: Moved to...
* gcc-main.cc: ...here.
* gcc-rich-location.c: Moved to...
* gcc-rich-location.cc: ...here.
* gcc.c: Moved to...
* gcc.cc: ...here.
* gcov-dump.c: Moved to...
* gcov-dump.cc: ...here.
* gcov-io.c: Moved to...
* gcov-io.cc: ...here.
* gcov-tool.c: Moved to...
* gcov-tool.cc: ...here.
* gcov.c: Moved to...
* gcov.cc: ...here.
* gcse-common.c: Moved to...
* gcse-common.cc: ...here.
* gcse.c: Moved to...
* gcse.cc: ...here.
* genattr-common.c: Moved to...
* genattr-common.cc: ...here.
* genattr.c: Moved to...
* genattr.cc: ...here.
* genattrtab.c: Moved to...
* genattrtab.cc: ...here.
* genautomata.c: Moved to...
* genautomata.cc: ...here.
* gencfn-macros.c: Moved to...
* gencfn-macros.cc: ...here.
* gencheck.c: Moved to...
* gencheck.cc: ...here.
* genchecksum.c: Moved to...
* genchecksum.cc: ...here.
* gencodes.c: Moved to...
* gencodes.cc: ...here.
* genconditions.c: Moved to...
* genconditions.cc: ...here.
* genconfig.c: Moved to...
* genconfig.cc: ...here.
* genconstants.c: Moved to...
* genconstants.cc: ...here.
* genemit.c: Moved to...
* genemit.cc: ...here.
* genenums.c: Moved to...
* genenums.cc: ...here.
* generic-match-head.c: Moved to...
* generic-match-head.cc: ...here.
* genextract.c: Moved to...
* genextract.cc: ...here.
* genflags.c: Moved to...
* genflags.cc: ...here.
* gengenrtl.c: Moved to...
* gengenrtl.cc: ...here.
* gengtype-parse.c: Moved to...
* gengtype-parse.cc: ...here.
* gengtype-state.c: Moved to...
* gengtype-state.cc: ...here.
* gengtype.c: Moved to...
* gengtype.cc: ...here.
* genhooks.c: Moved to...
* genhooks.cc: ...here.
* genmatch.c: Moved to...
* genmatch.cc: ...here.
* genmddeps.c: Moved to...
* genmddeps.cc: ...here.
* genmddump.c: Moved to...
* genmddump.cc: ...here.
* genmodes.c: Moved to...
* genmodes.cc: ...here.
* genopinit.c: Moved to...
* genopinit.cc: ...here.
* genoutput.c: Moved to...
* genoutput.cc: ...here.
* genpeep.c: Moved to...
* genpeep.cc: ...here.
* genpreds.c: Moved to...
* genpreds.cc: ...here.
* genrecog.c: Moved to...
* genrecog.cc: ...here.
* gensupport.c: Moved to...
* gensupport.cc: ...here.
* gentarget-def.c: Moved to...
* gentarget-def.cc: ...here.
* genversion.c: Moved to...
* genversion.cc: ...here.
* ggc-common.c: Moved to...
* ggc-common.cc: ...here.
* ggc-none.c: Moved to...
* ggc-none.cc: ...here.
* ggc-page.c: Moved to...
* ggc-page.cc: ...here.
* ggc-tests.c: Moved to...
* ggc-tests.cc: ...here.
* gimple-builder.c: Moved to...
* gimple-builder.cc: ...here.
* gimple-expr.c: Moved to...
* gimple-expr.cc: ...here.
* gimple-fold.c: Moved to...
* gimple-fold.cc: ...here.
* gimple-iterator.c: Moved to...
* gimple-iterator.cc: ...here.
* gimple-laddress.c: Moved to...
* gimple-laddress.cc: ...here.
* gimple-loop-jam.c: Moved to...
* gimple-loop-jam.cc: ...here.
* gimple-low.c: Moved to...
* gimple-low.cc: ...here.
* gimple-match-head.c: Moved to...
* gimple-match-head.cc: ...here.
* gimple-pretty-print.c: Moved to...
* gimple-pretty-print.cc: ...here.
* gimple-ssa-backprop.c: Moved to...
* gimple-ssa-backprop.cc: ...here.
* gimple-ssa-evrp-analyze.c: Moved to...
* gimple-ssa-evrp-analyze.cc: ...here.
* gimple-ssa-evrp.c: Moved to...
* gimple-ssa-evrp.cc: ...here.
* gimple-ssa-isolate-paths.c: Moved to...
* gimple-ssa-isolate-paths.cc: ...here.
* gimple-ssa-nonnull-compare.c: Moved to...
* gimple-ssa-nonnull-compare.cc: ...here.
* gimple-ssa-split-paths.c: Moved to...
* gimple-ssa-split-paths.cc: ...here.
* gimple-ssa-sprintf.c: Moved to...
* gimple-ssa-sprintf.cc: ...here.
* gimple-ssa-store-merging.c: Moved to...
* gimple-ssa-store-merging.cc: ...here.
* gimple-ssa-strength-reduction.c: Moved to...
* gimple-ssa-strength-reduction.cc: ...here.
* gimple-ssa-warn-alloca.c: Moved to...
* gimple-ssa-warn-alloca.cc: ...here.
* gimple-ssa-warn-restrict.c: Moved to...
* gimple-ssa-warn-restrict.cc: ...here.
* gimple-streamer-in.c: Moved to...
* gimple-streamer-in.cc: ...here.
* gimple-streamer-out.c: Moved to...
* gimple-streamer-out.cc: ...here.
* gimple-walk.c: Moved to...
* gimple-walk.cc: ...here.
* gimple-warn-recursion.c: Moved to...
* gimple-warn-recursion.cc: ...here.
* gimple.c: Moved to...
* gimple.cc: ...here.
* gimplify-me.c: Moved to...
* gimplify-me.cc: ...here.
* gimplify.c: Moved to...
* gimplify.cc: ...here.
* godump.c: Moved to...
* godump.cc: ...here.
* graph.c: Moved to...
* graph.cc: ...here.
* graphds.c: Moved to...
* graphds.cc: ...here.
* graphite-dependences.c: Moved to...
* graphite-dependences.cc: ...here.
* graphite-isl-ast-to-gimple.c: Moved to...
* graphite-isl-ast-to-gimple.cc: ...here.
* graphite-optimize-isl.c: Moved to...
* graphite-optimize-isl.cc: ...here.
* graphite-poly.c: Moved to...
* graphite-poly.cc: ...here.
* graphite-scop-detection.c: Moved to...
* graphite-scop-detection.cc: ...here.
* graphite-sese-to-poly.c: Moved to...
* graphite-sese-to-poly.cc: ...here.
* graphite.c: Moved to...
* graphite.cc: ...here.
* haifa-sched.c: Moved to...
* haifa-sched.cc: ...here.
* hash-map-tests.c: Moved to...
* hash-map-tests.cc: ...here.
* hash-set-tests.c: Moved to...
* hash-set-tests.cc: ...here.
* hash-table.c: Moved to...
* hash-table.cc: ...here.
* hooks.c: Moved to...
* hooks.cc: ...here.
* host-default.c: Moved to...
* host-default.cc: ...here.
* hw-doloop.c: Moved to...
* hw-doloop.cc: ...here.
* hwint.c: Moved to...
* hwint.cc: ...here.
* ifcvt.c: Moved to...
* ifcvt.cc: ...here.
* inchash.c: Moved to...
* inchash.cc: ...here.
* incpath.c: Moved to...
* incpath.cc: ...here.
* init-regs.c: Moved to...
* init-regs.cc: ...here.
* input.c: Moved to...
* input.cc: ...here.
* internal-fn.c: Moved to...
* internal-fn.cc: ...here.
* intl.c: Moved to...
* intl.cc: ...here.
* ipa-comdats.c: Moved to...
* ipa-comdats.cc: ...here.
* ipa-cp.c: Moved to...
* ipa-cp.cc: ...here.
* ipa-devirt.c: Moved to...
* ipa-devirt.cc: ...here.
* ipa-fnsummary.c: Moved to...
* ipa-fnsummary.cc: ...here.
* ipa-icf-gimple.c: Moved to...
* ipa-icf-gimple.cc: ...here.
* ipa-icf.c: Moved to...
* ipa-icf.cc: ...here.
* ipa-inline-analysis.c: Moved to...
* ipa-inline-analysis.cc: ...here.
* ipa-inline-transform.c: Moved to...
* ipa-inline-transform.cc: ...here.
* ipa-inline.c: Moved to...
* ipa-inline.cc: ...here.
* ipa-modref-tree.c: Moved to...
* ipa-modref-tree.cc: ...here.
* ipa-modref.c: Moved to...
* ipa-modref.cc: ...here.
* ipa-param-manipulation.c: Moved to...
* ipa-param-manipulation.cc: ...here.
* ipa-polymorphic-call.c: Moved to...
* ipa-polymorphic-call.cc: ...here.
* ipa-predicate.c: Moved to...
* ipa-predicate.cc: ...here.
* ipa-profile.c: Moved to...
* ipa-profile.cc: ...here.
* ipa-prop.c: Moved to...
* ipa-prop.cc: ...here.
* ipa-pure-const.c: Moved to...
* ipa-pure-const.cc: ...here.
* ipa-ref.c: Moved to...
* ipa-ref.cc: ...here.
* ipa-reference.c: Moved to...
* ipa-reference.cc: ...here.
* ipa-split.c: Moved to...
* ipa-split.cc: ...here.
* ipa-sra.c: Moved to...
* ipa-sra.cc: ...here.
* ipa-utils.c: Moved to...
* ipa-utils.cc: ...here.
* ipa-visibility.c: Moved to...
* ipa-visibility.cc: ...here.
* ipa.c: Moved to...
* ipa.cc: ...here.
* ira-build.c: Moved to...
* ira-build.cc: ...here.
* ira-color.c: Moved to...
* ira-color.cc: ...here.
* ira-conflicts.c: Moved to...
* ira-conflicts.cc: ...here.
* ira-costs.c: Moved to...
* ira-costs.cc: ...here.
* ira-emit.c: Moved to...
* ira-emit.cc: ...here.
* ira-lives.c: Moved to...
* ira-lives.cc: ...here.
* ira.c: Moved to...
* ira.cc: ...here.
* jump.c: Moved to...
* jump.cc: ...here.
* langhooks.c: Moved to...
* langhooks.cc: ...here.
* lcm.c: Moved to...
* lcm.cc: ...here.
* lists.c: Moved to...
* lists.cc: ...here.
* loop-doloop.c: Moved to...
* loop-doloop.cc: ...here.
* loop-init.c: Moved to...
* loop-init.cc: ...here.
* loop-invariant.c: Moved to...
* loop-invariant.cc: ...here.
* loop-iv.c: Moved to...
* loop-iv.cc: ...here.
* loop-unroll.c: Moved to...
* loop-unroll.cc: ...here.
* lower-subreg.c: Moved to...
* lower-subreg.cc: ...here.
* lra-assigns.c: Moved to...
* lra-assigns.cc: ...here.
* lra-coalesce.c: Moved to...
* lra-coalesce.cc: ...here.
* lra-constraints.c: Moved to...
* lra-constraints.cc: ...here.
* lra-eliminations.c: Moved to...
* lra-eliminations.cc: ...here.
* lra-lives.c: Moved to...
* lra-lives.cc: ...here.
* lra-remat.c: Moved to...
* lra-remat.cc: ...here.
* lra-spills.c: Moved to...
* lra-spills.cc: ...here.
* lra.c: Moved to...
* lra.cc: ...here.
* lto-cgraph.c: Moved to...
* lto-cgraph.cc: ...here.
* lto-compress.c: Moved to...
* lto-compress.cc: ...here.
* lto-opts.c: Moved to...
* lto-opts.cc: ...here.
* lto-section-in.c: Moved to...
* lto-section-in.cc: ...here.
* lto-section-out.c: Moved to...
* lto-section-out.cc: ...here.
* lto-streamer-in.c: Moved to...
* lto-streamer-in.cc: ...here.
* lto-streamer-out.c: Moved to...
* lto-streamer-out.cc: ...here.
* lto-streamer.c: Moved to...
* lto-streamer.cc: ...here.
* lto-wrapper.c: Moved to...
* lto-wrapper.cc: ...here.
* main.c: Moved to...
* main.cc: ...here.
* mcf.c: Moved to...
* mcf.cc: ...here.
* mode-switching.c: Moved to...
* mode-switching.cc: ...here.
* modulo-sched.c: Moved to...
* modulo-sched.cc: ...here.
* multiple_target.c: Moved to...
* multiple_target.cc: ...here.
* omp-expand.c: Moved to...
* omp-expand.cc: ...here.
* omp-general.c: Moved to...
* omp-general.cc: ...here.
* omp-low.c: Moved to...
* omp-low.cc: ...here.
* omp-offload.c: Moved to...
* omp-offload.cc: ...here.
* omp-simd-clone.c: Moved to...
* omp-simd-clone.cc: ...here.
* opt-suggestions.c: Moved to...
* opt-suggestions.cc: ...here.
* optabs-libfuncs.c: Moved to...
* optabs-libfuncs.cc: ...here.
* optabs-query.c: Moved to...
* optabs-query.cc: ...here.
* optabs-tree.c: Moved to...
* optabs-tree.cc: ...here.
* optabs.c: Moved to...
* optabs.cc: ...here.
* opts-common.c: Moved to...
* opts-common.cc: ...here.
* opts-global.c: Moved to...
* opts-global.cc: ...here.
* opts.c: Moved to...
* opts.cc: ...here.
* passes.c: Moved to...
* passes.cc: ...here.
* plugin.c: Moved to...
* plugin.cc: ...here.
* postreload-gcse.c: Moved to...
* postreload-gcse.cc: ...here.
* postreload.c: Moved to...
* postreload.cc: ...here.
* predict.c: Moved to...
* predict.cc: ...here.
* prefix.c: Moved to...
* prefix.cc: ...here.
* pretty-print.c: Moved to...
* pretty-print.cc: ...here.
* print-rtl-function.c: Moved to...
* print-rtl-function.cc: ...here.
* print-rtl.c: Moved to...
* print-rtl.cc: ...here.
* print-tree.c: Moved to...
* print-tree.cc: ...here.
* profile-count.c: Moved to...
* profile-count.cc: ...here.
* profile.c: Moved to...
* profile.cc: ...here.
* read-md.c: Moved to...
* read-md.cc: ...here.
* read-rtl-function.c: Moved to...
* read-rtl-function.cc: ...here.
* read-rtl.c: Moved to...
* read-rtl.cc: ...here.
* real.c: Moved to...
* real.cc: ...here.
* realmpfr.c: Moved to...
* realmpfr.cc: ...here.
* recog.c: Moved to...
* recog.cc: ...here.
* ree.c: Moved to...
* ree.cc: ...here.
* reg-stack.c: Moved to...
* reg-stack.cc: ...here.
* regcprop.c: Moved to...
* regcprop.cc: ...here.
* reginfo.c: Moved to...
* reginfo.cc: ...here.
* regrename.c: Moved to...
* regrename.cc: ...here.
* regstat.c: Moved to...
* regstat.cc: ...here.
* reload.c: Moved to...
* reload.cc: ...here.
* reload1.c: Moved to...
* reload1.cc: ...here.
* reorg.c: Moved to...
* reorg.cc: ...here.
* resource.c: Moved to...
* resource.cc: ...here.
* rtl-error.c: Moved to...
* rtl-error.cc: ...here.
* rtl-tests.c: Moved to...
* rtl-tests.cc: ...here.
* rtl.c: Moved to...
* rtl.cc: ...here.
* rtlanal.c: Moved to...
* rtlanal.cc: ...here.
* rtlhash.c: Moved to...
* rtlhash.cc: ...here.
* rtlhooks.c: Moved to...
* rtlhooks.cc: ...here.
* rtx-vector-builder.c: Moved to...
* rtx-vector-builder.cc: ...here.
* run-rtl-passes.c: Moved to...
* run-rtl-passes.cc: ...here.
* sancov.c: Moved to...
* sancov.cc: ...here.
* sanopt.c: Moved to...
* sanopt.cc: ...here.
* sbitmap.c: Moved to...
* sbitmap.cc: ...here.
* sched-deps.c: Moved to...
* sched-deps.cc: ...here.
* sched-ebb.c: Moved to...
* sched-ebb.cc: ...here.
* sched-rgn.c: Moved to...
* sched-rgn.cc: ...here.
* sel-sched-dump.c: Moved to...
* sel-sched-dump.cc: ...here.
* sel-sched-ir.c: Moved to...
* sel-sched-ir.cc: ...here.
* sel-sched.c: Moved to...
* sel-sched.cc: ...here.
* selftest-diagnostic.c: Moved to...
* selftest-diagnostic.cc: ...here.
* selftest-rtl.c: Moved to...
* selftest-rtl.cc: ...here.
* selftest-run-tests.c: Moved to...
* selftest-run-tests.cc: ...here.
* selftest.c: Moved to...
* selftest.cc: ...here.
* sese.c: Moved to...
* sese.cc: ...here.
* shrink-wrap.c: Moved to...
* shrink-wrap.cc: ...here.
* simplify-rtx.c: Moved to...
* simplify-rtx.cc: ...here.
* sparseset.c: Moved to...
* sparseset.cc: ...here.
* spellcheck-tree.c: Moved to...
* spellcheck-tree.cc: ...here.
* spellcheck.c: Moved to...
* spellcheck.cc: ...here.
* sreal.c: Moved to...
* sreal.cc: ...here.
* stack-ptr-mod.c: Moved to...
* stack-ptr-mod.cc: ...here.
* statistics.c: Moved to...
* statistics.cc: ...here.
* stmt.c: Moved to...
* stmt.cc: ...here.
* stor-layout.c: Moved to...
* stor-layout.cc: ...here.
* store-motion.c: Moved to...
* store-motion.cc: ...here.
* streamer-hooks.c: Moved to...
* streamer-hooks.cc: ...here.
* stringpool.c: Moved to...
* stringpool.cc: ...here.
* substring-locations.c: Moved to...
* substring-locations.cc: ...here.
* symtab.c: Moved to...
* symtab.cc: ...here.
* target-globals.c: Moved to...
* target-globals.cc: ...here.
* targhooks.c: Moved to...
* targhooks.cc: ...here.
* timevar.c: Moved to...
* timevar.cc: ...here.
* toplev.c: Moved to...
* toplev.cc: ...here.
* tracer.c: Moved to...
* tracer.cc: ...here.
* trans-mem.c: Moved to...
* trans-mem.cc: ...here.
* tree-affine.c: Moved to...
* tree-affine.cc: ...here.
* tree-call-cdce.c: Moved to...
* tree-call-cdce.cc: ...here.
* tree-cfg.c: Moved to...
* tree-cfg.cc: ...here.
* tree-cfgcleanup.c: Moved to...
* tree-cfgcleanup.cc: ...here.
* tree-chrec.c: Moved to...
* tree-chrec.cc: ...here.
* tree-complex.c: Moved to...
* tree-complex.cc: ...here.
* tree-data-ref.c: Moved to...
* tree-data-ref.cc: ...here.
* tree-dfa.c: Moved to...
* tree-dfa.cc: ...here.
* tree-diagnostic.c: Moved to...
* tree-diagnostic.cc: ...here.
* tree-dump.c: Moved to...
* tree-dump.cc: ...here.
* tree-eh.c: Moved to...
* tree-eh.cc: ...here.
* tree-emutls.c: Moved to...
* tree-emutls.cc: ...here.
* tree-if-conv.c: Moved to...
* tree-if-conv.cc: ...here.
* tree-inline.c: Moved to...
* tree-inline.cc: ...here.
* tree-into-ssa.c: Moved to...
* tree-into-ssa.cc: ...here.
* tree-iterator.c: Moved to...
* tree-iterator.cc: ...here.
* tree-loop-distribution.c: Moved to...
* tree-loop-distribution.cc: ...here.
* tree-nested.c: Moved to...
* tree-nested.cc: ...here.
* tree-nrv.c: Moved to...
* tree-nrv.cc: ...here.
* tree-object-size.c: Moved to...
* tree-object-size.cc: ...here.
* tree-outof-ssa.c: Moved to...
* tree-outof-ssa.cc: ...here.
* tree-parloops.c: Moved to...
* tree-parloops.cc: ...here.
* tree-phinodes.c: Moved to...
* tree-phinodes.cc: ...here.
* tree-predcom.c: Moved to...
* tree-predcom.cc: ...here.
* tree-pretty-print.c: Moved to...
* tree-pretty-print.cc: ...here.
* tree-profile.c: Moved to...
* tree-profile.cc: ...here.
* tree-scalar-evolution.c: Moved to...
* tree-scalar-evolution.cc: ...here.
* tree-sra.c: Moved to...
* tree-sra.cc: ...here.
* tree-ssa-address.c: Moved to...
* tree-ssa-address.cc: ...here.
* tree-ssa-alias.c: Moved to...
* tree-ssa-alias.cc: ...here.
* tree-ssa-ccp.c: Moved to...
* tree-ssa-ccp.cc: ...here.
* tree-ssa-coalesce.c: Moved to...
* tree-ssa-coalesce.cc: ...here.
* tree-ssa-copy.c: Moved to...
* tree-ssa-copy.cc: ...here.
* tree-ssa-dce.c: Moved to...
* tree-ssa-dce.cc: ...here.
* tree-ssa-dom.c: Moved to...
* tree-ssa-dom.cc: ...here.
* tree-ssa-dse.c: Moved to...
* tree-ssa-dse.cc: ...here.
* tree-ssa-forwprop.c: Moved to...
* tree-ssa-forwprop.cc: ...here.
* tree-ssa-ifcombine.c: Moved to...
* tree-ssa-ifcombine.cc: ...here.
* tree-ssa-live.c: Moved to...
* tree-ssa-live.cc: ...here.
* tree-ssa-loop-ch.c: Moved to...
* tree-ssa-loop-ch.cc: ...here.
* tree-ssa-loop-im.c: Moved to...
* tree-ssa-loop-im.cc: ...here.
* tree-ssa-loop-ivcanon.c: Moved to...
* tree-ssa-loop-ivcanon.cc: ...here.
* tree-ssa-loop-ivopts.c: Moved to...
* tree-ssa-loop-ivopts.cc: ...here.
* tree-ssa-loop-manip.c: Moved to...
* tree-ssa-loop-manip.cc: ...here.
* tree-ssa-loop-niter.c: Moved to...
* tree-ssa-loop-niter.cc: ...here.
* tree-ssa-loop-prefetch.c: Moved to...
* tree-ssa-loop-prefetch.cc: ...here.
* tree-ssa-loop-split.c: Moved to...
* tree-ssa-loop-split.cc: ...here.
* tree-ssa-loop-unswitch.c: Moved to...
* tree-ssa-loop-unswitch.cc: ...here.
* tree-ssa-loop.c: Moved to...
* tree-ssa-loop.cc: ...here.
* tree-ssa-math-opts.c: Moved to...
* tree-ssa-math-opts.cc: ...here.
* tree-ssa-operands.c: Moved to...
* tree-ssa-operands.cc: ...here.
* tree-ssa-phiopt.c: Moved to...
* tree-ssa-phiopt.cc: ...here.
* tree-ssa-phiprop.c: Moved to...
* tree-ssa-phiprop.cc: ...here.
* tree-ssa-pre.c: Moved to...
* tree-ssa-pre.cc: ...here.
* tree-ssa-propagate.c: Moved to...
* tree-ssa-propagate.cc: ...here.
* tree-ssa-reassoc.c: Moved to...
* tree-ssa-reassoc.cc: ...here.
* tree-ssa-sccvn.c: Moved to...
* tree-ssa-sccvn.cc: ...here.
* tree-ssa-scopedtables.c: Moved to...
* tree-ssa-scopedtables.cc: ...here.
* tree-ssa-sink.c: Moved to...
* tree-ssa-sink.cc: ...here.
* tree-ssa-strlen.c: Moved to...
* tree-ssa-strlen.cc: ...here.
* tree-ssa-structalias.c: Moved to...
* tree-ssa-structalias.cc: ...here.
* tree-ssa-tail-merge.c: Moved to...
* tree-ssa-tail-merge.cc: ...here.
* tree-ssa-ter.c: Moved to...
* tree-ssa-ter.cc: ...here.
* tree-ssa-threadbackward.c: Moved to...
* tree-ssa-threadbackward.cc: ...here.
* tree-ssa-threadedge.c: Moved to...
* tree-ssa-threadedge.cc: ...here.
* tree-ssa-threadupdate.c: Moved to...
* tree-ssa-threadupdate.cc: ...here.
* tree-ssa-uncprop.c: Moved to...
* tree-ssa-uncprop.cc: ...here.
* tree-ssa-uninit.c: Moved to...
* tree-ssa-uninit.cc: ...here.
* tree-ssa.c: Moved to...
* tree-ssa.cc: ...here.
* tree-ssanames.c: Moved to...
* tree-ssanames.cc: ...here.
* tree-stdarg.c: Moved to...
* tree-stdarg.cc: ...here.
* tree-streamer-in.c: Moved to...
* tree-streamer-in.cc: ...here.
* tree-streamer-out.c: Moved to...
* tree-streamer-out.cc: ...here.
* tree-streamer.c: Moved to...
* tree-streamer.cc: ...here.
* tree-switch-conversion.c: Moved to...
* tree-switch-conversion.cc: ...here.
* tree-tailcall.c: Moved to...
* tree-tailcall.cc: ...here.
* tree-vect-data-refs.c: Moved to...
* tree-vect-data-refs.cc: ...here.
* tree-vect-generic.c: Moved to...
* tree-vect-generic.cc: ...here.
* tree-vect-loop-manip.c: Moved to...
* tree-vect-loop-manip.cc: ...here.
* tree-vect-loop.c: Moved to...
* tree-vect-loop.cc: ...here.
* tree-vect-patterns.c: Moved to...
* tree-vect-patterns.cc: ...here.
* tree-vect-slp-patterns.c: Moved to...
* tree-vect-slp-patterns.cc: ...here.
* tree-vect-slp.c: Moved to...
* tree-vect-slp.cc: ...here.
* tree-vect-stmts.c: Moved to...
* tree-vect-stmts.cc: ...here.
* tree-vector-builder.c: Moved to...
* tree-vector-builder.cc: ...here.
* tree-vectorizer.c: Moved to...
* tree-vectorizer.cc: ...here.
* tree-vrp.c: Moved to...
* tree-vrp.cc: ...here.
* tree.c: Moved to...
* tree.cc: ...here.
* tsan.c: Moved to...
* tsan.cc: ...here.
* typed-splay-tree.c: Moved to...
* typed-splay-tree.cc: ...here.
* ubsan.c: Moved to...
* ubsan.cc: ...here.
* valtrack.c: Moved to...
* valtrack.cc: ...here.
* value-prof.c: Moved to...
* value-prof.cc: ...here.
* var-tracking.c: Moved to...
* var-tracking.cc: ...here.
* varasm.c: Moved to...
* varasm.cc: ...here.
* varpool.c: Moved to...
* varpool.cc: ...here.
* vec-perm-indices.c: Moved to...
* vec-perm-indices.cc: ...here.
* vec.c: Moved to...
* vec.cc: ...here.
* vmsdbgout.c: Moved to...
* vmsdbgout.cc: ...here.
* vr-values.c: Moved to...
* vr-values.cc: ...here.
* vtable-verify.c: Moved to...
* vtable-verify.cc: ...here.
* web.c: Moved to...
* web.cc: ...here.
* xcoffout.c: Moved to...
* xcoffout.cc: ...here.
gcc/c-family/ChangeLog:
* c-ada-spec.c: Moved to...
* c-ada-spec.cc: ...here.
* c-attribs.c: Moved to...
* c-attribs.cc: ...here.
* c-common.c: Moved to...
* c-common.cc: ...here.
* c-cppbuiltin.c: Moved to...
* c-cppbuiltin.cc: ...here.
* c-dump.c: Moved to...
* c-dump.cc: ...here.
* c-format.c: Moved to...
* c-format.cc: ...here.
* c-gimplify.c: Moved to...
* c-gimplify.cc: ...here.
* c-indentation.c: Moved to...
* c-indentation.cc: ...here.
* c-lex.c: Moved to...
* c-lex.cc: ...here.
* c-omp.c: Moved to...
* c-omp.cc: ...here.
* c-opts.c: Moved to...
* c-opts.cc: ...here.
* c-pch.c: Moved to...
* c-pch.cc: ...here.
* c-ppoutput.c: Moved to...
* c-ppoutput.cc: ...here.
* c-pragma.c: Moved to...
* c-pragma.cc: ...here.
* c-pretty-print.c: Moved to...
* c-pretty-print.cc: ...here.
* c-semantics.c: Moved to...
* c-semantics.cc: ...here.
* c-ubsan.c: Moved to...
* c-ubsan.cc: ...here.
* c-warn.c: Moved to...
* c-warn.cc: ...here.
* cppspec.c: Moved to...
* cppspec.cc: ...here.
* stub-objc.c: Moved to...
* stub-objc.cc: ...here.
gcc/c/ChangeLog:
* c-aux-info.c: Moved to...
* c-aux-info.cc: ...here.
* c-convert.c: Moved to...
* c-convert.cc: ...here.
* c-decl.c: Moved to...
* c-decl.cc: ...here.
* c-errors.c: Moved to...
* c-errors.cc: ...here.
* c-fold.c: Moved to...
* c-fold.cc: ...here.
* c-lang.c: Moved to...
* c-lang.cc: ...here.
* c-objc-common.c: Moved to...
* c-objc-common.cc: ...here.
* c-parser.c: Moved to...
* c-parser.cc: ...here.
* c-typeck.c: Moved to...
* c-typeck.cc: ...here.
* gccspec.c: Moved to...
* gccspec.cc: ...here.
* gimple-parser.c: Moved to...
* gimple-parser.cc: ...here.
gcc/cp/ChangeLog:
* call.c: Moved to...
* call.cc: ...here.
* class.c: Moved to...
* class.cc: ...here.
* constexpr.c: Moved to...
* constexpr.cc: ...here.
* cp-gimplify.c: Moved to...
* cp-gimplify.cc: ...here.
* cp-lang.c: Moved to...
* cp-lang.cc: ...here.
* cp-objcp-common.c: Moved to...
* cp-objcp-common.cc: ...here.
* cp-ubsan.c: Moved to...
* cp-ubsan.cc: ...here.
* cvt.c: Moved to...
* cvt.cc: ...here.
* cxx-pretty-print.c: Moved to...
* cxx-pretty-print.cc: ...here.
* decl.c: Moved to...
* decl.cc: ...here.
* decl2.c: Moved to...
* decl2.cc: ...here.
* dump.c: Moved to...
* dump.cc: ...here.
* error.c: Moved to...
* error.cc: ...here.
* except.c: Moved to...
* except.cc: ...here.
* expr.c: Moved to...
* expr.cc: ...here.
* friend.c: Moved to...
* friend.cc: ...here.
* g++spec.c: Moved to...
* g++spec.cc: ...here.
* init.c: Moved to...
* init.cc: ...here.
* lambda.c: Moved to...
* lambda.cc: ...here.
* lex.c: Moved to...
* lex.cc: ...here.
* mangle.c: Moved to...
* mangle.cc: ...here.
* method.c: Moved to...
* method.cc: ...here.
* name-lookup.c: Moved to...
* name-lookup.cc: ...here.
* optimize.c: Moved to...
* optimize.cc: ...here.
* parser.c: Moved to...
* parser.cc: ...here.
* pt.c: Moved to...
* pt.cc: ...here.
* ptree.c: Moved to...
* ptree.cc: ...here.
* rtti.c: Moved to...
* rtti.cc: ...here.
* search.c: Moved to...
* search.cc: ...here.
* semantics.c: Moved to...
* semantics.cc: ...here.
* tree.c: Moved to...
* tree.cc: ...here.
* typeck.c: Moved to...
* typeck.cc: ...here.
* typeck2.c: Moved to...
* typeck2.cc: ...here.
* vtable-class-hierarchy.c: Moved to...
* vtable-class-hierarchy.cc: ...here.
gcc/fortran/ChangeLog:
* arith.c: Moved to...
* arith.cc: ...here.
* array.c: Moved to...
* array.cc: ...here.
* bbt.c: Moved to...
* bbt.cc: ...here.
* check.c: Moved to...
* check.cc: ...here.
* class.c: Moved to...
* class.cc: ...here.
* constructor.c: Moved to...
* constructor.cc: ...here.
* convert.c: Moved to...
* convert.cc: ...here.
* cpp.c: Moved to...
* cpp.cc: ...here.
* data.c: Moved to...
* data.cc: ...here.
* decl.c: Moved to...
* decl.cc: ...here.
* dependency.c: Moved to...
* dependency.cc: ...here.
* dump-parse-tree.c: Moved to...
* dump-parse-tree.cc: ...here.
* error.c: Moved to...
* error.cc: ...here.
* expr.c: Moved to...
* expr.cc: ...here.
* f95-lang.c: Moved to...
* f95-lang.cc: ...here.
* frontend-passes.c: Moved to...
* frontend-passes.cc: ...here.
* gfortranspec.c: Moved to...
* gfortranspec.cc: ...here.
* interface.c: Moved to...
* interface.cc: ...here.
* intrinsic.c: Moved to...
* intrinsic.cc: ...here.
* io.c: Moved to...
* io.cc: ...here.
* iresolve.c: Moved to...
* iresolve.cc: ...here.
* match.c: Moved to...
* match.cc: ...here.
* matchexp.c: Moved to...
* matchexp.cc: ...here.
* misc.c: Moved to...
* misc.cc: ...here.
* module.c: Moved to...
* module.cc: ...here.
* openmp.c: Moved to...
* openmp.cc: ...here.
* options.c: Moved to...
* options.cc: ...here.
* parse.c: Moved to...
* parse.cc: ...here.
* primary.c: Moved to...
* primary.cc: ...here.
* resolve.c: Moved to...
* resolve.cc: ...here.
* scanner.c: Moved to...
* scanner.cc: ...here.
* simplify.c: Moved to...
* simplify.cc: ...here.
* st.c: Moved to...
* st.cc: ...here.
* symbol.c: Moved to...
* symbol.cc: ...here.
* target-memory.c: Moved to...
* target-memory.cc: ...here.
* trans-array.c: Moved to...
* trans-array.cc: ...here.
* trans-common.c: Moved to...
* trans-common.cc: ...here.
* trans-const.c: Moved to...
* trans-const.cc: ...here.
* trans-decl.c: Moved to...
* trans-decl.cc: ...here.
* trans-expr.c: Moved to...
* trans-expr.cc: ...here.
* trans-intrinsic.c: Moved to...
* trans-intrinsic.cc: ...here.
* trans-io.c: Moved to...
* trans-io.cc: ...here.
* trans-openmp.c: Moved to...
* trans-openmp.cc: ...here.
* trans-stmt.c: Moved to...
* trans-stmt.cc: ...here.
* trans-types.c: Moved to...
* trans-types.cc: ...here.
* trans.c: Moved to...
* trans.cc: ...here.
gcc/go/ChangeLog:
* go-backend.c: Moved to...
* go-backend.cc: ...here.
* go-lang.c: Moved to...
* go-lang.cc: ...here.
* gospec.c: Moved to...
* gospec.cc: ...here.
gcc/jit/ChangeLog:
* dummy-frontend.c: Moved to...
* dummy-frontend.cc: ...here.
* jit-builtins.c: Moved to...
* jit-builtins.cc: ...here.
* jit-logging.c: Moved to...
* jit-logging.cc: ...here.
* jit-playback.c: Moved to...
* jit-playback.cc: ...here.
* jit-recording.c: Moved to...
* jit-recording.cc: ...here.
* jit-result.c: Moved to...
* jit-result.cc: ...here.
* jit-spec.c: Moved to...
* jit-spec.cc: ...here.
* jit-tempdir.c: Moved to...
* jit-tempdir.cc: ...here.
* jit-w32.c: Moved to...
* jit-w32.cc: ...here.
* libgccjit.c: Moved to...
* libgccjit.cc: ...here.
gcc/lto/ChangeLog:
* common.c: Moved to...
* common.cc: ...here.
* lto-common.c: Moved to...
* lto-common.cc: ...here.
* lto-dump.c: Moved to...
* lto-dump.cc: ...here.
* lto-lang.c: Moved to...
* lto-lang.cc: ...here.
* lto-object.c: Moved to...
* lto-object.cc: ...here.
* lto-partition.c: Moved to...
* lto-partition.cc: ...here.
* lto-symtab.c: Moved to...
* lto-symtab.cc: ...here.
* lto.c: Moved to...
* lto.cc: ...here.
gcc/objc/ChangeLog:
* objc-act.c: Moved to...
* objc-act.cc: ...here.
* objc-encoding.c: Moved to...
* objc-encoding.cc: ...here.
* objc-gnu-runtime-abi-01.c: Moved to...
* objc-gnu-runtime-abi-01.cc: ...here.
* objc-lang.c: Moved to...
* objc-lang.cc: ...here.
* objc-map.c: Moved to...
* objc-map.cc: ...here.
* objc-next-runtime-abi-01.c: Moved to...
* objc-next-runtime-abi-01.cc: ...here.
* objc-next-runtime-abi-02.c: Moved to...
* objc-next-runtime-abi-02.cc: ...here.
* objc-runtime-shared-support.c: Moved to...
* objc-runtime-shared-support.cc: ...here.
gcc/objcp/ChangeLog:
* objcp-decl.c: Moved to...
* objcp-decl.cc: ...here.
* objcp-lang.c: Moved to...
* objcp-lang.cc: ...here.
libcpp/ChangeLog:
* charset.c: Moved to...
* charset.cc: ...here.
* directives.c: Moved to...
* directives.cc: ...here.
* errors.c: Moved to...
* errors.cc: ...here.
* expr.c: Moved to...
* expr.cc: ...here.
* files.c: Moved to...
* files.cc: ...here.
* identifiers.c: Moved to...
* identifiers.cc: ...here.
* init.c: Moved to...
* init.cc: ...here.
* lex.c: Moved to...
* lex.cc: ...here.
* line-map.c: Moved to...
* line-map.cc: ...here.
* macro.c: Moved to...
* macro.cc: ...here.
* makeucnid.c: Moved to...
* makeucnid.cc: ...here.
* mkdeps.c: Moved to...
* mkdeps.cc: ...here.
* pch.c: Moved to...
* pch.cc: ...here.
* symtab.c: Moved to...
* symtab.cc: ...here.
* traditional.c: Moved to...
* traditional.cc: ...here.
Diffstat (limited to 'gcc/gimple.c')
-rw-r--r-- | gcc/gimple.c | 3525 |
1 files changed, 0 insertions, 3525 deletions
diff --git a/gcc/gimple.c b/gcc/gimple.c deleted file mode 100644 index 4c02df5..0000000 --- a/gcc/gimple.c +++ /dev/null @@ -1,3525 +0,0 @@ -/* Gimple IR support functions. - - Copyright (C) 2007-2022 Free Software Foundation, Inc. - Contributed by Aldy Hernandez <aldyh@redhat.com> - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 3, or (at your option) any later -version. - -GCC is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING3. If not see -<http://www.gnu.org/licenses/>. */ - -#include "config.h" -#include "system.h" -#include "coretypes.h" -#include "backend.h" -#include "tree.h" -#include "gimple.h" -#include "ssa.h" -#include "cgraph.h" -#include "diagnostic.h" -#include "alias.h" -#include "fold-const.h" -#include "calls.h" -#include "stor-layout.h" -#include "internal-fn.h" -#include "tree-eh.h" -#include "gimple-iterator.h" -#include "gimple-walk.h" -#include "gimplify.h" -#include "target.h" -#include "builtins.h" -#include "selftest.h" -#include "gimple-pretty-print.h" -#include "stringpool.h" -#include "attribs.h" -#include "asan.h" -#include "langhooks.h" -#include "attr-fnspec.h" -#include "ipa-modref-tree.h" -#include "ipa-modref.h" -#include "dbgcnt.h" - -/* All the tuples have their operand vector (if present) at the very bottom - of the structure. Therefore, the offset required to find the - operands vector the size of the structure minus the size of the 1 - element tree array at the end (see gimple_ops). */ -#define DEFGSSTRUCT(SYM, STRUCT, HAS_TREE_OP) \ - (HAS_TREE_OP ? sizeof (struct STRUCT) - sizeof (tree) : 0), -EXPORTED_CONST size_t gimple_ops_offset_[] = { -#include "gsstruct.def" -}; -#undef DEFGSSTRUCT - -#define DEFGSSTRUCT(SYM, STRUCT, HAS_TREE_OP) sizeof (struct STRUCT), -static const size_t gsstruct_code_size[] = { -#include "gsstruct.def" -}; -#undef DEFGSSTRUCT - -#define DEFGSCODE(SYM, NAME, GSSCODE) NAME, -const char *const gimple_code_name[] = { -#include "gimple.def" -}; -#undef DEFGSCODE - -#define DEFGSCODE(SYM, NAME, GSSCODE) GSSCODE, -EXPORTED_CONST enum gimple_statement_structure_enum gss_for_code_[] = { -#include "gimple.def" -}; -#undef DEFGSCODE - -/* Gimple stats. */ - -uint64_t gimple_alloc_counts[(int) gimple_alloc_kind_all]; -uint64_t gimple_alloc_sizes[(int) gimple_alloc_kind_all]; - -/* Keep in sync with gimple.h:enum gimple_alloc_kind. */ -static const char * const gimple_alloc_kind_names[] = { - "assignments", - "phi nodes", - "conditionals", - "everything else" -}; - -/* Static gimple tuple members. */ -const enum gimple_code gassign::code_; -const enum gimple_code gcall::code_; -const enum gimple_code gcond::code_; - - -/* Gimple tuple constructors. - Note: Any constructor taking a ``gimple_seq'' as a parameter, can - be passed a NULL to start with an empty sequence. */ - -/* Set the code for statement G to CODE. */ - -static inline void -gimple_set_code (gimple *g, enum gimple_code code) -{ - g->code = code; -} - -/* Return the number of bytes needed to hold a GIMPLE statement with - code CODE. */ - -size_t -gimple_size (enum gimple_code code, unsigned num_ops) -{ - size_t size = gsstruct_code_size[gss_for_code (code)]; - if (num_ops > 0) - size += (sizeof (tree) * (num_ops - 1)); - return size; -} - -/* Initialize GIMPLE statement G with CODE and NUM_OPS. */ - -void -gimple_init (gimple *g, enum gimple_code code, unsigned num_ops) -{ - gimple_set_code (g, code); - gimple_set_num_ops (g, num_ops); - - /* Do not call gimple_set_modified here as it has other side - effects and this tuple is still not completely built. */ - g->modified = 1; - gimple_init_singleton (g); -} - -/* Allocate memory for a GIMPLE statement with code CODE and NUM_OPS - operands. */ - -gimple * -gimple_alloc (enum gimple_code code, unsigned num_ops MEM_STAT_DECL) -{ - size_t size; - gimple *stmt; - - size = gimple_size (code, num_ops); - if (GATHER_STATISTICS) - { - enum gimple_alloc_kind kind = gimple_alloc_kind (code); - gimple_alloc_counts[(int) kind]++; - gimple_alloc_sizes[(int) kind] += size; - } - - stmt = ggc_alloc_cleared_gimple_statement_stat (size PASS_MEM_STAT); - gimple_init (stmt, code, num_ops); - return stmt; -} - -/* Set SUBCODE to be the code of the expression computed by statement G. */ - -static inline void -gimple_set_subcode (gimple *g, unsigned subcode) -{ - /* We only have 16 bits for the RHS code. Assert that we are not - overflowing it. */ - gcc_assert (subcode < (1 << 16)); - g->subcode = subcode; -} - - - -/* Build a tuple with operands. CODE is the statement to build (which - must be one of the GIMPLE_WITH_OPS tuples). SUBCODE is the subcode - for the new tuple. NUM_OPS is the number of operands to allocate. */ - -#define gimple_build_with_ops(c, s, n) \ - gimple_build_with_ops_stat (c, s, n MEM_STAT_INFO) - -static gimple * -gimple_build_with_ops_stat (enum gimple_code code, unsigned subcode, - unsigned num_ops MEM_STAT_DECL) -{ - gimple *s = gimple_alloc (code, num_ops PASS_MEM_STAT); - gimple_set_subcode (s, subcode); - - return s; -} - - -/* Build a GIMPLE_RETURN statement returning RETVAL. */ - -greturn * -gimple_build_return (tree retval) -{ - greturn *s - = as_a <greturn *> (gimple_build_with_ops (GIMPLE_RETURN, ERROR_MARK, - 2)); - if (retval) - gimple_return_set_retval (s, retval); - return s; -} - -/* Reset alias information on call S. */ - -void -gimple_call_reset_alias_info (gcall *s) -{ - if (gimple_call_flags (s) & ECF_CONST) - memset (gimple_call_use_set (s), 0, sizeof (struct pt_solution)); - else - pt_solution_reset (gimple_call_use_set (s)); - if (gimple_call_flags (s) & (ECF_CONST|ECF_PURE|ECF_NOVOPS)) - memset (gimple_call_clobber_set (s), 0, sizeof (struct pt_solution)); - else - pt_solution_reset (gimple_call_clobber_set (s)); -} - -/* Helper for gimple_build_call, gimple_build_call_valist, - gimple_build_call_vec and gimple_build_call_from_tree. Build the basic - components of a GIMPLE_CALL statement to function FN with NARGS - arguments. */ - -static inline gcall * -gimple_build_call_1 (tree fn, unsigned nargs) -{ - gcall *s - = as_a <gcall *> (gimple_build_with_ops (GIMPLE_CALL, ERROR_MARK, - nargs + 3)); - if (TREE_CODE (fn) == FUNCTION_DECL) - fn = build_fold_addr_expr (fn); - gimple_set_op (s, 1, fn); - gimple_call_set_fntype (s, TREE_TYPE (TREE_TYPE (fn))); - gimple_call_reset_alias_info (s); - return s; -} - - -/* Build a GIMPLE_CALL statement to function FN with the arguments - specified in vector ARGS. */ - -gcall * -gimple_build_call_vec (tree fn, const vec<tree> &args) -{ - unsigned i; - unsigned nargs = args.length (); - gcall *call = gimple_build_call_1 (fn, nargs); - - for (i = 0; i < nargs; i++) - gimple_call_set_arg (call, i, args[i]); - - return call; -} - - -/* Build a GIMPLE_CALL statement to function FN. NARGS is the number of - arguments. The ... are the arguments. */ - -gcall * -gimple_build_call (tree fn, unsigned nargs, ...) -{ - va_list ap; - gcall *call; - unsigned i; - - gcc_assert (TREE_CODE (fn) == FUNCTION_DECL || is_gimple_call_addr (fn)); - - call = gimple_build_call_1 (fn, nargs); - - va_start (ap, nargs); - for (i = 0; i < nargs; i++) - gimple_call_set_arg (call, i, va_arg (ap, tree)); - va_end (ap); - - return call; -} - - -/* Build a GIMPLE_CALL statement to function FN. NARGS is the number of - arguments. AP contains the arguments. */ - -gcall * -gimple_build_call_valist (tree fn, unsigned nargs, va_list ap) -{ - gcall *call; - unsigned i; - - gcc_assert (TREE_CODE (fn) == FUNCTION_DECL || is_gimple_call_addr (fn)); - - call = gimple_build_call_1 (fn, nargs); - - for (i = 0; i < nargs; i++) - gimple_call_set_arg (call, i, va_arg (ap, tree)); - - return call; -} - - -/* Helper for gimple_build_call_internal and gimple_build_call_internal_vec. - Build the basic components of a GIMPLE_CALL statement to internal - function FN with NARGS arguments. */ - -static inline gcall * -gimple_build_call_internal_1 (enum internal_fn fn, unsigned nargs) -{ - gcall *s - = as_a <gcall *> (gimple_build_with_ops (GIMPLE_CALL, ERROR_MARK, - nargs + 3)); - s->subcode |= GF_CALL_INTERNAL; - gimple_call_set_internal_fn (s, fn); - gimple_call_reset_alias_info (s); - return s; -} - - -/* Build a GIMPLE_CALL statement to internal function FN. NARGS is - the number of arguments. The ... are the arguments. */ - -gcall * -gimple_build_call_internal (enum internal_fn fn, unsigned nargs, ...) -{ - va_list ap; - gcall *call; - unsigned i; - - call = gimple_build_call_internal_1 (fn, nargs); - va_start (ap, nargs); - for (i = 0; i < nargs; i++) - gimple_call_set_arg (call, i, va_arg (ap, tree)); - va_end (ap); - - return call; -} - - -/* Build a GIMPLE_CALL statement to internal function FN with the arguments - specified in vector ARGS. */ - -gcall * -gimple_build_call_internal_vec (enum internal_fn fn, const vec<tree> &args) -{ - unsigned i, nargs; - gcall *call; - - nargs = args.length (); - call = gimple_build_call_internal_1 (fn, nargs); - for (i = 0; i < nargs; i++) - gimple_call_set_arg (call, i, args[i]); - - return call; -} - - -/* Build a GIMPLE_CALL statement from CALL_EXPR T. Note that T is - assumed to be in GIMPLE form already. Minimal checking is done of - this fact. */ - -gcall * -gimple_build_call_from_tree (tree t, tree fnptrtype) -{ - unsigned i, nargs; - gcall *call; - - gcc_assert (TREE_CODE (t) == CALL_EXPR); - - nargs = call_expr_nargs (t); - - tree fndecl = NULL_TREE; - if (CALL_EXPR_FN (t) == NULL_TREE) - call = gimple_build_call_internal_1 (CALL_EXPR_IFN (t), nargs); - else - { - fndecl = get_callee_fndecl (t); - call = gimple_build_call_1 (fndecl ? fndecl : CALL_EXPR_FN (t), nargs); - } - - for (i = 0; i < nargs; i++) - gimple_call_set_arg (call, i, CALL_EXPR_ARG (t, i)); - - gimple_set_block (call, TREE_BLOCK (t)); - gimple_set_location (call, EXPR_LOCATION (t)); - - /* Carry all the CALL_EXPR flags to the new GIMPLE_CALL. */ - gimple_call_set_chain (call, CALL_EXPR_STATIC_CHAIN (t)); - gimple_call_set_tail (call, CALL_EXPR_TAILCALL (t)); - gimple_call_set_must_tail (call, CALL_EXPR_MUST_TAIL_CALL (t)); - gimple_call_set_return_slot_opt (call, CALL_EXPR_RETURN_SLOT_OPT (t)); - if (fndecl - && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL) - && ALLOCA_FUNCTION_CODE_P (DECL_FUNCTION_CODE (fndecl))) - gimple_call_set_alloca_for_var (call, CALL_ALLOCA_FOR_VAR_P (t)); - else if (fndecl - && (DECL_IS_OPERATOR_NEW_P (fndecl) - || DECL_IS_OPERATOR_DELETE_P (fndecl))) - gimple_call_set_from_new_or_delete (call, CALL_FROM_NEW_OR_DELETE_P (t)); - else - gimple_call_set_from_thunk (call, CALL_FROM_THUNK_P (t)); - gimple_call_set_va_arg_pack (call, CALL_EXPR_VA_ARG_PACK (t)); - gimple_call_set_nothrow (call, TREE_NOTHROW (t)); - gimple_call_set_by_descriptor (call, CALL_EXPR_BY_DESCRIPTOR (t)); - copy_warning (call, t); - - if (fnptrtype) - { - gimple_call_set_fntype (call, TREE_TYPE (fnptrtype)); - - /* Check if it's an indirect CALL and the type has the - nocf_check attribute. In that case propagate the information - to the gimple CALL insn. */ - if (!fndecl) - { - gcc_assert (POINTER_TYPE_P (fnptrtype)); - tree fntype = TREE_TYPE (fnptrtype); - - if (lookup_attribute ("nocf_check", TYPE_ATTRIBUTES (fntype))) - gimple_call_set_nocf_check (call, TRUE); - } - } - - return call; -} - - -/* Build a GIMPLE_ASSIGN statement. - - LHS of the assignment. - RHS of the assignment which can be unary or binary. */ - -gassign * -gimple_build_assign (tree lhs, tree rhs MEM_STAT_DECL) -{ - enum tree_code subcode; - tree op1, op2, op3; - - extract_ops_from_tree (rhs, &subcode, &op1, &op2, &op3); - return gimple_build_assign (lhs, subcode, op1, op2, op3 PASS_MEM_STAT); -} - - -/* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands - OP1, OP2 and OP3. */ - -static inline gassign * -gimple_build_assign_1 (tree lhs, enum tree_code subcode, tree op1, - tree op2, tree op3 MEM_STAT_DECL) -{ - unsigned num_ops; - gassign *p; - - /* Need 1 operand for LHS and 1 or 2 for the RHS (depending on the - code). */ - num_ops = get_gimple_rhs_num_ops (subcode) + 1; - - p = as_a <gassign *> ( - gimple_build_with_ops_stat (GIMPLE_ASSIGN, (unsigned)subcode, num_ops - PASS_MEM_STAT)); - gimple_assign_set_lhs (p, lhs); - gimple_assign_set_rhs1 (p, op1); - if (op2) - { - gcc_assert (num_ops > 2); - gimple_assign_set_rhs2 (p, op2); - } - - if (op3) - { - gcc_assert (num_ops > 3); - gimple_assign_set_rhs3 (p, op3); - } - - return p; -} - -/* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands - OP1, OP2 and OP3. */ - -gassign * -gimple_build_assign (tree lhs, enum tree_code subcode, tree op1, - tree op2, tree op3 MEM_STAT_DECL) -{ - return gimple_build_assign_1 (lhs, subcode, op1, op2, op3 PASS_MEM_STAT); -} - -/* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands - OP1 and OP2. */ - -gassign * -gimple_build_assign (tree lhs, enum tree_code subcode, tree op1, - tree op2 MEM_STAT_DECL) -{ - return gimple_build_assign_1 (lhs, subcode, op1, op2, NULL_TREE - PASS_MEM_STAT); -} - -/* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operand OP1. */ - -gassign * -gimple_build_assign (tree lhs, enum tree_code subcode, tree op1 MEM_STAT_DECL) -{ - return gimple_build_assign_1 (lhs, subcode, op1, NULL_TREE, NULL_TREE - PASS_MEM_STAT); -} - - -/* Build a GIMPLE_COND statement. - - PRED is the condition used to compare LHS and the RHS. - T_LABEL is the label to jump to if the condition is true. - F_LABEL is the label to jump to otherwise. */ - -gcond * -gimple_build_cond (enum tree_code pred_code, tree lhs, tree rhs, - tree t_label, tree f_label) -{ - gcond *p; - - gcc_assert (TREE_CODE_CLASS (pred_code) == tcc_comparison); - p = as_a <gcond *> (gimple_build_with_ops (GIMPLE_COND, pred_code, 4)); - gimple_cond_set_lhs (p, lhs); - gimple_cond_set_rhs (p, rhs); - gimple_cond_set_true_label (p, t_label); - gimple_cond_set_false_label (p, f_label); - return p; -} - -/* Build a GIMPLE_COND statement from the conditional expression tree - COND. T_LABEL and F_LABEL are as in gimple_build_cond. */ - -gcond * -gimple_build_cond_from_tree (tree cond, tree t_label, tree f_label) -{ - enum tree_code code; - tree lhs, rhs; - - gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs); - return gimple_build_cond (code, lhs, rhs, t_label, f_label); -} - -/* Set code, lhs, and rhs of a GIMPLE_COND from a suitable - boolean expression tree COND. */ - -void -gimple_cond_set_condition_from_tree (gcond *stmt, tree cond) -{ - enum tree_code code; - tree lhs, rhs; - - gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs); - gimple_cond_set_condition (stmt, code, lhs, rhs); -} - -/* Build a GIMPLE_LABEL statement for LABEL. */ - -glabel * -gimple_build_label (tree label) -{ - glabel *p - = as_a <glabel *> (gimple_build_with_ops (GIMPLE_LABEL, ERROR_MARK, 1)); - gimple_label_set_label (p, label); - return p; -} - -/* Build a GIMPLE_GOTO statement to label DEST. */ - -ggoto * -gimple_build_goto (tree dest) -{ - ggoto *p - = as_a <ggoto *> (gimple_build_with_ops (GIMPLE_GOTO, ERROR_MARK, 1)); - gimple_goto_set_dest (p, dest); - return p; -} - - -/* Build a GIMPLE_NOP statement. */ - -gimple * -gimple_build_nop (void) -{ - return gimple_alloc (GIMPLE_NOP, 0); -} - - -/* Build a GIMPLE_BIND statement. - VARS are the variables in BODY. - BLOCK is the containing block. */ - -gbind * -gimple_build_bind (tree vars, gimple_seq body, tree block) -{ - gbind *p = as_a <gbind *> (gimple_alloc (GIMPLE_BIND, 0)); - gimple_bind_set_vars (p, vars); - if (body) - gimple_bind_set_body (p, body); - if (block) - gimple_bind_set_block (p, block); - return p; -} - -/* Helper function to set the simple fields of a asm stmt. - - STRING is a pointer to a string that is the asm blocks assembly code. - NINPUT is the number of register inputs. - NOUTPUT is the number of register outputs. - NCLOBBERS is the number of clobbered registers. - */ - -static inline gasm * -gimple_build_asm_1 (const char *string, unsigned ninputs, unsigned noutputs, - unsigned nclobbers, unsigned nlabels) -{ - gasm *p; - int size = strlen (string); - - p = as_a <gasm *> ( - gimple_build_with_ops (GIMPLE_ASM, ERROR_MARK, - ninputs + noutputs + nclobbers + nlabels)); - - p->ni = ninputs; - p->no = noutputs; - p->nc = nclobbers; - p->nl = nlabels; - p->string = ggc_alloc_string (string, size); - - if (GATHER_STATISTICS) - gimple_alloc_sizes[(int) gimple_alloc_kind (GIMPLE_ASM)] += size; - - return p; -} - -/* Build a GIMPLE_ASM statement. - - STRING is the assembly code. - NINPUT is the number of register inputs. - NOUTPUT is the number of register outputs. - NCLOBBERS is the number of clobbered registers. - INPUTS is a vector of the input register parameters. - OUTPUTS is a vector of the output register parameters. - CLOBBERS is a vector of the clobbered register parameters. - LABELS is a vector of destination labels. */ - -gasm * -gimple_build_asm_vec (const char *string, vec<tree, va_gc> *inputs, - vec<tree, va_gc> *outputs, vec<tree, va_gc> *clobbers, - vec<tree, va_gc> *labels) -{ - gasm *p; - unsigned i; - - p = gimple_build_asm_1 (string, - vec_safe_length (inputs), - vec_safe_length (outputs), - vec_safe_length (clobbers), - vec_safe_length (labels)); - - for (i = 0; i < vec_safe_length (inputs); i++) - gimple_asm_set_input_op (p, i, (*inputs)[i]); - - for (i = 0; i < vec_safe_length (outputs); i++) - gimple_asm_set_output_op (p, i, (*outputs)[i]); - - for (i = 0; i < vec_safe_length (clobbers); i++) - gimple_asm_set_clobber_op (p, i, (*clobbers)[i]); - - for (i = 0; i < vec_safe_length (labels); i++) - gimple_asm_set_label_op (p, i, (*labels)[i]); - - return p; -} - -/* Build a GIMPLE_CATCH statement. - - TYPES are the catch types. - HANDLER is the exception handler. */ - -gcatch * -gimple_build_catch (tree types, gimple_seq handler) -{ - gcatch *p = as_a <gcatch *> (gimple_alloc (GIMPLE_CATCH, 0)); - gimple_catch_set_types (p, types); - if (handler) - gimple_catch_set_handler (p, handler); - - return p; -} - -/* Build a GIMPLE_EH_FILTER statement. - - TYPES are the filter's types. - FAILURE is the filter's failure action. */ - -geh_filter * -gimple_build_eh_filter (tree types, gimple_seq failure) -{ - geh_filter *p = as_a <geh_filter *> (gimple_alloc (GIMPLE_EH_FILTER, 0)); - gimple_eh_filter_set_types (p, types); - if (failure) - gimple_eh_filter_set_failure (p, failure); - - return p; -} - -/* Build a GIMPLE_EH_MUST_NOT_THROW statement. */ - -geh_mnt * -gimple_build_eh_must_not_throw (tree decl) -{ - geh_mnt *p = as_a <geh_mnt *> (gimple_alloc (GIMPLE_EH_MUST_NOT_THROW, 0)); - - gcc_assert (TREE_CODE (decl) == FUNCTION_DECL); - gcc_assert (flags_from_decl_or_type (decl) & ECF_NORETURN); - gimple_eh_must_not_throw_set_fndecl (p, decl); - - return p; -} - -/* Build a GIMPLE_EH_ELSE statement. */ - -geh_else * -gimple_build_eh_else (gimple_seq n_body, gimple_seq e_body) -{ - geh_else *p = as_a <geh_else *> (gimple_alloc (GIMPLE_EH_ELSE, 0)); - gimple_eh_else_set_n_body (p, n_body); - gimple_eh_else_set_e_body (p, e_body); - return p; -} - -/* Build a GIMPLE_TRY statement. - - EVAL is the expression to evaluate. - CLEANUP is the cleanup expression. - KIND is either GIMPLE_TRY_CATCH or GIMPLE_TRY_FINALLY depending on - whether this is a try/catch or a try/finally respectively. */ - -gtry * -gimple_build_try (gimple_seq eval, gimple_seq cleanup, - enum gimple_try_flags kind) -{ - gtry *p; - - gcc_assert (kind == GIMPLE_TRY_CATCH || kind == GIMPLE_TRY_FINALLY); - p = as_a <gtry *> (gimple_alloc (GIMPLE_TRY, 0)); - gimple_set_subcode (p, kind); - if (eval) - gimple_try_set_eval (p, eval); - if (cleanup) - gimple_try_set_cleanup (p, cleanup); - - return p; -} - -/* Construct a GIMPLE_WITH_CLEANUP_EXPR statement. - - CLEANUP is the cleanup expression. */ - -gimple * -gimple_build_wce (gimple_seq cleanup) -{ - gimple *p = gimple_alloc (GIMPLE_WITH_CLEANUP_EXPR, 0); - if (cleanup) - gimple_wce_set_cleanup (p, cleanup); - - return p; -} - - -/* Build a GIMPLE_RESX statement. */ - -gresx * -gimple_build_resx (int region) -{ - gresx *p - = as_a <gresx *> (gimple_build_with_ops (GIMPLE_RESX, ERROR_MARK, 0)); - p->region = region; - return p; -} - - -/* The helper for constructing a gimple switch statement. - INDEX is the switch's index. - NLABELS is the number of labels in the switch excluding the default. - DEFAULT_LABEL is the default label for the switch statement. */ - -gswitch * -gimple_build_switch_nlabels (unsigned nlabels, tree index, tree default_label) -{ - /* nlabels + 1 default label + 1 index. */ - gcc_checking_assert (default_label); - gswitch *p = as_a <gswitch *> (gimple_build_with_ops (GIMPLE_SWITCH, - ERROR_MARK, - 1 + 1 + nlabels)); - gimple_switch_set_index (p, index); - gimple_switch_set_default_label (p, default_label); - return p; -} - -/* Build a GIMPLE_SWITCH statement. - - INDEX is the switch's index. - DEFAULT_LABEL is the default label - ARGS is a vector of labels excluding the default. */ - -gswitch * -gimple_build_switch (tree index, tree default_label, const vec<tree> &args) -{ - unsigned i, nlabels = args.length (); - - gswitch *p = gimple_build_switch_nlabels (nlabels, index, default_label); - - /* Copy the labels from the vector to the switch statement. */ - for (i = 0; i < nlabels; i++) - gimple_switch_set_label (p, i + 1, args[i]); - - return p; -} - -/* Build a GIMPLE_EH_DISPATCH statement. */ - -geh_dispatch * -gimple_build_eh_dispatch (int region) -{ - geh_dispatch *p - = as_a <geh_dispatch *> ( - gimple_build_with_ops (GIMPLE_EH_DISPATCH, ERROR_MARK, 0)); - p->region = region; - return p; -} - -/* Build a new GIMPLE_DEBUG_BIND statement. - - VAR is bound to VALUE; block and location are taken from STMT. */ - -gdebug * -gimple_build_debug_bind (tree var, tree value, gimple *stmt MEM_STAT_DECL) -{ - gdebug *p - = as_a <gdebug *> (gimple_build_with_ops_stat (GIMPLE_DEBUG, - (unsigned)GIMPLE_DEBUG_BIND, 2 - PASS_MEM_STAT)); - gimple_debug_bind_set_var (p, var); - gimple_debug_bind_set_value (p, value); - if (stmt) - gimple_set_location (p, gimple_location (stmt)); - - return p; -} - - -/* Build a new GIMPLE_DEBUG_SOURCE_BIND statement. - - VAR is bound to VALUE; block and location are taken from STMT. */ - -gdebug * -gimple_build_debug_source_bind (tree var, tree value, - gimple *stmt MEM_STAT_DECL) -{ - gdebug *p - = as_a <gdebug *> ( - gimple_build_with_ops_stat (GIMPLE_DEBUG, - (unsigned)GIMPLE_DEBUG_SOURCE_BIND, 2 - PASS_MEM_STAT)); - - gimple_debug_source_bind_set_var (p, var); - gimple_debug_source_bind_set_value (p, value); - if (stmt) - gimple_set_location (p, gimple_location (stmt)); - - return p; -} - - -/* Build a new GIMPLE_DEBUG_BEGIN_STMT statement in BLOCK at - LOCATION. */ - -gdebug * -gimple_build_debug_begin_stmt (tree block, location_t location - MEM_STAT_DECL) -{ - gdebug *p - = as_a <gdebug *> ( - gimple_build_with_ops_stat (GIMPLE_DEBUG, - (unsigned)GIMPLE_DEBUG_BEGIN_STMT, 0 - PASS_MEM_STAT)); - - gimple_set_location (p, location); - gimple_set_block (p, block); - cfun->debug_marker_count++; - - return p; -} - - -/* Build a new GIMPLE_DEBUG_INLINE_ENTRY statement in BLOCK at - LOCATION. The BLOCK links to the inlined function. */ - -gdebug * -gimple_build_debug_inline_entry (tree block, location_t location - MEM_STAT_DECL) -{ - gdebug *p - = as_a <gdebug *> ( - gimple_build_with_ops_stat (GIMPLE_DEBUG, - (unsigned)GIMPLE_DEBUG_INLINE_ENTRY, 0 - PASS_MEM_STAT)); - - gimple_set_location (p, location); - gimple_set_block (p, block); - cfun->debug_marker_count++; - - return p; -} - - -/* Build a GIMPLE_OMP_CRITICAL statement. - - BODY is the sequence of statements for which only one thread can execute. - NAME is optional identifier for this critical block. - CLAUSES are clauses for this critical block. */ - -gomp_critical * -gimple_build_omp_critical (gimple_seq body, tree name, tree clauses) -{ - gomp_critical *p - = as_a <gomp_critical *> (gimple_alloc (GIMPLE_OMP_CRITICAL, 0)); - gimple_omp_critical_set_name (p, name); - gimple_omp_critical_set_clauses (p, clauses); - if (body) - gimple_omp_set_body (p, body); - - return p; -} - -/* Build a GIMPLE_OMP_FOR statement. - - BODY is sequence of statements inside the for loop. - KIND is the `for' variant. - CLAUSES are any of the construct's clauses. - COLLAPSE is the collapse count. - PRE_BODY is the sequence of statements that are loop invariant. */ - -gomp_for * -gimple_build_omp_for (gimple_seq body, int kind, tree clauses, size_t collapse, - gimple_seq pre_body) -{ - gomp_for *p = as_a <gomp_for *> (gimple_alloc (GIMPLE_OMP_FOR, 0)); - if (body) - gimple_omp_set_body (p, body); - gimple_omp_for_set_clauses (p, clauses); - gimple_omp_for_set_kind (p, kind); - p->collapse = collapse; - p->iter = ggc_cleared_vec_alloc<gimple_omp_for_iter> (collapse); - - if (pre_body) - gimple_omp_for_set_pre_body (p, pre_body); - - return p; -} - - -/* Build a GIMPLE_OMP_PARALLEL statement. - - BODY is sequence of statements which are executed in parallel. - CLAUSES are the OMP parallel construct's clauses. - CHILD_FN is the function created for the parallel threads to execute. - DATA_ARG are the shared data argument(s). */ - -gomp_parallel * -gimple_build_omp_parallel (gimple_seq body, tree clauses, tree child_fn, - tree data_arg) -{ - gomp_parallel *p - = as_a <gomp_parallel *> (gimple_alloc (GIMPLE_OMP_PARALLEL, 0)); - if (body) - gimple_omp_set_body (p, body); - gimple_omp_parallel_set_clauses (p, clauses); - gimple_omp_parallel_set_child_fn (p, child_fn); - gimple_omp_parallel_set_data_arg (p, data_arg); - - return p; -} - - -/* Build a GIMPLE_OMP_TASK statement. - - BODY is sequence of statements which are executed by the explicit task. - CLAUSES are the OMP task construct's clauses. - CHILD_FN is the function created for the parallel threads to execute. - DATA_ARG are the shared data argument(s). - COPY_FN is the optional function for firstprivate initialization. - ARG_SIZE and ARG_ALIGN are size and alignment of the data block. */ - -gomp_task * -gimple_build_omp_task (gimple_seq body, tree clauses, tree child_fn, - tree data_arg, tree copy_fn, tree arg_size, - tree arg_align) -{ - gomp_task *p = as_a <gomp_task *> (gimple_alloc (GIMPLE_OMP_TASK, 0)); - if (body) - gimple_omp_set_body (p, body); - gimple_omp_task_set_clauses (p, clauses); - gimple_omp_task_set_child_fn (p, child_fn); - gimple_omp_task_set_data_arg (p, data_arg); - gimple_omp_task_set_copy_fn (p, copy_fn); - gimple_omp_task_set_arg_size (p, arg_size); - gimple_omp_task_set_arg_align (p, arg_align); - - return p; -} - - -/* Build a GIMPLE_OMP_SECTION statement for a sections statement. - - BODY is the sequence of statements in the section. */ - -gimple * -gimple_build_omp_section (gimple_seq body) -{ - gimple *p = gimple_alloc (GIMPLE_OMP_SECTION, 0); - if (body) - gimple_omp_set_body (p, body); - - return p; -} - - -/* Build a GIMPLE_OMP_MASTER statement. - - BODY is the sequence of statements to be executed by just the master. */ - -gimple * -gimple_build_omp_master (gimple_seq body) -{ - gimple *p = gimple_alloc (GIMPLE_OMP_MASTER, 0); - if (body) - gimple_omp_set_body (p, body); - - return p; -} - -/* Build a GIMPLE_OMP_MASKED statement. - - BODY is the sequence of statements to be executed by the selected thread(s). */ - -gimple * -gimple_build_omp_masked (gimple_seq body, tree clauses) -{ - gimple *p = gimple_alloc (GIMPLE_OMP_MASKED, 0); - gimple_omp_masked_set_clauses (p, clauses); - if (body) - gimple_omp_set_body (p, body); - - return p; -} - -/* Build a GIMPLE_OMP_TASKGROUP statement. - - BODY is the sequence of statements to be executed by the taskgroup - construct. - CLAUSES are any of the construct's clauses. */ - -gimple * -gimple_build_omp_taskgroup (gimple_seq body, tree clauses) -{ - gimple *p = gimple_alloc (GIMPLE_OMP_TASKGROUP, 0); - gimple_omp_taskgroup_set_clauses (p, clauses); - if (body) - gimple_omp_set_body (p, body); - - return p; -} - - -/* Build a GIMPLE_OMP_CONTINUE statement. - - CONTROL_DEF is the definition of the control variable. - CONTROL_USE is the use of the control variable. */ - -gomp_continue * -gimple_build_omp_continue (tree control_def, tree control_use) -{ - gomp_continue *p - = as_a <gomp_continue *> (gimple_alloc (GIMPLE_OMP_CONTINUE, 0)); - gimple_omp_continue_set_control_def (p, control_def); - gimple_omp_continue_set_control_use (p, control_use); - return p; -} - -/* Build a GIMPLE_OMP_ORDERED statement. - - BODY is the sequence of statements inside a loop that will executed in - sequence. - CLAUSES are clauses for this statement. */ - -gomp_ordered * -gimple_build_omp_ordered (gimple_seq body, tree clauses) -{ - gomp_ordered *p - = as_a <gomp_ordered *> (gimple_alloc (GIMPLE_OMP_ORDERED, 0)); - gimple_omp_ordered_set_clauses (p, clauses); - if (body) - gimple_omp_set_body (p, body); - - return p; -} - - -/* Build a GIMPLE_OMP_RETURN statement. - WAIT_P is true if this is a non-waiting return. */ - -gimple * -gimple_build_omp_return (bool wait_p) -{ - gimple *p = gimple_alloc (GIMPLE_OMP_RETURN, 0); - if (wait_p) - gimple_omp_return_set_nowait (p); - - return p; -} - - -/* Build a GIMPLE_OMP_SCAN statement. - - BODY is the sequence of statements to be executed by the scan - construct. - CLAUSES are any of the construct's clauses. */ - -gomp_scan * -gimple_build_omp_scan (gimple_seq body, tree clauses) -{ - gomp_scan *p - = as_a <gomp_scan *> (gimple_alloc (GIMPLE_OMP_SCAN, 0)); - gimple_omp_scan_set_clauses (p, clauses); - if (body) - gimple_omp_set_body (p, body); - - return p; -} - - -/* Build a GIMPLE_OMP_SECTIONS statement. - - BODY is a sequence of section statements. - CLAUSES are any of the OMP sections contsruct's clauses: private, - firstprivate, lastprivate, reduction, and nowait. */ - -gomp_sections * -gimple_build_omp_sections (gimple_seq body, tree clauses) -{ - gomp_sections *p - = as_a <gomp_sections *> (gimple_alloc (GIMPLE_OMP_SECTIONS, 0)); - if (body) - gimple_omp_set_body (p, body); - gimple_omp_sections_set_clauses (p, clauses); - - return p; -} - - -/* Build a GIMPLE_OMP_SECTIONS_SWITCH. */ - -gimple * -gimple_build_omp_sections_switch (void) -{ - return gimple_alloc (GIMPLE_OMP_SECTIONS_SWITCH, 0); -} - - -/* Build a GIMPLE_OMP_SINGLE statement. - - BODY is the sequence of statements that will be executed once. - CLAUSES are any of the OMP single construct's clauses: private, firstprivate, - copyprivate, nowait. */ - -gomp_single * -gimple_build_omp_single (gimple_seq body, tree clauses) -{ - gomp_single *p - = as_a <gomp_single *> (gimple_alloc (GIMPLE_OMP_SINGLE, 0)); - if (body) - gimple_omp_set_body (p, body); - gimple_omp_single_set_clauses (p, clauses); - - return p; -} - - -/* Build a GIMPLE_OMP_SCOPE statement. - - BODY is the sequence of statements that will be executed once. - CLAUSES are any of the OMP scope construct's clauses: private, reduction, - nowait. */ - -gimple * -gimple_build_omp_scope (gimple_seq body, tree clauses) -{ - gimple *p = gimple_alloc (GIMPLE_OMP_SCOPE, 0); - gimple_omp_scope_set_clauses (p, clauses); - if (body) - gimple_omp_set_body (p, body); - - return p; -} - - -/* Build a GIMPLE_OMP_TARGET statement. - - BODY is the sequence of statements that will be executed. - KIND is the kind of the region. - CLAUSES are any of the construct's clauses. */ - -gomp_target * -gimple_build_omp_target (gimple_seq body, int kind, tree clauses) -{ - gomp_target *p - = as_a <gomp_target *> (gimple_alloc (GIMPLE_OMP_TARGET, 0)); - if (body) - gimple_omp_set_body (p, body); - gimple_omp_target_set_clauses (p, clauses); - gimple_omp_target_set_kind (p, kind); - - return p; -} - - -/* Build a GIMPLE_OMP_TEAMS statement. - - BODY is the sequence of statements that will be executed. - CLAUSES are any of the OMP teams construct's clauses. */ - -gomp_teams * -gimple_build_omp_teams (gimple_seq body, tree clauses) -{ - gomp_teams *p = as_a <gomp_teams *> (gimple_alloc (GIMPLE_OMP_TEAMS, 0)); - if (body) - gimple_omp_set_body (p, body); - gimple_omp_teams_set_clauses (p, clauses); - - return p; -} - - -/* Build a GIMPLE_OMP_ATOMIC_LOAD statement. */ - -gomp_atomic_load * -gimple_build_omp_atomic_load (tree lhs, tree rhs, enum omp_memory_order mo) -{ - gomp_atomic_load *p - = as_a <gomp_atomic_load *> (gimple_alloc (GIMPLE_OMP_ATOMIC_LOAD, 0)); - gimple_omp_atomic_load_set_lhs (p, lhs); - gimple_omp_atomic_load_set_rhs (p, rhs); - gimple_omp_atomic_set_memory_order (p, mo); - return p; -} - -/* Build a GIMPLE_OMP_ATOMIC_STORE statement. - - VAL is the value we are storing. */ - -gomp_atomic_store * -gimple_build_omp_atomic_store (tree val, enum omp_memory_order mo) -{ - gomp_atomic_store *p - = as_a <gomp_atomic_store *> (gimple_alloc (GIMPLE_OMP_ATOMIC_STORE, 0)); - gimple_omp_atomic_store_set_val (p, val); - gimple_omp_atomic_set_memory_order (p, mo); - return p; -} - -/* Build a GIMPLE_TRANSACTION statement. */ - -gtransaction * -gimple_build_transaction (gimple_seq body) -{ - gtransaction *p - = as_a <gtransaction *> (gimple_alloc (GIMPLE_TRANSACTION, 0)); - gimple_transaction_set_body (p, body); - gimple_transaction_set_label_norm (p, 0); - gimple_transaction_set_label_uninst (p, 0); - gimple_transaction_set_label_over (p, 0); - return p; -} - -#if defined ENABLE_GIMPLE_CHECKING -/* Complain of a gimple type mismatch and die. */ - -void -gimple_check_failed (const gimple *gs, const char *file, int line, - const char *function, enum gimple_code code, - enum tree_code subcode) -{ - internal_error ("gimple check: expected %s(%s), have %s(%s) in %s, at %s:%d", - gimple_code_name[code], - get_tree_code_name (subcode), - gimple_code_name[gimple_code (gs)], - gs->subcode > 0 - ? get_tree_code_name ((enum tree_code) gs->subcode) - : "", - function, trim_filename (file), line); -} -#endif /* ENABLE_GIMPLE_CHECKING */ - - -/* Link gimple statement GS to the end of the sequence *SEQ_P. If - *SEQ_P is NULL, a new sequence is allocated. */ - -void -gimple_seq_add_stmt (gimple_seq *seq_p, gimple *gs) -{ - gimple_stmt_iterator si; - if (gs == NULL) - return; - - si = gsi_last (*seq_p); - gsi_insert_after (&si, gs, GSI_NEW_STMT); -} - -/* Link gimple statement GS to the end of the sequence *SEQ_P. If - *SEQ_P is NULL, a new sequence is allocated. This function is - similar to gimple_seq_add_stmt, but does not scan the operands. - During gimplification, we need to manipulate statement sequences - before the def/use vectors have been constructed. */ - -void -gimple_seq_add_stmt_without_update (gimple_seq *seq_p, gimple *gs) -{ - gimple_stmt_iterator si; - - if (gs == NULL) - return; - - si = gsi_last (*seq_p); - gsi_insert_after_without_update (&si, gs, GSI_NEW_STMT); -} - -/* Append sequence SRC to the end of sequence *DST_P. If *DST_P is - NULL, a new sequence is allocated. */ - -void -gimple_seq_add_seq (gimple_seq *dst_p, gimple_seq src) -{ - gimple_stmt_iterator si; - if (src == NULL) - return; - - si = gsi_last (*dst_p); - gsi_insert_seq_after (&si, src, GSI_NEW_STMT); -} - -/* Append sequence SRC to the end of sequence *DST_P. If *DST_P is - NULL, a new sequence is allocated. This function is - similar to gimple_seq_add_seq, but does not scan the operands. */ - -void -gimple_seq_add_seq_without_update (gimple_seq *dst_p, gimple_seq src) -{ - gimple_stmt_iterator si; - if (src == NULL) - return; - - si = gsi_last (*dst_p); - gsi_insert_seq_after_without_update (&si, src, GSI_NEW_STMT); -} - -/* Determine whether to assign a location to the statement GS. */ - -static bool -should_carry_location_p (gimple *gs) -{ - /* Don't emit a line note for a label. We particularly don't want to - emit one for the break label, since it doesn't actually correspond - to the beginning of the loop/switch. */ - if (gimple_code (gs) == GIMPLE_LABEL) - return false; - - return true; -} - -/* Set the location for gimple statement GS to LOCATION. */ - -static void -annotate_one_with_location (gimple *gs, location_t location) -{ - if (!gimple_has_location (gs) - && !gimple_do_not_emit_location_p (gs) - && should_carry_location_p (gs)) - gimple_set_location (gs, location); -} - -/* Set LOCATION for all the statements after iterator GSI in sequence - SEQ. If GSI is pointing to the end of the sequence, start with the - first statement in SEQ. */ - -void -annotate_all_with_location_after (gimple_seq seq, gimple_stmt_iterator gsi, - location_t location) -{ - if (gsi_end_p (gsi)) - gsi = gsi_start (seq); - else - gsi_next (&gsi); - - for (; !gsi_end_p (gsi); gsi_next (&gsi)) - annotate_one_with_location (gsi_stmt (gsi), location); -} - -/* Set the location for all the statements in a sequence STMT_P to LOCATION. */ - -void -annotate_all_with_location (gimple_seq stmt_p, location_t location) -{ - gimple_stmt_iterator i; - - if (gimple_seq_empty_p (stmt_p)) - return; - - for (i = gsi_start (stmt_p); !gsi_end_p (i); gsi_next (&i)) - { - gimple *gs = gsi_stmt (i); - annotate_one_with_location (gs, location); - } -} - -/* Helper function of empty_body_p. Return true if STMT is an empty - statement. */ - -static bool -empty_stmt_p (gimple *stmt) -{ - if (gimple_code (stmt) == GIMPLE_NOP) - return true; - if (gbind *bind_stmt = dyn_cast <gbind *> (stmt)) - return empty_body_p (gimple_bind_body (bind_stmt)); - return false; -} - - -/* Return true if BODY contains nothing but empty statements. */ - -bool -empty_body_p (gimple_seq body) -{ - gimple_stmt_iterator i; - - if (gimple_seq_empty_p (body)) - return true; - for (i = gsi_start (body); !gsi_end_p (i); gsi_next (&i)) - if (!empty_stmt_p (gsi_stmt (i)) - && !is_gimple_debug (gsi_stmt (i))) - return false; - - return true; -} - - -/* Perform a deep copy of sequence SRC and return the result. */ - -gimple_seq -gimple_seq_copy (gimple_seq src) -{ - gimple_stmt_iterator gsi; - gimple_seq new_seq = NULL; - gimple *stmt; - - for (gsi = gsi_start (src); !gsi_end_p (gsi); gsi_next (&gsi)) - { - stmt = gimple_copy (gsi_stmt (gsi)); - gimple_seq_add_stmt (&new_seq, stmt); - } - - return new_seq; -} - - - -/* Return true if calls C1 and C2 are known to go to the same function. */ - -bool -gimple_call_same_target_p (const gimple *c1, const gimple *c2) -{ - if (gimple_call_internal_p (c1)) - return (gimple_call_internal_p (c2) - && gimple_call_internal_fn (c1) == gimple_call_internal_fn (c2) - && (!gimple_call_internal_unique_p (as_a <const gcall *> (c1)) - || c1 == c2)); - else - return (gimple_call_fn (c1) == gimple_call_fn (c2) - || (gimple_call_fndecl (c1) - && gimple_call_fndecl (c1) == gimple_call_fndecl (c2))); -} - -/* Detect flags from a GIMPLE_CALL. This is just like - call_expr_flags, but for gimple tuples. */ - -int -gimple_call_flags (const gimple *stmt) -{ - int flags = 0; - - if (gimple_call_internal_p (stmt)) - flags = internal_fn_flags (gimple_call_internal_fn (stmt)); - else - { - tree decl = gimple_call_fndecl (stmt); - if (decl) - flags = flags_from_decl_or_type (decl); - flags |= flags_from_decl_or_type (gimple_call_fntype (stmt)); - } - - if (stmt->subcode & GF_CALL_NOTHROW) - flags |= ECF_NOTHROW; - - if (stmt->subcode & GF_CALL_BY_DESCRIPTOR) - flags |= ECF_BY_DESCRIPTOR; - - return flags; -} - -/* Return the "fn spec" string for call STMT. */ - -attr_fnspec -gimple_call_fnspec (const gcall *stmt) -{ - tree type, attr; - - if (gimple_call_internal_p (stmt)) - { - const_tree spec = internal_fn_fnspec (gimple_call_internal_fn (stmt)); - if (spec) - return spec; - else - return ""; - } - - type = gimple_call_fntype (stmt); - if (type) - { - attr = lookup_attribute ("fn spec", TYPE_ATTRIBUTES (type)); - if (attr) - return TREE_VALUE (TREE_VALUE (attr)); - } - if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL)) - return builtin_fnspec (gimple_call_fndecl (stmt)); - tree fndecl = gimple_call_fndecl (stmt); - /* If the call is to a replaceable operator delete and results - from a delete expression as opposed to a direct call to - such operator, then we can treat it as free. */ - if (fndecl - && DECL_IS_OPERATOR_DELETE_P (fndecl) - && DECL_IS_REPLACEABLE_OPERATOR (fndecl) - && gimple_call_from_new_or_delete (stmt)) - return ". o "; - /* Similarly operator new can be treated as malloc. */ - if (fndecl - && DECL_IS_REPLACEABLE_OPERATOR_NEW_P (fndecl) - && gimple_call_from_new_or_delete (stmt)) - return "m "; - return ""; -} - -/* Detects argument flags for argument number ARG on call STMT. */ - -int -gimple_call_arg_flags (const gcall *stmt, unsigned arg) -{ - attr_fnspec fnspec = gimple_call_fnspec (stmt); - int flags = 0; - - if (fnspec.known_p ()) - flags = fnspec.arg_eaf_flags (arg); - tree callee = gimple_call_fndecl (stmt); - if (callee) - { - cgraph_node *node = cgraph_node::get (callee); - modref_summary *summary = node ? get_modref_function_summary (node) - : NULL; - - if (summary && summary->arg_flags.length () > arg) - { - int modref_flags = summary->arg_flags[arg]; - - /* We have possibly optimized out load. Be conservative here. */ - if (!node->binds_to_current_def_p ()) - modref_flags = interposable_eaf_flags (modref_flags, flags); - if (dbg_cnt (ipa_mod_ref_pta)) - flags |= modref_flags; - } - } - return flags; -} - -/* Detects argument flags for return slot on call STMT. */ - -int -gimple_call_retslot_flags (const gcall *stmt) -{ - int flags = implicit_retslot_eaf_flags; - - tree callee = gimple_call_fndecl (stmt); - if (callee) - { - cgraph_node *node = cgraph_node::get (callee); - modref_summary *summary = node ? get_modref_function_summary (node) - : NULL; - - if (summary) - { - int modref_flags = summary->retslot_flags; - - /* We have possibly optimized out load. Be conservative here. */ - if (!node->binds_to_current_def_p ()) - modref_flags = interposable_eaf_flags (modref_flags, flags); - if (dbg_cnt (ipa_mod_ref_pta)) - flags |= modref_flags; - } - } - return flags; -} - -/* Detects argument flags for static chain on call STMT. */ - -int -gimple_call_static_chain_flags (const gcall *stmt) -{ - int flags = 0; - - tree callee = gimple_call_fndecl (stmt); - if (callee) - { - cgraph_node *node = cgraph_node::get (callee); - modref_summary *summary = node ? get_modref_function_summary (node) - : NULL; - - /* Nested functions should always bind to current def since - there is no public ABI for them. */ - gcc_checking_assert (node->binds_to_current_def_p ()); - if (summary) - { - int modref_flags = summary->static_chain_flags; - - if (dbg_cnt (ipa_mod_ref_pta)) - flags |= modref_flags; - } - } - return flags; -} - -/* Detects return flags for the call STMT. */ - -int -gimple_call_return_flags (const gcall *stmt) -{ - if (gimple_call_flags (stmt) & ECF_MALLOC) - return ERF_NOALIAS; - - attr_fnspec fnspec = gimple_call_fnspec (stmt); - - unsigned int arg_no; - if (fnspec.returns_arg (&arg_no)) - return ERF_RETURNS_ARG | arg_no; - - if (fnspec.returns_noalias_p ()) - return ERF_NOALIAS; - return 0; -} - - -/* Return true if call STMT is known to return a non-zero result. */ - -bool -gimple_call_nonnull_result_p (gcall *call) -{ - tree fndecl = gimple_call_fndecl (call); - if (!fndecl) - return false; - if (flag_delete_null_pointer_checks && !flag_check_new - && DECL_IS_OPERATOR_NEW_P (fndecl) - && !TREE_NOTHROW (fndecl)) - return true; - - /* References are always non-NULL. */ - if (flag_delete_null_pointer_checks - && TREE_CODE (TREE_TYPE (fndecl)) == REFERENCE_TYPE) - return true; - - if (flag_delete_null_pointer_checks - && lookup_attribute ("returns_nonnull", - TYPE_ATTRIBUTES (gimple_call_fntype (call)))) - return true; - return gimple_alloca_call_p (call); -} - - -/* If CALL returns a non-null result in an argument, return that arg. */ - -tree -gimple_call_nonnull_arg (gcall *call) -{ - tree fndecl = gimple_call_fndecl (call); - if (!fndecl) - return NULL_TREE; - - unsigned rf = gimple_call_return_flags (call); - if (rf & ERF_RETURNS_ARG) - { - unsigned argnum = rf & ERF_RETURN_ARG_MASK; - if (argnum < gimple_call_num_args (call)) - { - tree arg = gimple_call_arg (call, argnum); - if (SSA_VAR_P (arg) - && infer_nonnull_range_by_attribute (call, arg)) - return arg; - } - } - return NULL_TREE; -} - - -/* Return true if GS is a copy assignment. */ - -bool -gimple_assign_copy_p (gimple *gs) -{ - return (gimple_assign_single_p (gs) - && is_gimple_val (gimple_op (gs, 1))); -} - - -/* Return true if GS is a SSA_NAME copy assignment. */ - -bool -gimple_assign_ssa_name_copy_p (gimple *gs) -{ - return (gimple_assign_single_p (gs) - && TREE_CODE (gimple_assign_lhs (gs)) == SSA_NAME - && TREE_CODE (gimple_assign_rhs1 (gs)) == SSA_NAME); -} - - -/* Return true if GS is an assignment with a unary RHS, but the - operator has no effect on the assigned value. The logic is adapted - from STRIP_NOPS. This predicate is intended to be used in tuplifying - instances in which STRIP_NOPS was previously applied to the RHS of - an assignment. - - NOTE: In the use cases that led to the creation of this function - and of gimple_assign_single_p, it is typical to test for either - condition and to proceed in the same manner. In each case, the - assigned value is represented by the single RHS operand of the - assignment. I suspect there may be cases where gimple_assign_copy_p, - gimple_assign_single_p, or equivalent logic is used where a similar - treatment of unary NOPs is appropriate. */ - -bool -gimple_assign_unary_nop_p (gimple *gs) -{ - return (is_gimple_assign (gs) - && (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (gs)) - || gimple_assign_rhs_code (gs) == NON_LVALUE_EXPR) - && gimple_assign_rhs1 (gs) != error_mark_node - && (TYPE_MODE (TREE_TYPE (gimple_assign_lhs (gs))) - == TYPE_MODE (TREE_TYPE (gimple_assign_rhs1 (gs))))); -} - -/* Set BB to be the basic block holding G. */ - -void -gimple_set_bb (gimple *stmt, basic_block bb) -{ - stmt->bb = bb; - - if (gimple_code (stmt) != GIMPLE_LABEL) - return; - - /* If the statement is a label, add the label to block-to-labels map - so that we can speed up edge creation for GIMPLE_GOTOs. */ - if (cfun->cfg) - { - tree t; - int uid; - - t = gimple_label_label (as_a <glabel *> (stmt)); - uid = LABEL_DECL_UID (t); - if (uid == -1) - { - unsigned old_len = - vec_safe_length (label_to_block_map_for_fn (cfun)); - LABEL_DECL_UID (t) = uid = cfun->cfg->last_label_uid++; - if (old_len <= (unsigned) uid) - vec_safe_grow_cleared (label_to_block_map_for_fn (cfun), uid + 1); - } - - (*label_to_block_map_for_fn (cfun))[uid] = bb; - } -} - - -/* Modify the RHS of the assignment pointed-to by GSI using the - operands in the expression tree EXPR. - - NOTE: The statement pointed-to by GSI may be reallocated if it - did not have enough operand slots. - - This function is useful to convert an existing tree expression into - the flat representation used for the RHS of a GIMPLE assignment. - It will reallocate memory as needed to expand or shrink the number - of operand slots needed to represent EXPR. - - NOTE: If you find yourself building a tree and then calling this - function, you are most certainly doing it the slow way. It is much - better to build a new assignment or to use the function - gimple_assign_set_rhs_with_ops, which does not require an - expression tree to be built. */ - -void -gimple_assign_set_rhs_from_tree (gimple_stmt_iterator *gsi, tree expr) -{ - enum tree_code subcode; - tree op1, op2, op3; - - extract_ops_from_tree (expr, &subcode, &op1, &op2, &op3); - gimple_assign_set_rhs_with_ops (gsi, subcode, op1, op2, op3); -} - - -/* Set the RHS of assignment statement pointed-to by GSI to CODE with - operands OP1, OP2 and OP3. - - NOTE: The statement pointed-to by GSI may be reallocated if it - did not have enough operand slots. */ - -void -gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *gsi, enum tree_code code, - tree op1, tree op2, tree op3) -{ - unsigned new_rhs_ops = get_gimple_rhs_num_ops (code); - gimple *stmt = gsi_stmt (*gsi); - gimple *old_stmt = stmt; - - /* If the new CODE needs more operands, allocate a new statement. */ - if (gimple_num_ops (stmt) < new_rhs_ops + 1) - { - tree lhs = gimple_assign_lhs (old_stmt); - stmt = gimple_alloc (gimple_code (old_stmt), new_rhs_ops + 1); - memcpy (stmt, old_stmt, gimple_size (gimple_code (old_stmt))); - gimple_init_singleton (stmt); - - /* The LHS needs to be reset as this also changes the SSA name - on the LHS. */ - gimple_assign_set_lhs (stmt, lhs); - } - - gimple_set_num_ops (stmt, new_rhs_ops + 1); - gimple_set_subcode (stmt, code); - gimple_assign_set_rhs1 (stmt, op1); - if (new_rhs_ops > 1) - gimple_assign_set_rhs2 (stmt, op2); - if (new_rhs_ops > 2) - gimple_assign_set_rhs3 (stmt, op3); - if (stmt != old_stmt) - gsi_replace (gsi, stmt, false); -} - - -/* Return the LHS of a statement that performs an assignment, - either a GIMPLE_ASSIGN or a GIMPLE_CALL. Returns NULL_TREE - for a call to a function that returns no value, or for a - statement other than an assignment or a call. */ - -tree -gimple_get_lhs (const gimple *stmt) -{ - enum gimple_code code = gimple_code (stmt); - - if (code == GIMPLE_ASSIGN) - return gimple_assign_lhs (stmt); - else if (code == GIMPLE_CALL) - return gimple_call_lhs (stmt); - else if (code == GIMPLE_PHI) - return gimple_phi_result (stmt); - else - return NULL_TREE; -} - - -/* Set the LHS of a statement that performs an assignment, - either a GIMPLE_ASSIGN or a GIMPLE_CALL. */ - -void -gimple_set_lhs (gimple *stmt, tree lhs) -{ - enum gimple_code code = gimple_code (stmt); - - if (code == GIMPLE_ASSIGN) - gimple_assign_set_lhs (stmt, lhs); - else if (code == GIMPLE_CALL) - gimple_call_set_lhs (stmt, lhs); - else - gcc_unreachable (); -} - - -/* Return a deep copy of statement STMT. All the operands from STMT - are reallocated and copied using unshare_expr. The DEF, USE, VDEF - and VUSE operand arrays are set to empty in the new copy. The new - copy isn't part of any sequence. */ - -gimple * -gimple_copy (gimple *stmt) -{ - enum gimple_code code = gimple_code (stmt); - unsigned num_ops = gimple_num_ops (stmt); - gimple *copy = gimple_alloc (code, num_ops); - unsigned i; - - /* Shallow copy all the fields from STMT. */ - memcpy (copy, stmt, gimple_size (code)); - gimple_init_singleton (copy); - - /* If STMT has sub-statements, deep-copy them as well. */ - if (gimple_has_substatements (stmt)) - { - gimple_seq new_seq; - tree t; - - switch (gimple_code (stmt)) - { - case GIMPLE_BIND: - { - gbind *bind_stmt = as_a <gbind *> (stmt); - gbind *bind_copy = as_a <gbind *> (copy); - new_seq = gimple_seq_copy (gimple_bind_body (bind_stmt)); - gimple_bind_set_body (bind_copy, new_seq); - gimple_bind_set_vars (bind_copy, - unshare_expr (gimple_bind_vars (bind_stmt))); - gimple_bind_set_block (bind_copy, gimple_bind_block (bind_stmt)); - } - break; - - case GIMPLE_CATCH: - { - gcatch *catch_stmt = as_a <gcatch *> (stmt); - gcatch *catch_copy = as_a <gcatch *> (copy); - new_seq = gimple_seq_copy (gimple_catch_handler (catch_stmt)); - gimple_catch_set_handler (catch_copy, new_seq); - t = unshare_expr (gimple_catch_types (catch_stmt)); - gimple_catch_set_types (catch_copy, t); - } - break; - - case GIMPLE_EH_FILTER: - { - geh_filter *eh_filter_stmt = as_a <geh_filter *> (stmt); - geh_filter *eh_filter_copy = as_a <geh_filter *> (copy); - new_seq - = gimple_seq_copy (gimple_eh_filter_failure (eh_filter_stmt)); - gimple_eh_filter_set_failure (eh_filter_copy, new_seq); - t = unshare_expr (gimple_eh_filter_types (eh_filter_stmt)); - gimple_eh_filter_set_types (eh_filter_copy, t); - } - break; - - case GIMPLE_EH_ELSE: - { - geh_else *eh_else_stmt = as_a <geh_else *> (stmt); - geh_else *eh_else_copy = as_a <geh_else *> (copy); - new_seq = gimple_seq_copy (gimple_eh_else_n_body (eh_else_stmt)); - gimple_eh_else_set_n_body (eh_else_copy, new_seq); - new_seq = gimple_seq_copy (gimple_eh_else_e_body (eh_else_stmt)); - gimple_eh_else_set_e_body (eh_else_copy, new_seq); - } - break; - - case GIMPLE_TRY: - { - gtry *try_stmt = as_a <gtry *> (stmt); - gtry *try_copy = as_a <gtry *> (copy); - new_seq = gimple_seq_copy (gimple_try_eval (try_stmt)); - gimple_try_set_eval (try_copy, new_seq); - new_seq = gimple_seq_copy (gimple_try_cleanup (try_stmt)); - gimple_try_set_cleanup (try_copy, new_seq); - } - break; - - case GIMPLE_OMP_FOR: - new_seq = gimple_seq_copy (gimple_omp_for_pre_body (stmt)); - gimple_omp_for_set_pre_body (copy, new_seq); - t = unshare_expr (gimple_omp_for_clauses (stmt)); - gimple_omp_for_set_clauses (copy, t); - { - gomp_for *omp_for_copy = as_a <gomp_for *> (copy); - omp_for_copy->iter = ggc_vec_alloc<gimple_omp_for_iter> - ( gimple_omp_for_collapse (stmt)); - } - for (i = 0; i < gimple_omp_for_collapse (stmt); i++) - { - gimple_omp_for_set_cond (copy, i, - gimple_omp_for_cond (stmt, i)); - gimple_omp_for_set_index (copy, i, - gimple_omp_for_index (stmt, i)); - t = unshare_expr (gimple_omp_for_initial (stmt, i)); - gimple_omp_for_set_initial (copy, i, t); - t = unshare_expr (gimple_omp_for_final (stmt, i)); - gimple_omp_for_set_final (copy, i, t); - t = unshare_expr (gimple_omp_for_incr (stmt, i)); - gimple_omp_for_set_incr (copy, i, t); - } - goto copy_omp_body; - - case GIMPLE_OMP_PARALLEL: - { - gomp_parallel *omp_par_stmt = as_a <gomp_parallel *> (stmt); - gomp_parallel *omp_par_copy = as_a <gomp_parallel *> (copy); - t = unshare_expr (gimple_omp_parallel_clauses (omp_par_stmt)); - gimple_omp_parallel_set_clauses (omp_par_copy, t); - t = unshare_expr (gimple_omp_parallel_child_fn (omp_par_stmt)); - gimple_omp_parallel_set_child_fn (omp_par_copy, t); - t = unshare_expr (gimple_omp_parallel_data_arg (omp_par_stmt)); - gimple_omp_parallel_set_data_arg (omp_par_copy, t); - } - goto copy_omp_body; - - case GIMPLE_OMP_TASK: - t = unshare_expr (gimple_omp_task_clauses (stmt)); - gimple_omp_task_set_clauses (copy, t); - t = unshare_expr (gimple_omp_task_child_fn (stmt)); - gimple_omp_task_set_child_fn (copy, t); - t = unshare_expr (gimple_omp_task_data_arg (stmt)); - gimple_omp_task_set_data_arg (copy, t); - t = unshare_expr (gimple_omp_task_copy_fn (stmt)); - gimple_omp_task_set_copy_fn (copy, t); - t = unshare_expr (gimple_omp_task_arg_size (stmt)); - gimple_omp_task_set_arg_size (copy, t); - t = unshare_expr (gimple_omp_task_arg_align (stmt)); - gimple_omp_task_set_arg_align (copy, t); - goto copy_omp_body; - - case GIMPLE_OMP_CRITICAL: - t = unshare_expr (gimple_omp_critical_name - (as_a <gomp_critical *> (stmt))); - gimple_omp_critical_set_name (as_a <gomp_critical *> (copy), t); - t = unshare_expr (gimple_omp_critical_clauses - (as_a <gomp_critical *> (stmt))); - gimple_omp_critical_set_clauses (as_a <gomp_critical *> (copy), t); - goto copy_omp_body; - - case GIMPLE_OMP_ORDERED: - t = unshare_expr (gimple_omp_ordered_clauses - (as_a <gomp_ordered *> (stmt))); - gimple_omp_ordered_set_clauses (as_a <gomp_ordered *> (copy), t); - goto copy_omp_body; - - case GIMPLE_OMP_SCAN: - t = gimple_omp_scan_clauses (as_a <gomp_scan *> (stmt)); - t = unshare_expr (t); - gimple_omp_scan_set_clauses (as_a <gomp_scan *> (copy), t); - goto copy_omp_body; - - case GIMPLE_OMP_TASKGROUP: - t = unshare_expr (gimple_omp_taskgroup_clauses (stmt)); - gimple_omp_taskgroup_set_clauses (copy, t); - goto copy_omp_body; - - case GIMPLE_OMP_SECTIONS: - t = unshare_expr (gimple_omp_sections_clauses (stmt)); - gimple_omp_sections_set_clauses (copy, t); - t = unshare_expr (gimple_omp_sections_control (stmt)); - gimple_omp_sections_set_control (copy, t); - goto copy_omp_body; - - case GIMPLE_OMP_SINGLE: - { - gomp_single *omp_single_copy = as_a <gomp_single *> (copy); - t = unshare_expr (gimple_omp_single_clauses (stmt)); - gimple_omp_single_set_clauses (omp_single_copy, t); - } - goto copy_omp_body; - - case GIMPLE_OMP_SCOPE: - t = unshare_expr (gimple_omp_scope_clauses (stmt)); - gimple_omp_scope_set_clauses (copy, t); - goto copy_omp_body; - - case GIMPLE_OMP_TARGET: - { - gomp_target *omp_target_stmt = as_a <gomp_target *> (stmt); - gomp_target *omp_target_copy = as_a <gomp_target *> (copy); - t = unshare_expr (gimple_omp_target_clauses (omp_target_stmt)); - gimple_omp_target_set_clauses (omp_target_copy, t); - t = unshare_expr (gimple_omp_target_data_arg (omp_target_stmt)); - gimple_omp_target_set_data_arg (omp_target_copy, t); - } - goto copy_omp_body; - - case GIMPLE_OMP_TEAMS: - { - gomp_teams *omp_teams_copy = as_a <gomp_teams *> (copy); - t = unshare_expr (gimple_omp_teams_clauses (stmt)); - gimple_omp_teams_set_clauses (omp_teams_copy, t); - } - /* FALLTHRU */ - - case GIMPLE_OMP_SECTION: - case GIMPLE_OMP_MASTER: - copy_omp_body: - new_seq = gimple_seq_copy (gimple_omp_body (stmt)); - gimple_omp_set_body (copy, new_seq); - break; - - case GIMPLE_OMP_MASKED: - t = unshare_expr (gimple_omp_masked_clauses (stmt)); - gimple_omp_masked_set_clauses (copy, t); - goto copy_omp_body; - - case GIMPLE_TRANSACTION: - new_seq = gimple_seq_copy (gimple_transaction_body ( - as_a <gtransaction *> (stmt))); - gimple_transaction_set_body (as_a <gtransaction *> (copy), - new_seq); - break; - - case GIMPLE_WITH_CLEANUP_EXPR: - new_seq = gimple_seq_copy (gimple_wce_cleanup (stmt)); - gimple_wce_set_cleanup (copy, new_seq); - break; - - default: - gcc_unreachable (); - } - } - - /* Make copy of operands. */ - for (i = 0; i < num_ops; i++) - gimple_set_op (copy, i, unshare_expr (gimple_op (stmt, i))); - - if (gimple_has_mem_ops (stmt)) - { - gimple_set_vdef (copy, gimple_vdef (stmt)); - gimple_set_vuse (copy, gimple_vuse (stmt)); - } - - /* Clear out SSA operand vectors on COPY. */ - if (gimple_has_ops (stmt)) - { - gimple_set_use_ops (copy, NULL); - - /* SSA operands need to be updated. */ - gimple_set_modified (copy, true); - } - - if (gimple_debug_nonbind_marker_p (stmt)) - cfun->debug_marker_count++; - - return copy; -} - -/* Move OLD_STMT's vuse and vdef operands to NEW_STMT, on the assumption - that OLD_STMT is about to be removed. */ - -void -gimple_move_vops (gimple *new_stmt, gimple *old_stmt) -{ - tree vdef = gimple_vdef (old_stmt); - gimple_set_vuse (new_stmt, gimple_vuse (old_stmt)); - gimple_set_vdef (new_stmt, vdef); - if (vdef && TREE_CODE (vdef) == SSA_NAME) - SSA_NAME_DEF_STMT (vdef) = new_stmt; -} - -/* Return true if statement S has side-effects. We consider a - statement to have side effects if: - - - It is a GIMPLE_CALL not marked with ECF_PURE or ECF_CONST. - - Any of its operands are marked TREE_THIS_VOLATILE or TREE_SIDE_EFFECTS. */ - -bool -gimple_has_side_effects (const gimple *s) -{ - if (is_gimple_debug (s)) - return false; - - /* We don't have to scan the arguments to check for - volatile arguments, though, at present, we still - do a scan to check for TREE_SIDE_EFFECTS. */ - if (gimple_has_volatile_ops (s)) - return true; - - if (gimple_code (s) == GIMPLE_ASM - && gimple_asm_volatile_p (as_a <const gasm *> (s))) - return true; - - if (is_gimple_call (s)) - { - int flags = gimple_call_flags (s); - - /* An infinite loop is considered a side effect. */ - if (!(flags & (ECF_CONST | ECF_PURE)) - || (flags & ECF_LOOPING_CONST_OR_PURE)) - return true; - - return false; - } - - return false; -} - -/* Helper for gimple_could_trap_p and gimple_assign_rhs_could_trap_p. - Return true if S can trap. When INCLUDE_MEM is true, check whether - the memory operations could trap. When INCLUDE_STORES is true and - S is a GIMPLE_ASSIGN, the LHS of the assignment is also checked. */ - -bool -gimple_could_trap_p_1 (const gimple *s, bool include_mem, bool include_stores) -{ - tree t, div = NULL_TREE; - enum tree_code op; - - if (include_mem) - { - unsigned i, start = (is_gimple_assign (s) && !include_stores) ? 1 : 0; - - for (i = start; i < gimple_num_ops (s); i++) - if (tree_could_trap_p (gimple_op (s, i))) - return true; - } - - switch (gimple_code (s)) - { - case GIMPLE_ASM: - return gimple_asm_volatile_p (as_a <const gasm *> (s)); - - case GIMPLE_CALL: - if (gimple_call_internal_p (s)) - return false; - t = gimple_call_fndecl (s); - /* Assume that indirect and calls to weak functions may trap. */ - if (!t || !DECL_P (t) || DECL_WEAK (t)) - return true; - return false; - - case GIMPLE_ASSIGN: - op = gimple_assign_rhs_code (s); - - /* For COND_EXPR only the condition may trap. */ - if (op == COND_EXPR) - return tree_could_trap_p (gimple_assign_rhs1 (s)); - - /* For comparisons we need to check rhs operand types instead of lhs type - (which is BOOLEAN_TYPE). */ - if (TREE_CODE_CLASS (op) == tcc_comparison) - t = TREE_TYPE (gimple_assign_rhs1 (s)); - else - t = TREE_TYPE (gimple_assign_lhs (s)); - - if (get_gimple_rhs_class (op) == GIMPLE_BINARY_RHS) - div = gimple_assign_rhs2 (s); - - return (operation_could_trap_p (op, FLOAT_TYPE_P (t), - (INTEGRAL_TYPE_P (t) - && TYPE_OVERFLOW_TRAPS (t)), - div)); - - case GIMPLE_COND: - t = TREE_TYPE (gimple_cond_lhs (s)); - return operation_could_trap_p (gimple_cond_code (s), - FLOAT_TYPE_P (t), false, NULL_TREE); - - default: - break; - } - - return false; -} - -/* Return true if statement S can trap. */ - -bool -gimple_could_trap_p (const gimple *s) -{ - return gimple_could_trap_p_1 (s, true, true); -} - -/* Return true if RHS of a GIMPLE_ASSIGN S can trap. */ - -bool -gimple_assign_rhs_could_trap_p (gimple *s) -{ - gcc_assert (is_gimple_assign (s)); - return gimple_could_trap_p_1 (s, true, false); -} - - -/* Print debugging information for gimple stmts generated. */ - -void -dump_gimple_statistics (void) -{ - int i; - uint64_t total_tuples = 0, total_bytes = 0; - - if (! GATHER_STATISTICS) - { - fprintf (stderr, "No GIMPLE statistics\n"); - return; - } - - fprintf (stderr, "\nGIMPLE statements\n"); - fprintf (stderr, "Kind Stmts Bytes\n"); - fprintf (stderr, "---------------------------------------\n"); - for (i = 0; i < (int) gimple_alloc_kind_all; ++i) - { - fprintf (stderr, "%-20s %7" PRIu64 "%c %10" PRIu64 "%c\n", - gimple_alloc_kind_names[i], - SIZE_AMOUNT (gimple_alloc_counts[i]), - SIZE_AMOUNT (gimple_alloc_sizes[i])); - total_tuples += gimple_alloc_counts[i]; - total_bytes += gimple_alloc_sizes[i]; - } - fprintf (stderr, "---------------------------------------\n"); - fprintf (stderr, "%-20s %7" PRIu64 "%c %10" PRIu64 "%c\n", "Total", - SIZE_AMOUNT (total_tuples), SIZE_AMOUNT (total_bytes)); - fprintf (stderr, "---------------------------------------\n"); -} - - -/* Return the number of operands needed on the RHS of a GIMPLE - assignment for an expression with tree code CODE. */ - -unsigned -get_gimple_rhs_num_ops (enum tree_code code) -{ - switch (get_gimple_rhs_class (code)) - { - case GIMPLE_UNARY_RHS: - case GIMPLE_SINGLE_RHS: - return 1; - case GIMPLE_BINARY_RHS: - return 2; - case GIMPLE_TERNARY_RHS: - return 3; - default: - gcc_unreachable (); - } -} - -#define DEFTREECODE(SYM, STRING, TYPE, NARGS) \ - (unsigned char) \ - ((TYPE) == tcc_unary ? GIMPLE_UNARY_RHS \ - : ((TYPE) == tcc_binary \ - || (TYPE) == tcc_comparison) ? GIMPLE_BINARY_RHS \ - : ((TYPE) == tcc_constant \ - || (TYPE) == tcc_declaration \ - || (TYPE) == tcc_reference) ? GIMPLE_SINGLE_RHS \ - : ((SYM) == TRUTH_AND_EXPR \ - || (SYM) == TRUTH_OR_EXPR \ - || (SYM) == TRUTH_XOR_EXPR) ? GIMPLE_BINARY_RHS \ - : (SYM) == TRUTH_NOT_EXPR ? GIMPLE_UNARY_RHS \ - : ((SYM) == COND_EXPR \ - || (SYM) == WIDEN_MULT_PLUS_EXPR \ - || (SYM) == WIDEN_MULT_MINUS_EXPR \ - || (SYM) == DOT_PROD_EXPR \ - || (SYM) == SAD_EXPR \ - || (SYM) == REALIGN_LOAD_EXPR \ - || (SYM) == VEC_COND_EXPR \ - || (SYM) == VEC_PERM_EXPR \ - || (SYM) == BIT_INSERT_EXPR) ? GIMPLE_TERNARY_RHS \ - : ((SYM) == CONSTRUCTOR \ - || (SYM) == OBJ_TYPE_REF \ - || (SYM) == ASSERT_EXPR \ - || (SYM) == ADDR_EXPR \ - || (SYM) == WITH_SIZE_EXPR \ - || (SYM) == SSA_NAME) ? GIMPLE_SINGLE_RHS \ - : GIMPLE_INVALID_RHS), -#define END_OF_BASE_TREE_CODES (unsigned char) GIMPLE_INVALID_RHS, - -const unsigned char gimple_rhs_class_table[] = { -#include "all-tree.def" -}; - -#undef DEFTREECODE -#undef END_OF_BASE_TREE_CODES - -/* Canonicalize a tree T for use in a COND_EXPR as conditional. Returns - a canonicalized tree that is valid for a COND_EXPR or NULL_TREE, if - we failed to create one. */ - -tree -canonicalize_cond_expr_cond (tree t) -{ - /* Strip conversions around boolean operations. */ - if (CONVERT_EXPR_P (t) - && (truth_value_p (TREE_CODE (TREE_OPERAND (t, 0))) - || TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) - == BOOLEAN_TYPE)) - t = TREE_OPERAND (t, 0); - - /* For !x use x == 0. */ - if (TREE_CODE (t) == TRUTH_NOT_EXPR) - { - tree top0 = TREE_OPERAND (t, 0); - t = build2 (EQ_EXPR, TREE_TYPE (t), - top0, build_int_cst (TREE_TYPE (top0), 0)); - } - /* For cmp ? 1 : 0 use cmp. */ - else if (TREE_CODE (t) == COND_EXPR - && COMPARISON_CLASS_P (TREE_OPERAND (t, 0)) - && integer_onep (TREE_OPERAND (t, 1)) - && integer_zerop (TREE_OPERAND (t, 2))) - { - tree top0 = TREE_OPERAND (t, 0); - t = build2 (TREE_CODE (top0), TREE_TYPE (t), - TREE_OPERAND (top0, 0), TREE_OPERAND (top0, 1)); - } - /* For x ^ y use x != y. */ - else if (TREE_CODE (t) == BIT_XOR_EXPR) - t = build2 (NE_EXPR, TREE_TYPE (t), - TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)); - - if (is_gimple_condexpr (t)) - return t; - - return NULL_TREE; -} - -/* Build a GIMPLE_CALL identical to STMT but skipping the arguments in - the positions marked by the set ARGS_TO_SKIP. */ - -gcall * -gimple_call_copy_skip_args (gcall *stmt, bitmap args_to_skip) -{ - int i; - int nargs = gimple_call_num_args (stmt); - auto_vec<tree> vargs (nargs); - gcall *new_stmt; - - for (i = 0; i < nargs; i++) - if (!bitmap_bit_p (args_to_skip, i)) - vargs.quick_push (gimple_call_arg (stmt, i)); - - if (gimple_call_internal_p (stmt)) - new_stmt = gimple_build_call_internal_vec (gimple_call_internal_fn (stmt), - vargs); - else - new_stmt = gimple_build_call_vec (gimple_call_fn (stmt), vargs); - - if (gimple_call_lhs (stmt)) - gimple_call_set_lhs (new_stmt, gimple_call_lhs (stmt)); - - gimple_set_vuse (new_stmt, gimple_vuse (stmt)); - gimple_set_vdef (new_stmt, gimple_vdef (stmt)); - - if (gimple_has_location (stmt)) - gimple_set_location (new_stmt, gimple_location (stmt)); - gimple_call_copy_flags (new_stmt, stmt); - gimple_call_set_chain (new_stmt, gimple_call_chain (stmt)); - - gimple_set_modified (new_stmt, true); - - return new_stmt; -} - - - -/* Return true if the field decls F1 and F2 are at the same offset. - - This is intended to be used on GIMPLE types only. */ - -bool -gimple_compare_field_offset (tree f1, tree f2) -{ - if (DECL_OFFSET_ALIGN (f1) == DECL_OFFSET_ALIGN (f2)) - { - tree offset1 = DECL_FIELD_OFFSET (f1); - tree offset2 = DECL_FIELD_OFFSET (f2); - return ((offset1 == offset2 - /* Once gimplification is done, self-referential offsets are - instantiated as operand #2 of the COMPONENT_REF built for - each access and reset. Therefore, they are not relevant - anymore and fields are interchangeable provided that they - represent the same access. */ - || (TREE_CODE (offset1) == PLACEHOLDER_EXPR - && TREE_CODE (offset2) == PLACEHOLDER_EXPR - && (DECL_SIZE (f1) == DECL_SIZE (f2) - || (TREE_CODE (DECL_SIZE (f1)) == PLACEHOLDER_EXPR - && TREE_CODE (DECL_SIZE (f2)) == PLACEHOLDER_EXPR) - || operand_equal_p (DECL_SIZE (f1), DECL_SIZE (f2), 0)) - && DECL_ALIGN (f1) == DECL_ALIGN (f2)) - || operand_equal_p (offset1, offset2, 0)) - && tree_int_cst_equal (DECL_FIELD_BIT_OFFSET (f1), - DECL_FIELD_BIT_OFFSET (f2))); - } - - /* Fortran and C do not always agree on what DECL_OFFSET_ALIGN - should be, so handle differing ones specially by decomposing - the offset into a byte and bit offset manually. */ - if (tree_fits_shwi_p (DECL_FIELD_OFFSET (f1)) - && tree_fits_shwi_p (DECL_FIELD_OFFSET (f2))) - { - unsigned HOST_WIDE_INT byte_offset1, byte_offset2; - unsigned HOST_WIDE_INT bit_offset1, bit_offset2; - bit_offset1 = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (f1)); - byte_offset1 = (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f1)) - + bit_offset1 / BITS_PER_UNIT); - bit_offset2 = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (f2)); - byte_offset2 = (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f2)) - + bit_offset2 / BITS_PER_UNIT); - if (byte_offset1 != byte_offset2) - return false; - return bit_offset1 % BITS_PER_UNIT == bit_offset2 % BITS_PER_UNIT; - } - - return false; -} - - -/* Return a type the same as TYPE except unsigned or - signed according to UNSIGNEDP. */ - -static tree -gimple_signed_or_unsigned_type (bool unsignedp, tree type) -{ - tree type1; - int i; - - type1 = TYPE_MAIN_VARIANT (type); - if (type1 == signed_char_type_node - || type1 == char_type_node - || type1 == unsigned_char_type_node) - return unsignedp ? unsigned_char_type_node : signed_char_type_node; - if (type1 == integer_type_node || type1 == unsigned_type_node) - return unsignedp ? unsigned_type_node : integer_type_node; - if (type1 == short_integer_type_node || type1 == short_unsigned_type_node) - return unsignedp ? short_unsigned_type_node : short_integer_type_node; - if (type1 == long_integer_type_node || type1 == long_unsigned_type_node) - return unsignedp ? long_unsigned_type_node : long_integer_type_node; - if (type1 == long_long_integer_type_node - || type1 == long_long_unsigned_type_node) - return unsignedp - ? long_long_unsigned_type_node - : long_long_integer_type_node; - - for (i = 0; i < NUM_INT_N_ENTS; i ++) - if (int_n_enabled_p[i] - && (type1 == int_n_trees[i].unsigned_type - || type1 == int_n_trees[i].signed_type)) - return unsignedp - ? int_n_trees[i].unsigned_type - : int_n_trees[i].signed_type; - -#if HOST_BITS_PER_WIDE_INT >= 64 - if (type1 == intTI_type_node || type1 == unsigned_intTI_type_node) - return unsignedp ? unsigned_intTI_type_node : intTI_type_node; -#endif - if (type1 == intDI_type_node || type1 == unsigned_intDI_type_node) - return unsignedp ? unsigned_intDI_type_node : intDI_type_node; - if (type1 == intSI_type_node || type1 == unsigned_intSI_type_node) - return unsignedp ? unsigned_intSI_type_node : intSI_type_node; - if (type1 == intHI_type_node || type1 == unsigned_intHI_type_node) - return unsignedp ? unsigned_intHI_type_node : intHI_type_node; - if (type1 == intQI_type_node || type1 == unsigned_intQI_type_node) - return unsignedp ? unsigned_intQI_type_node : intQI_type_node; - -#define GIMPLE_FIXED_TYPES(NAME) \ - if (type1 == short_ ## NAME ## _type_node \ - || type1 == unsigned_short_ ## NAME ## _type_node) \ - return unsignedp ? unsigned_short_ ## NAME ## _type_node \ - : short_ ## NAME ## _type_node; \ - if (type1 == NAME ## _type_node \ - || type1 == unsigned_ ## NAME ## _type_node) \ - return unsignedp ? unsigned_ ## NAME ## _type_node \ - : NAME ## _type_node; \ - if (type1 == long_ ## NAME ## _type_node \ - || type1 == unsigned_long_ ## NAME ## _type_node) \ - return unsignedp ? unsigned_long_ ## NAME ## _type_node \ - : long_ ## NAME ## _type_node; \ - if (type1 == long_long_ ## NAME ## _type_node \ - || type1 == unsigned_long_long_ ## NAME ## _type_node) \ - return unsignedp ? unsigned_long_long_ ## NAME ## _type_node \ - : long_long_ ## NAME ## _type_node; - -#define GIMPLE_FIXED_MODE_TYPES(NAME) \ - if (type1 == NAME ## _type_node \ - || type1 == u ## NAME ## _type_node) \ - return unsignedp ? u ## NAME ## _type_node \ - : NAME ## _type_node; - -#define GIMPLE_FIXED_TYPES_SAT(NAME) \ - if (type1 == sat_ ## short_ ## NAME ## _type_node \ - || type1 == sat_ ## unsigned_short_ ## NAME ## _type_node) \ - return unsignedp ? sat_ ## unsigned_short_ ## NAME ## _type_node \ - : sat_ ## short_ ## NAME ## _type_node; \ - if (type1 == sat_ ## NAME ## _type_node \ - || type1 == sat_ ## unsigned_ ## NAME ## _type_node) \ - return unsignedp ? sat_ ## unsigned_ ## NAME ## _type_node \ - : sat_ ## NAME ## _type_node; \ - if (type1 == sat_ ## long_ ## NAME ## _type_node \ - || type1 == sat_ ## unsigned_long_ ## NAME ## _type_node) \ - return unsignedp ? sat_ ## unsigned_long_ ## NAME ## _type_node \ - : sat_ ## long_ ## NAME ## _type_node; \ - if (type1 == sat_ ## long_long_ ## NAME ## _type_node \ - || type1 == sat_ ## unsigned_long_long_ ## NAME ## _type_node) \ - return unsignedp ? sat_ ## unsigned_long_long_ ## NAME ## _type_node \ - : sat_ ## long_long_ ## NAME ## _type_node; - -#define GIMPLE_FIXED_MODE_TYPES_SAT(NAME) \ - if (type1 == sat_ ## NAME ## _type_node \ - || type1 == sat_ ## u ## NAME ## _type_node) \ - return unsignedp ? sat_ ## u ## NAME ## _type_node \ - : sat_ ## NAME ## _type_node; - - GIMPLE_FIXED_TYPES (fract); - GIMPLE_FIXED_TYPES_SAT (fract); - GIMPLE_FIXED_TYPES (accum); - GIMPLE_FIXED_TYPES_SAT (accum); - - GIMPLE_FIXED_MODE_TYPES (qq); - GIMPLE_FIXED_MODE_TYPES (hq); - GIMPLE_FIXED_MODE_TYPES (sq); - GIMPLE_FIXED_MODE_TYPES (dq); - GIMPLE_FIXED_MODE_TYPES (tq); - GIMPLE_FIXED_MODE_TYPES_SAT (qq); - GIMPLE_FIXED_MODE_TYPES_SAT (hq); - GIMPLE_FIXED_MODE_TYPES_SAT (sq); - GIMPLE_FIXED_MODE_TYPES_SAT (dq); - GIMPLE_FIXED_MODE_TYPES_SAT (tq); - GIMPLE_FIXED_MODE_TYPES (ha); - GIMPLE_FIXED_MODE_TYPES (sa); - GIMPLE_FIXED_MODE_TYPES (da); - GIMPLE_FIXED_MODE_TYPES (ta); - GIMPLE_FIXED_MODE_TYPES_SAT (ha); - GIMPLE_FIXED_MODE_TYPES_SAT (sa); - GIMPLE_FIXED_MODE_TYPES_SAT (da); - GIMPLE_FIXED_MODE_TYPES_SAT (ta); - - /* For ENUMERAL_TYPEs in C++, must check the mode of the types, not - the precision; they have precision set to match their range, but - may use a wider mode to match an ABI. If we change modes, we may - wind up with bad conversions. For INTEGER_TYPEs in C, must check - the precision as well, so as to yield correct results for - bit-field types. C++ does not have these separate bit-field - types, and producing a signed or unsigned variant of an - ENUMERAL_TYPE may cause other problems as well. */ - if (!INTEGRAL_TYPE_P (type) - || TYPE_UNSIGNED (type) == unsignedp) - return type; - -#define TYPE_OK(node) \ - (TYPE_MODE (type) == TYPE_MODE (node) \ - && TYPE_PRECISION (type) == TYPE_PRECISION (node)) - if (TYPE_OK (signed_char_type_node)) - return unsignedp ? unsigned_char_type_node : signed_char_type_node; - if (TYPE_OK (integer_type_node)) - return unsignedp ? unsigned_type_node : integer_type_node; - if (TYPE_OK (short_integer_type_node)) - return unsignedp ? short_unsigned_type_node : short_integer_type_node; - if (TYPE_OK (long_integer_type_node)) - return unsignedp ? long_unsigned_type_node : long_integer_type_node; - if (TYPE_OK (long_long_integer_type_node)) - return (unsignedp - ? long_long_unsigned_type_node - : long_long_integer_type_node); - - for (i = 0; i < NUM_INT_N_ENTS; i ++) - if (int_n_enabled_p[i] - && TYPE_MODE (type) == int_n_data[i].m - && TYPE_PRECISION (type) == int_n_data[i].bitsize) - return unsignedp - ? int_n_trees[i].unsigned_type - : int_n_trees[i].signed_type; - -#if HOST_BITS_PER_WIDE_INT >= 64 - if (TYPE_OK (intTI_type_node)) - return unsignedp ? unsigned_intTI_type_node : intTI_type_node; -#endif - if (TYPE_OK (intDI_type_node)) - return unsignedp ? unsigned_intDI_type_node : intDI_type_node; - if (TYPE_OK (intSI_type_node)) - return unsignedp ? unsigned_intSI_type_node : intSI_type_node; - if (TYPE_OK (intHI_type_node)) - return unsignedp ? unsigned_intHI_type_node : intHI_type_node; - if (TYPE_OK (intQI_type_node)) - return unsignedp ? unsigned_intQI_type_node : intQI_type_node; - -#undef GIMPLE_FIXED_TYPES -#undef GIMPLE_FIXED_MODE_TYPES -#undef GIMPLE_FIXED_TYPES_SAT -#undef GIMPLE_FIXED_MODE_TYPES_SAT -#undef TYPE_OK - - return build_nonstandard_integer_type (TYPE_PRECISION (type), unsignedp); -} - - -/* Return an unsigned type the same as TYPE in other respects. */ - -tree -gimple_unsigned_type (tree type) -{ - return gimple_signed_or_unsigned_type (true, type); -} - - -/* Return a signed type the same as TYPE in other respects. */ - -tree -gimple_signed_type (tree type) -{ - return gimple_signed_or_unsigned_type (false, type); -} - - -/* Return the typed-based alias set for T, which may be an expression - or a type. Return -1 if we don't do anything special. */ - -alias_set_type -gimple_get_alias_set (tree t) -{ - /* That's all the expressions we handle specially. */ - if (!TYPE_P (t)) - return -1; - - /* For convenience, follow the C standard when dealing with - character types. Any object may be accessed via an lvalue that - has character type. */ - if (t == char_type_node - || t == signed_char_type_node - || t == unsigned_char_type_node) - return 0; - - /* Allow aliasing between signed and unsigned variants of the same - type. We treat the signed variant as canonical. */ - if (TREE_CODE (t) == INTEGER_TYPE && TYPE_UNSIGNED (t)) - { - tree t1 = gimple_signed_type (t); - - /* t1 == t can happen for boolean nodes which are always unsigned. */ - if (t1 != t) - return get_alias_set (t1); - } - - /* Allow aliasing between enumeral types and the underlying - integer type. This is required for C since those are - compatible types. */ - else if (TREE_CODE (t) == ENUMERAL_TYPE) - { - tree t1 = lang_hooks.types.type_for_size (tree_to_uhwi (TYPE_SIZE (t)), - false /* short-cut above */); - return get_alias_set (t1); - } - - return -1; -} - - -/* Helper for gimple_ior_addresses_taken_1. */ - -static bool -gimple_ior_addresses_taken_1 (gimple *, tree addr, tree, void *data) -{ - bitmap addresses_taken = (bitmap)data; - addr = get_base_address (addr); - if (addr - && DECL_P (addr)) - { - bitmap_set_bit (addresses_taken, DECL_UID (addr)); - return true; - } - return false; -} - -/* Set the bit for the uid of all decls that have their address taken - in STMT in the ADDRESSES_TAKEN bitmap. Returns true if there - were any in this stmt. */ - -bool -gimple_ior_addresses_taken (bitmap addresses_taken, gimple *stmt) -{ - return walk_stmt_load_store_addr_ops (stmt, addresses_taken, NULL, NULL, - gimple_ior_addresses_taken_1); -} - - -/* Return true when STMTs arguments and return value match those of FNDECL, - a decl of a builtin function. */ - -bool -gimple_builtin_call_types_compatible_p (const gimple *stmt, tree fndecl) -{ - gcc_checking_assert (DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN); - - tree ret = gimple_call_lhs (stmt); - if (ret - && !useless_type_conversion_p (TREE_TYPE (ret), - TREE_TYPE (TREE_TYPE (fndecl)))) - return false; - - tree targs = TYPE_ARG_TYPES (TREE_TYPE (fndecl)); - unsigned nargs = gimple_call_num_args (stmt); - for (unsigned i = 0; i < nargs; ++i) - { - /* Variadic args follow. */ - if (!targs) - return true; - tree arg = gimple_call_arg (stmt, i); - tree type = TREE_VALUE (targs); - if (!useless_type_conversion_p (type, TREE_TYPE (arg)) - /* char/short integral arguments are promoted to int - by several frontends if targetm.calls.promote_prototypes - is true. Allow such promotion too. */ - && !(INTEGRAL_TYPE_P (type) - && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node) - && targetm.calls.promote_prototypes (TREE_TYPE (fndecl)) - && useless_type_conversion_p (integer_type_node, - TREE_TYPE (arg)))) - return false; - targs = TREE_CHAIN (targs); - } - if (targs && !VOID_TYPE_P (TREE_VALUE (targs))) - return false; - return true; -} - -/* Return true when STMT is operator a replaceable delete call. */ - -bool -gimple_call_operator_delete_p (const gcall *stmt) -{ - tree fndecl; - - if ((fndecl = gimple_call_fndecl (stmt)) != NULL_TREE) - return DECL_IS_OPERATOR_DELETE_P (fndecl); - return false; -} - -/* Return true when STMT is builtins call. */ - -bool -gimple_call_builtin_p (const gimple *stmt) -{ - tree fndecl; - if (is_gimple_call (stmt) - && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE - && DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN) - return gimple_builtin_call_types_compatible_p (stmt, fndecl); - return false; -} - -/* Return true when STMT is builtins call to CLASS. */ - -bool -gimple_call_builtin_p (const gimple *stmt, enum built_in_class klass) -{ - tree fndecl; - if (is_gimple_call (stmt) - && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE - && DECL_BUILT_IN_CLASS (fndecl) == klass) - return gimple_builtin_call_types_compatible_p (stmt, fndecl); - return false; -} - -/* Return true when STMT is builtins call to CODE of CLASS. */ - -bool -gimple_call_builtin_p (const gimple *stmt, enum built_in_function code) -{ - tree fndecl; - if (is_gimple_call (stmt) - && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE - && fndecl_built_in_p (fndecl, code)) - return gimple_builtin_call_types_compatible_p (stmt, fndecl); - return false; -} - -/* If CALL is a call to a combined_fn (i.e. an internal function or - a normal built-in function), return its code, otherwise return - CFN_LAST. */ - -combined_fn -gimple_call_combined_fn (const gimple *stmt) -{ - if (const gcall *call = dyn_cast <const gcall *> (stmt)) - { - if (gimple_call_internal_p (call)) - return as_combined_fn (gimple_call_internal_fn (call)); - - tree fndecl = gimple_call_fndecl (stmt); - if (fndecl - && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL) - && gimple_builtin_call_types_compatible_p (stmt, fndecl)) - return as_combined_fn (DECL_FUNCTION_CODE (fndecl)); - } - return CFN_LAST; -} - -/* Return true if STMT clobbers memory. STMT is required to be a - GIMPLE_ASM. */ - -bool -gimple_asm_clobbers_memory_p (const gasm *stmt) -{ - unsigned i; - - for (i = 0; i < gimple_asm_nclobbers (stmt); i++) - { - tree op = gimple_asm_clobber_op (stmt, i); - if (strcmp (TREE_STRING_POINTER (TREE_VALUE (op)), "memory") == 0) - return true; - } - - /* Non-empty basic ASM implicitly clobbers memory. */ - if (gimple_asm_input_p (stmt) && strlen (gimple_asm_string (stmt)) != 0) - return true; - - return false; -} - -/* Dump bitmap SET (assumed to contain VAR_DECLs) to FILE. */ - -void -dump_decl_set (FILE *file, bitmap set) -{ - if (set) - { - bitmap_iterator bi; - unsigned i; - - fprintf (file, "{ "); - - EXECUTE_IF_SET_IN_BITMAP (set, 0, i, bi) - { - fprintf (file, "D.%u", i); - fprintf (file, " "); - } - - fprintf (file, "}"); - } - else - fprintf (file, "NIL"); -} - -/* Return true when CALL is a call stmt that definitely doesn't - free any memory or makes it unavailable otherwise. */ -bool -nonfreeing_call_p (gimple *call) -{ - if (gimple_call_builtin_p (call, BUILT_IN_NORMAL) - && gimple_call_flags (call) & ECF_LEAF) - switch (DECL_FUNCTION_CODE (gimple_call_fndecl (call))) - { - /* Just in case these become ECF_LEAF in the future. */ - case BUILT_IN_FREE: - case BUILT_IN_TM_FREE: - case BUILT_IN_REALLOC: - case BUILT_IN_STACK_RESTORE: - return false; - default: - return true; - } - else if (gimple_call_internal_p (call)) - switch (gimple_call_internal_fn (call)) - { - case IFN_ABNORMAL_DISPATCHER: - return true; - case IFN_ASAN_MARK: - return tree_to_uhwi (gimple_call_arg (call, 0)) == ASAN_MARK_UNPOISON; - default: - if (gimple_call_flags (call) & ECF_LEAF) - return true; - return false; - } - - tree fndecl = gimple_call_fndecl (call); - if (!fndecl) - return false; - struct cgraph_node *n = cgraph_node::get (fndecl); - if (!n) - return false; - enum availability availability; - n = n->function_symbol (&availability); - if (!n || availability <= AVAIL_INTERPOSABLE) - return false; - return n->nonfreeing_fn; -} - -/* Return true when CALL is a call stmt that definitely need not - be considered to be a memory barrier. */ -bool -nonbarrier_call_p (gimple *call) -{ - if (gimple_call_flags (call) & (ECF_PURE | ECF_CONST)) - return true; - /* Should extend this to have a nonbarrier_fn flag, just as above in - the nonfreeing case. */ - return false; -} - -/* Callback for walk_stmt_load_store_ops. - - Return TRUE if OP will dereference the tree stored in DATA, FALSE - otherwise. - - This routine only makes a superficial check for a dereference. Thus - it must only be used if it is safe to return a false negative. */ -static bool -check_loadstore (gimple *, tree op, tree, void *data) -{ - if (TREE_CODE (op) == MEM_REF || TREE_CODE (op) == TARGET_MEM_REF) - { - /* Some address spaces may legitimately dereference zero. */ - addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (op)); - if (targetm.addr_space.zero_address_valid (as)) - return false; - - return operand_equal_p (TREE_OPERAND (op, 0), (tree)data, 0); - } - return false; -} - - -/* Return true if OP can be inferred to be non-NULL after STMT executes, - either by using a pointer dereference or attributes. */ -bool -infer_nonnull_range (gimple *stmt, tree op) -{ - return (infer_nonnull_range_by_dereference (stmt, op) - || infer_nonnull_range_by_attribute (stmt, op)); -} - -/* Return true if OP can be inferred to be non-NULL after STMT - executes by using a pointer dereference. */ -bool -infer_nonnull_range_by_dereference (gimple *stmt, tree op) -{ - /* We can only assume that a pointer dereference will yield - non-NULL if -fdelete-null-pointer-checks is enabled. */ - if (!flag_delete_null_pointer_checks - || !POINTER_TYPE_P (TREE_TYPE (op)) - || gimple_code (stmt) == GIMPLE_ASM - || gimple_clobber_p (stmt)) - return false; - - if (walk_stmt_load_store_ops (stmt, (void *)op, - check_loadstore, check_loadstore)) - return true; - - return false; -} - -/* Return true if OP can be inferred to be a non-NULL after STMT - executes by using attributes. */ -bool -infer_nonnull_range_by_attribute (gimple *stmt, tree op) -{ - /* We can only assume that a pointer dereference will yield - non-NULL if -fdelete-null-pointer-checks is enabled. */ - if (!flag_delete_null_pointer_checks - || !POINTER_TYPE_P (TREE_TYPE (op)) - || gimple_code (stmt) == GIMPLE_ASM) - return false; - - if (is_gimple_call (stmt) && !gimple_call_internal_p (stmt)) - { - tree fntype = gimple_call_fntype (stmt); - tree attrs = TYPE_ATTRIBUTES (fntype); - for (; attrs; attrs = TREE_CHAIN (attrs)) - { - attrs = lookup_attribute ("nonnull", attrs); - - /* If "nonnull" wasn't specified, we know nothing about - the argument. */ - if (attrs == NULL_TREE) - return false; - - /* If "nonnull" applies to all the arguments, then ARG - is non-null if it's in the argument list. */ - if (TREE_VALUE (attrs) == NULL_TREE) - { - for (unsigned int i = 0; i < gimple_call_num_args (stmt); i++) - { - if (POINTER_TYPE_P (TREE_TYPE (gimple_call_arg (stmt, i))) - && operand_equal_p (op, gimple_call_arg (stmt, i), 0)) - return true; - } - return false; - } - - /* Now see if op appears in the nonnull list. */ - for (tree t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t)) - { - unsigned int idx = TREE_INT_CST_LOW (TREE_VALUE (t)) - 1; - if (idx < gimple_call_num_args (stmt)) - { - tree arg = gimple_call_arg (stmt, idx); - if (operand_equal_p (op, arg, 0)) - return true; - } - } - } - } - - /* If this function is marked as returning non-null, then we can - infer OP is non-null if it is used in the return statement. */ - if (greturn *return_stmt = dyn_cast <greturn *> (stmt)) - if (gimple_return_retval (return_stmt) - && operand_equal_p (gimple_return_retval (return_stmt), op, 0) - && lookup_attribute ("returns_nonnull", - TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl)))) - return true; - - return false; -} - -/* Compare two case labels. Because the front end should already have - made sure that case ranges do not overlap, it is enough to only compare - the CASE_LOW values of each case label. */ - -static int -compare_case_labels (const void *p1, const void *p2) -{ - const_tree const case1 = *(const_tree const*)p1; - const_tree const case2 = *(const_tree const*)p2; - - /* The 'default' case label always goes first. */ - if (!CASE_LOW (case1)) - return -1; - else if (!CASE_LOW (case2)) - return 1; - else - return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2)); -} - -/* Sort the case labels in LABEL_VEC in place in ascending order. */ - -void -sort_case_labels (vec<tree> &label_vec) -{ - label_vec.qsort (compare_case_labels); -} - -/* Prepare a vector of case labels to be used in a GIMPLE_SWITCH statement. - - LABELS is a vector that contains all case labels to look at. - - INDEX_TYPE is the type of the switch index expression. Case labels - in LABELS are discarded if their values are not in the value range - covered by INDEX_TYPE. The remaining case label values are folded - to INDEX_TYPE. - - If a default case exists in LABELS, it is removed from LABELS and - returned in DEFAULT_CASEP. If no default case exists, but the - case labels already cover the whole range of INDEX_TYPE, a default - case is returned pointing to one of the existing case labels. - Otherwise DEFAULT_CASEP is set to NULL_TREE. - - DEFAULT_CASEP may be NULL, in which case the above comment doesn't - apply and no action is taken regardless of whether a default case is - found or not. */ - -void -preprocess_case_label_vec_for_gimple (vec<tree> &labels, - tree index_type, - tree *default_casep) -{ - tree min_value, max_value; - tree default_case = NULL_TREE; - size_t i, len; - - i = 0; - min_value = TYPE_MIN_VALUE (index_type); - max_value = TYPE_MAX_VALUE (index_type); - while (i < labels.length ()) - { - tree elt = labels[i]; - tree low = CASE_LOW (elt); - tree high = CASE_HIGH (elt); - bool remove_element = FALSE; - - if (low) - { - gcc_checking_assert (TREE_CODE (low) == INTEGER_CST); - gcc_checking_assert (!high || TREE_CODE (high) == INTEGER_CST); - - /* This is a non-default case label, i.e. it has a value. - - See if the case label is reachable within the range of - the index type. Remove out-of-range case values. Turn - case ranges into a canonical form (high > low strictly) - and convert the case label values to the index type. - - NB: The type of gimple_switch_index() may be the promoted - type, but the case labels retain the original type. */ - - if (high) - { - /* This is a case range. Discard empty ranges. - If the bounds or the range are equal, turn this - into a simple (one-value) case. */ - int cmp = tree_int_cst_compare (high, low); - if (cmp < 0) - remove_element = TRUE; - else if (cmp == 0) - high = NULL_TREE; - } - - if (! high) - { - /* If the simple case value is unreachable, ignore it. */ - if ((TREE_CODE (min_value) == INTEGER_CST - && tree_int_cst_compare (low, min_value) < 0) - || (TREE_CODE (max_value) == INTEGER_CST - && tree_int_cst_compare (low, max_value) > 0)) - remove_element = TRUE; - else - low = fold_convert (index_type, low); - } - else - { - /* If the entire case range is unreachable, ignore it. */ - if ((TREE_CODE (min_value) == INTEGER_CST - && tree_int_cst_compare (high, min_value) < 0) - || (TREE_CODE (max_value) == INTEGER_CST - && tree_int_cst_compare (low, max_value) > 0)) - remove_element = TRUE; - else - { - /* If the lower bound is less than the index type's - minimum value, truncate the range bounds. */ - if (TREE_CODE (min_value) == INTEGER_CST - && tree_int_cst_compare (low, min_value) < 0) - low = min_value; - low = fold_convert (index_type, low); - - /* If the upper bound is greater than the index type's - maximum value, truncate the range bounds. */ - if (TREE_CODE (max_value) == INTEGER_CST - && tree_int_cst_compare (high, max_value) > 0) - high = max_value; - high = fold_convert (index_type, high); - - /* We may have folded a case range to a one-value case. */ - if (tree_int_cst_equal (low, high)) - high = NULL_TREE; - } - } - - CASE_LOW (elt) = low; - CASE_HIGH (elt) = high; - } - else - { - gcc_assert (!default_case); - default_case = elt; - /* The default case must be passed separately to the - gimple_build_switch routine. But if DEFAULT_CASEP - is NULL, we do not remove the default case (it would - be completely lost). */ - if (default_casep) - remove_element = TRUE; - } - - if (remove_element) - labels.ordered_remove (i); - else - i++; - } - len = i; - - if (!labels.is_empty ()) - sort_case_labels (labels); - - if (default_casep && !default_case) - { - /* If the switch has no default label, add one, so that we jump - around the switch body. If the labels already cover the whole - range of the switch index_type, add the default label pointing - to one of the existing labels. */ - if (len - && TYPE_MIN_VALUE (index_type) - && TYPE_MAX_VALUE (index_type) - && tree_int_cst_equal (CASE_LOW (labels[0]), - TYPE_MIN_VALUE (index_type))) - { - tree low, high = CASE_HIGH (labels[len - 1]); - if (!high) - high = CASE_LOW (labels[len - 1]); - if (tree_int_cst_equal (high, TYPE_MAX_VALUE (index_type))) - { - tree widest_label = labels[0]; - for (i = 1; i < len; i++) - { - high = CASE_LOW (labels[i]); - low = CASE_HIGH (labels[i - 1]); - if (!low) - low = CASE_LOW (labels[i - 1]); - - if (CASE_HIGH (labels[i]) != NULL_TREE - && (CASE_HIGH (widest_label) == NULL_TREE - || (wi::gtu_p - (wi::to_wide (CASE_HIGH (labels[i])) - - wi::to_wide (CASE_LOW (labels[i])), - wi::to_wide (CASE_HIGH (widest_label)) - - wi::to_wide (CASE_LOW (widest_label)))))) - widest_label = labels[i]; - - if (wi::to_wide (low) + 1 != wi::to_wide (high)) - break; - } - if (i == len) - { - /* Designate the label with the widest range to be the - default label. */ - tree label = CASE_LABEL (widest_label); - default_case = build_case_label (NULL_TREE, NULL_TREE, - label); - } - } - } - } - - if (default_casep) - *default_casep = default_case; -} - -/* Set the location of all statements in SEQ to LOC. */ - -void -gimple_seq_set_location (gimple_seq seq, location_t loc) -{ - for (gimple_stmt_iterator i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i)) - gimple_set_location (gsi_stmt (i), loc); -} - -/* Release SSA_NAMEs in SEQ as well as the GIMPLE statements. */ - -void -gimple_seq_discard (gimple_seq seq) -{ - gimple_stmt_iterator gsi; - - for (gsi = gsi_start (seq); !gsi_end_p (gsi); ) - { - gimple *stmt = gsi_stmt (gsi); - gsi_remove (&gsi, true); - release_defs (stmt); - ggc_free (stmt); - } -} - -/* See if STMT now calls function that takes no parameters and if so, drop - call arguments. This is used when devirtualization machinery redirects - to __builtin_unreachable or __cxa_pure_virtual. */ - -void -maybe_remove_unused_call_args (struct function *fn, gimple *stmt) -{ - tree decl = gimple_call_fndecl (stmt); - if (TYPE_ARG_TYPES (TREE_TYPE (decl)) - && TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl))) == void_type_node - && gimple_call_num_args (stmt)) - { - gimple_set_num_ops (stmt, 3); - update_stmt_fn (fn, stmt); - } -} - -/* Return false if STMT will likely expand to real function call. */ - -bool -gimple_inexpensive_call_p (gcall *stmt) -{ - if (gimple_call_internal_p (stmt)) - return true; - tree decl = gimple_call_fndecl (stmt); - if (decl && is_inexpensive_builtin (decl)) - return true; - return false; -} - -/* Return a non-artificial location for STMT. If STMT does not have - location information, get the location from EXPR. */ - -location_t -gimple_or_expr_nonartificial_location (gimple *stmt, tree expr) -{ - location_t loc = gimple_nonartificial_location (stmt); - if (loc == UNKNOWN_LOCATION && EXPR_HAS_LOCATION (expr)) - loc = tree_nonartificial_location (expr); - return expansion_point_location_if_in_system_header (loc); -} - - -#if CHECKING_P - -namespace selftest { - -/* Selftests for core gimple structures. */ - -/* Verify that STMT is pretty-printed as EXPECTED. - Helper function for selftests. */ - -static void -verify_gimple_pp (const char *expected, gimple *stmt) -{ - pretty_printer pp; - pp_gimple_stmt_1 (&pp, stmt, 0 /* spc */, TDF_NONE /* flags */); - ASSERT_STREQ (expected, pp_formatted_text (&pp)); -} - -/* Build a GIMPLE_ASSIGN equivalent to - tmp = 5; - and verify various properties of it. */ - -static void -test_assign_single () -{ - tree type = integer_type_node; - tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL, - get_identifier ("tmp"), - type); - tree rhs = build_int_cst (type, 5); - gassign *stmt = gimple_build_assign (lhs, rhs); - verify_gimple_pp ("tmp = 5;", stmt); - - ASSERT_TRUE (is_gimple_assign (stmt)); - ASSERT_EQ (lhs, gimple_assign_lhs (stmt)); - ASSERT_EQ (lhs, gimple_get_lhs (stmt)); - ASSERT_EQ (rhs, gimple_assign_rhs1 (stmt)); - ASSERT_EQ (NULL, gimple_assign_rhs2 (stmt)); - ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt)); - ASSERT_TRUE (gimple_assign_single_p (stmt)); - ASSERT_EQ (INTEGER_CST, gimple_assign_rhs_code (stmt)); -} - -/* Build a GIMPLE_ASSIGN equivalent to - tmp = a * b; - and verify various properties of it. */ - -static void -test_assign_binop () -{ - tree type = integer_type_node; - tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL, - get_identifier ("tmp"), - type); - tree a = build_decl (UNKNOWN_LOCATION, VAR_DECL, - get_identifier ("a"), - type); - tree b = build_decl (UNKNOWN_LOCATION, VAR_DECL, - get_identifier ("b"), - type); - gassign *stmt = gimple_build_assign (lhs, MULT_EXPR, a, b); - verify_gimple_pp ("tmp = a * b;", stmt); - - ASSERT_TRUE (is_gimple_assign (stmt)); - ASSERT_EQ (lhs, gimple_assign_lhs (stmt)); - ASSERT_EQ (lhs, gimple_get_lhs (stmt)); - ASSERT_EQ (a, gimple_assign_rhs1 (stmt)); - ASSERT_EQ (b, gimple_assign_rhs2 (stmt)); - ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt)); - ASSERT_FALSE (gimple_assign_single_p (stmt)); - ASSERT_EQ (MULT_EXPR, gimple_assign_rhs_code (stmt)); -} - -/* Build a GIMPLE_NOP and verify various properties of it. */ - -static void -test_nop_stmt () -{ - gimple *stmt = gimple_build_nop (); - verify_gimple_pp ("GIMPLE_NOP", stmt); - ASSERT_EQ (GIMPLE_NOP, gimple_code (stmt)); - ASSERT_EQ (NULL, gimple_get_lhs (stmt)); - ASSERT_FALSE (gimple_assign_single_p (stmt)); -} - -/* Build a GIMPLE_RETURN equivalent to - return 7; - and verify various properties of it. */ - -static void -test_return_stmt () -{ - tree type = integer_type_node; - tree val = build_int_cst (type, 7); - greturn *stmt = gimple_build_return (val); - verify_gimple_pp ("return 7;", stmt); - - ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt)); - ASSERT_EQ (NULL, gimple_get_lhs (stmt)); - ASSERT_EQ (val, gimple_return_retval (stmt)); - ASSERT_FALSE (gimple_assign_single_p (stmt)); -} - -/* Build a GIMPLE_RETURN equivalent to - return; - and verify various properties of it. */ - -static void -test_return_without_value () -{ - greturn *stmt = gimple_build_return (NULL); - verify_gimple_pp ("return;", stmt); - - ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt)); - ASSERT_EQ (NULL, gimple_get_lhs (stmt)); - ASSERT_EQ (NULL, gimple_return_retval (stmt)); - ASSERT_FALSE (gimple_assign_single_p (stmt)); -} - -/* Run all of the selftests within this file. */ - -void -gimple_c_tests () -{ - test_assign_single (); - test_assign_binop (); - test_nop_stmt (); - test_return_stmt (); - test_return_without_value (); -} - -} // namespace selftest - - -#endif /* CHECKING_P */ |