revert: cgraph.h (varpool_node): Add need_bounds_init field.
Reverted: 2013-11-20 Ilya Enkovich <ilya.enkovich@intel.com> * cgraph.h (varpool_node): Add need_bounds_init field. * lto-cgraph.c (lto_output_varpool_node): Output need_bounds_init value. (input_varpool_node): Read need_bounds_init value. * varpool.c (dump_varpool_node): Dump need_bounds_init field. Reverted: 2013-11-20 Ilya Enkovich <ilya.enkovich@intel.com> * dbxout.c (dbxout_type): Ignore POINTER_BOUNDS_TYPE. * dwarf2out.c (gen_subprogram_die): Ignore bound args. (gen_type_die_with_usage): Skip pointer bounds. (dwarf2out_global_decl): Likewise. Reverted: 2013-11-18 Ilya Enkovich <ilya.enkovich@intel.com> * builtin-types.def (BT_FN_PTR_CONST_PTR_VAR): New. * chkp-builtins.def (BUILT_IN_CHKP_BIND_BOUNDS): New. * cfgexpand.c (expand_call_stmt): Expand BUILT_IN_CHKP_BIND_BOUNDS. * gimple.c (gimple_call_get_nobnd_arg_index): Remove. * gimple.h (gf_mask): Add GF_CALL_WITH_BOUNDS. (gimple_call_with_bounds_p): New. (gimple_call_set_with_bounds): New. (gimple_call_num_nobnd_args): Remove. (gimple_call_nobnd_arg): Remove. * tree.h (CALL_WITH_BOUNDS_P): New. * rtl.h (CALL_EXPR_WITH_BOUNDS_P): New. Reverted: 2013-11-08 Ilya Enkovich <ilya.enkovich@intel.com> * common.opt (fcheck-pointer-bounds): Move to ... * c-family/c.opt: ... here. * langhooks-def.h (LANG_HOOKS_CHKP_SUPPORTED): Remove. (LANG_HOOKS_INITIALIZER): Remove LANG_HOOKS_CHKP_SUPPORTED. * langhooks.h (lang_hooks): Remove chkp_supported field. * toplev.c (process_options): Remove chkp_supported check. Reverted: 2013-10-30 Ilya Enkovich <ilya.enkovich@intel.com> * tree-core.h (tree_index): Add TI_POINTER_BOUNDS_TYPE. * tree.h (POINTER_BOUNDS_P): New. (BOUNDED_TYPE_P): New. (BOUNDED_P): New. (pointer_bounds_type_node): New. * tree.c (build_common_tree_nodes): Initialize pointer_bounds_type_node. * gimple.h (gimple_call_get_nobnd_arg_index): New. (gimple_call_num_nobnd_args): New. (gimple_call_nobnd_arg): New. (gimple_return_retbnd): New. (gimple_return_set_retbnd): New * gimple.c (gimple_build_return): Increase number of ops for return statement. (gimple_call_get_nobnd_arg_index): New. * gimple-pretty-print.c (dump_gimple_return): Print second op. Reverted: 2013-10-30 Ilya Enkovich <ilya.enkovich@intel.com> * ipa.c (cgraph_build_static_cdtor_1): Support contructors with "chkp ctor" and "bnd_legacy" attributes. * gimplify.c (gimplify_init_constructor): Avoid infinite loop during gimplification of bounds initializer. Reverted: 2013-10-30 Ilya Enkovich <ilya.enkovich@intel.com> * c-family/c-common.c (handle_bnd_variable_size_attribute): New. (handle_bnd_legacy): New. (c_common_attribute_table): Add bnd_variable_size and bnd_legacy. * doc/extend.texi: Document bnd_variable_size and bnd_legacy attributes. Reverted: 2013-10-29 Ilya Enkovich <ilya.enkovich@intel.com> * builtin-types.def (BT_FN_VOID_CONST_PTR): New. (BT_FN_PTR_CONST_PTR): New. (BT_FN_CONST_PTR_CONST_PTR): New. (BT_FN_PTR_CONST_PTR_SIZE): New. (BT_FN_PTR_CONST_PTR_CONST_PTR): New. (BT_FN_VOID_PTRPTR_CONST_PTR): New. (BT_FN_VOID_CONST_PTR_SIZE): New. (BT_FN_PTR_CONST_PTR_CONST_PTR_SIZE): New. * chkp-builtins.def: New. * builtins.def: include chkp-builtins.def. (DEF_CHKP_BUILTIN): New. * builtins.c (expand_builtin): Support BUILT_IN_CHKP_INIT_PTR_BOUNDS, BUILT_IN_CHKP_NULL_PTR_BOUNDS, BUILT_IN_CHKP_COPY_PTR_BOUNDS, BUILT_IN_CHKP_CHECK_PTR_LBOUNDS, BUILT_IN_CHKP_CHECK_PTR_UBOUNDS, BUILT_IN_CHKP_CHECK_PTR_BOUNDS, BUILT_IN_CHKP_SET_PTR_BOUNDS, BUILT_IN_CHKP_NARROW_PTR_BOUNDS, BUILT_IN_CHKP_STORE_PTR_BOUNDS, BUILT_IN_CHKP_GET_PTR_LBOUND, BUILT_IN_CHKP_GET_PTR_UBOUND, BUILT_IN_CHKP_BNDMK, BUILT_IN_CHKP_BNDSTX, BUILT_IN_CHKP_BNDCL, BUILT_IN_CHKP_BNDCU, BUILT_IN_CHKP_BNDLDX, BUILT_IN_CHKP_BNDRET, BUILT_IN_CHKP_INTERSECT, BUILT_IN_CHKP_ARG_BND, BUILT_IN_CHKP_NARROW, BUILT_IN_CHKP_EXTRACT_LOWER, BUILT_IN_CHKP_EXTRACT_UPPER. * common.opt (fcheck-pointer-bounds): New. * toplev.c (process_options): Check Pointer Bounds Checker is supported. * doc/extend.texi: Document Pointer Bounds Checker built-in functions. Reverted: 2013-10-30 Ilya Enkovich <ilya.enkovich@intel.com> * target.def (builtin_chkp_function): New. (chkp_bound_type): New. (chkp_bound_mode): New. (fn_abi_va_list_bounds_size): New. (load_bounds_for_arg): New. (store_bounds_for_arg): New. * targhooks.h (default_load_bounds_for_arg): New. (default_store_bounds_for_arg): New. (default_fn_abi_va_list_bounds_size): New. (default_chkp_bound_type): New. (default_chkp_bound_mode): New. (default_builtin_chkp_function): New. * targhooks.c (default_load_bounds_for_arg): New. (default_store_bounds_for_arg): New. (default_fn_abi_va_list_bounds_size): New. (default_chkp_bound_type): New. (default_chkp_bound_mode); New. (default_builtin_chkp_function): New. * doc/tm.texi.in (TARGET_FN_ABI_VA_LIST_BOUNDS_SIZE): New. (TARGET_LOAD_BOUNDS_FOR_ARG): New. (TARGET_STORE_BOUNDS_FOR_ARG): New. (TARGET_BUILTIN_CHKP_FUNCTION): New. (TARGET_CHKP_BOUND_TYPE): New. (TARGET_CHKP_BOUND_MODE): New. * doc/tm.texi: Regenerated. * langhooks.h (lang_hooks): Add chkp_supported field. * langhooks-def.h (LANG_HOOKS_CHKP_SUPPORTED): New. (LANG_HOOKS_INITIALIZER); Add LANG_HOOKS_CHKP_SUPPORTED. Reverted: 2013-10-24 Ilya Enkovich <ilya.enkovich@intel.com> * config/i386/constraints.md (B): New. (Ti): New. (Tb): New. * config/i386/i386-c.c (ix86_target_macros_internal): Add __MPX__. * config/i386/i386-modes.def (BND32): New. (BND64): New. * config/i386/i386-protos.h (ix86_bnd_prefixed_insn_p): New. * config/i386/i386.c (isa_opts): Add mmpx. (regclass_map): Add bound registers. (dbx_register_map): Likewise. (dbx64_register_map): Likewise. (svr4_dbx_register_map): Likewise. (PTA_MPX): New. (ix86_option_override_internal): Support MPX ISA. (ix86_conditional_register_usage): Support bound registers. (print_reg): Likewise. (ix86_code_end): Add MPX bnd prefix. (output_set_got): Likewise. (ix86_output_call_insn): Likewise. (ix86_print_operand): Add '!' (MPX bnd) print prefix support. (ix86_print_operand_punct_valid_p): Likewise. (ix86_print_operand_address): Support UNSPEC_BNDMK_ADDR and UNSPEC_BNDMK_ADDR. (ix86_class_likely_spilled_p): Add bound regs support. (ix86_hard_regno_mode_ok): Likewise. (x86_order_regs_for_local_alloc): Likewise. (ix86_bnd_prefixed_insn_p): New. * config/i386/i386.h (FIRST_PSEUDO_REGISTER): Fix to new value. (FIXED_REGISTERS): Add bound registers. (CALL_USED_REGISTERS): Likewise. (REG_ALLOC_ORDER): Likewise. (HARD_REGNO_NREGS): Likewise. (TARGET_MPX): New. (VALID_BND_REG_MODE): New. (FIRST_BND_REG): New. (LAST_BND_REG): New. (reg_class): Add BND_REGS. (REG_CLASS_NAMES): Likewise. (REG_CLASS_CONTENTS): Likewise. (BND_REGNO_P): New. (ANY_BND_REG_P): New. (BNDmode): New. (HI_REGISTER_NAMES): Add bound registers. * config/i386/i386.md (UNSPEC_BNDMK): New. (UNSPEC_BNDMK_ADDR): New. (UNSPEC_BNDSTX): New. (UNSPEC_BNDLDX): New. (UNSPEC_BNDLDX_ADDR): New. (UNSPEC_BNDCL): New. (UNSPEC_BNDCU): New. (UNSPEC_BNDCN): New. (UNSPEC_MPX_FENCE): New. (BND0_REG): New. (BND1_REG): New. (type): Add mpxmov, mpxmk, mpxchk, mpxld, mpxst. (length_immediate): Likewise. (prefix_0f): Likewise. (memory): Likewise. (prefix_rep): Check for bnd prefix. (length_nobnd): New. (length): Use length_nobnd if specified. (BND): New. (bnd_ptr): New. (BNDCHECK): New. (bndcheck): New. (*jcc_1): Add bnd prefix and rename length attr to length_nobnd. (*jcc_2): Likewise. (jump): Likewise. (simple_return_internal): Likewise. (simple_return_pop_internal): Likewise. (*indirect_jump): Add MPX bnd prefix. (*tablejump_1): Likewise. (simple_return_internal_long): Likewise. (simple_return_indirect_internal): Likewise. (<mode>_mk): New. (*<mode>_mk): New. (mov<mode>): New. (*mov<mode>_internal_mpx): New. (<mode>_<bndcheck>): New. (*<mode>_<bndcheck>): New. (<mode>_ldx): New. (*<mode>_ldx): New. (<mode>_stx): New. (*<mode>_stx): New. * config/i386/predicates.md (lea_address_operand): Rename to... (address_no_seg_operand): ... this. (address_mpx_no_base_operand): New. (address_mpx_no_index_operand): New. (bnd_mem_operator): New. * config/i386/i386.opt (mmpx): New. * doc/invoke.texi: Add documentation for the flags -mmpx, -mno-mpx. * doc/rtl.texi Add documentation for BND32mode and BND64mode. Reverted: 2013-10-24 Ilya Enkovich <ilya.enkovich@intel.com> * mode-classes.def (MODE_POINTER_BOUNDS): New. * tree.def (POINTER_BOUNDS_TYPE): New. * genmodes.c (complete_mode): Support MODE_POINTER_BOUNDS. (POINTER_BOUNDS_MODE): New. (make_pointer_bounds_mode): New. * machmode.h (POINTER_BOUNDS_MODE_P): New. * stor-layout.c (int_mode_for_mode): Support MODE_POINTER_BOUNDS. (layout_type): Support POINTER_BOUNDS_TYPE. * tree-pretty-print.c (dump_generic_node): Support POINTER_BOUNDS_TYPE. * tree.c (build_int_cst_wide): Support POINTER_BOUNDS_TYPE. (type_contains_placeholder_1): Likewise. * tree.h (POINTER_BOUNDS_TYPE_P): New. * varasm.c (output_constant): Support POINTER_BOUNDS_TYPE. * doc/rtl.texi (MODE_POINTER_BOUNDS): New. From-SVN: r205522
This commit is contained in:
parent
b8815bd32f
commit
089d122746
245
gcc/ChangeLog
245
gcc/ChangeLog
|
@ -1,3 +1,248 @@
|
|||
2013-11-29 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||
|
||||
Reverted:
|
||||
2013-11-20 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||
* cgraph.h (varpool_node): Add need_bounds_init field.
|
||||
* lto-cgraph.c (lto_output_varpool_node): Output
|
||||
need_bounds_init value.
|
||||
(input_varpool_node): Read need_bounds_init value.
|
||||
* varpool.c (dump_varpool_node): Dump need_bounds_init field.
|
||||
|
||||
Reverted:
|
||||
2013-11-20 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||
* dbxout.c (dbxout_type): Ignore POINTER_BOUNDS_TYPE.
|
||||
* dwarf2out.c (gen_subprogram_die): Ignore bound args.
|
||||
(gen_type_die_with_usage): Skip pointer bounds.
|
||||
(dwarf2out_global_decl): Likewise.
|
||||
|
||||
Reverted:
|
||||
2013-11-18 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||
* builtin-types.def (BT_FN_PTR_CONST_PTR_VAR): New.
|
||||
* chkp-builtins.def (BUILT_IN_CHKP_BIND_BOUNDS): New.
|
||||
* cfgexpand.c (expand_call_stmt): Expand BUILT_IN_CHKP_BIND_BOUNDS.
|
||||
* gimple.c (gimple_call_get_nobnd_arg_index): Remove.
|
||||
* gimple.h (gf_mask): Add GF_CALL_WITH_BOUNDS.
|
||||
(gimple_call_with_bounds_p): New.
|
||||
(gimple_call_set_with_bounds): New.
|
||||
(gimple_call_num_nobnd_args): Remove.
|
||||
(gimple_call_nobnd_arg): Remove.
|
||||
* tree.h (CALL_WITH_BOUNDS_P): New.
|
||||
* rtl.h (CALL_EXPR_WITH_BOUNDS_P): New.
|
||||
|
||||
Reverted:
|
||||
2013-11-08 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||
* common.opt (fcheck-pointer-bounds): Move to ...
|
||||
* c-family/c.opt: ... here.
|
||||
* langhooks-def.h (LANG_HOOKS_CHKP_SUPPORTED): Remove.
|
||||
(LANG_HOOKS_INITIALIZER): Remove LANG_HOOKS_CHKP_SUPPORTED.
|
||||
* langhooks.h (lang_hooks): Remove chkp_supported field.
|
||||
* toplev.c (process_options): Remove chkp_supported check.
|
||||
|
||||
Reverted:
|
||||
2013-10-30 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||
* tree-core.h (tree_index): Add TI_POINTER_BOUNDS_TYPE.
|
||||
* tree.h (POINTER_BOUNDS_P): New.
|
||||
(BOUNDED_TYPE_P): New.
|
||||
(BOUNDED_P): New.
|
||||
(pointer_bounds_type_node): New.
|
||||
* tree.c (build_common_tree_nodes): Initialize
|
||||
pointer_bounds_type_node.
|
||||
* gimple.h (gimple_call_get_nobnd_arg_index): New.
|
||||
(gimple_call_num_nobnd_args): New.
|
||||
(gimple_call_nobnd_arg): New.
|
||||
(gimple_return_retbnd): New.
|
||||
(gimple_return_set_retbnd): New
|
||||
* gimple.c (gimple_build_return): Increase number of ops
|
||||
for return statement.
|
||||
(gimple_call_get_nobnd_arg_index): New.
|
||||
* gimple-pretty-print.c (dump_gimple_return): Print second op.
|
||||
|
||||
Reverted:
|
||||
2013-10-30 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||
* ipa.c (cgraph_build_static_cdtor_1): Support contructors
|
||||
with "chkp ctor" and "bnd_legacy" attributes.
|
||||
* gimplify.c (gimplify_init_constructor): Avoid infinite
|
||||
loop during gimplification of bounds initializer.
|
||||
|
||||
Reverted:
|
||||
2013-10-30 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||
* c-family/c-common.c (handle_bnd_variable_size_attribute): New.
|
||||
(handle_bnd_legacy): New.
|
||||
(c_common_attribute_table): Add bnd_variable_size and bnd_legacy.
|
||||
* doc/extend.texi: Document bnd_variable_size and bnd_legacy
|
||||
attributes.
|
||||
|
||||
Reverted:
|
||||
2013-10-29 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||
* builtin-types.def (BT_FN_VOID_CONST_PTR): New.
|
||||
(BT_FN_PTR_CONST_PTR): New.
|
||||
(BT_FN_CONST_PTR_CONST_PTR): New.
|
||||
(BT_FN_PTR_CONST_PTR_SIZE): New.
|
||||
(BT_FN_PTR_CONST_PTR_CONST_PTR): New.
|
||||
(BT_FN_VOID_PTRPTR_CONST_PTR): New.
|
||||
(BT_FN_VOID_CONST_PTR_SIZE): New.
|
||||
(BT_FN_PTR_CONST_PTR_CONST_PTR_SIZE): New.
|
||||
* chkp-builtins.def: New.
|
||||
* builtins.def: include chkp-builtins.def.
|
||||
(DEF_CHKP_BUILTIN): New.
|
||||
* builtins.c (expand_builtin): Support BUILT_IN_CHKP_INIT_PTR_BOUNDS,
|
||||
BUILT_IN_CHKP_NULL_PTR_BOUNDS, BUILT_IN_CHKP_COPY_PTR_BOUNDS,
|
||||
BUILT_IN_CHKP_CHECK_PTR_LBOUNDS, BUILT_IN_CHKP_CHECK_PTR_UBOUNDS,
|
||||
BUILT_IN_CHKP_CHECK_PTR_BOUNDS, BUILT_IN_CHKP_SET_PTR_BOUNDS,
|
||||
BUILT_IN_CHKP_NARROW_PTR_BOUNDS, BUILT_IN_CHKP_STORE_PTR_BOUNDS,
|
||||
BUILT_IN_CHKP_GET_PTR_LBOUND, BUILT_IN_CHKP_GET_PTR_UBOUND,
|
||||
BUILT_IN_CHKP_BNDMK, BUILT_IN_CHKP_BNDSTX, BUILT_IN_CHKP_BNDCL,
|
||||
BUILT_IN_CHKP_BNDCU, BUILT_IN_CHKP_BNDLDX, BUILT_IN_CHKP_BNDRET,
|
||||
BUILT_IN_CHKP_INTERSECT, BUILT_IN_CHKP_ARG_BND, BUILT_IN_CHKP_NARROW,
|
||||
BUILT_IN_CHKP_EXTRACT_LOWER, BUILT_IN_CHKP_EXTRACT_UPPER.
|
||||
* common.opt (fcheck-pointer-bounds): New.
|
||||
* toplev.c (process_options): Check Pointer Bounds Checker is
|
||||
supported.
|
||||
* doc/extend.texi: Document Pointer Bounds Checker built-in functions.
|
||||
|
||||
Reverted:
|
||||
2013-10-30 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||
* target.def (builtin_chkp_function): New.
|
||||
(chkp_bound_type): New.
|
||||
(chkp_bound_mode): New.
|
||||
(fn_abi_va_list_bounds_size): New.
|
||||
(load_bounds_for_arg): New.
|
||||
(store_bounds_for_arg): New.
|
||||
* targhooks.h (default_load_bounds_for_arg): New.
|
||||
(default_store_bounds_for_arg): New.
|
||||
(default_fn_abi_va_list_bounds_size): New.
|
||||
(default_chkp_bound_type): New.
|
||||
(default_chkp_bound_mode): New.
|
||||
(default_builtin_chkp_function): New.
|
||||
* targhooks.c (default_load_bounds_for_arg): New.
|
||||
(default_store_bounds_for_arg): New.
|
||||
(default_fn_abi_va_list_bounds_size): New.
|
||||
(default_chkp_bound_type): New.
|
||||
(default_chkp_bound_mode); New.
|
||||
(default_builtin_chkp_function): New.
|
||||
* doc/tm.texi.in (TARGET_FN_ABI_VA_LIST_BOUNDS_SIZE): New.
|
||||
(TARGET_LOAD_BOUNDS_FOR_ARG): New.
|
||||
(TARGET_STORE_BOUNDS_FOR_ARG): New.
|
||||
(TARGET_BUILTIN_CHKP_FUNCTION): New.
|
||||
(TARGET_CHKP_BOUND_TYPE): New.
|
||||
(TARGET_CHKP_BOUND_MODE): New.
|
||||
* doc/tm.texi: Regenerated.
|
||||
* langhooks.h (lang_hooks): Add chkp_supported field.
|
||||
* langhooks-def.h (LANG_HOOKS_CHKP_SUPPORTED): New.
|
||||
(LANG_HOOKS_INITIALIZER); Add LANG_HOOKS_CHKP_SUPPORTED.
|
||||
|
||||
Reverted:
|
||||
2013-10-24 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||
* config/i386/constraints.md (B): New.
|
||||
(Ti): New.
|
||||
(Tb): New.
|
||||
* config/i386/i386-c.c (ix86_target_macros_internal): Add __MPX__.
|
||||
* config/i386/i386-modes.def (BND32): New.
|
||||
(BND64): New.
|
||||
* config/i386/i386-protos.h (ix86_bnd_prefixed_insn_p): New.
|
||||
* config/i386/i386.c (isa_opts): Add mmpx.
|
||||
(regclass_map): Add bound registers.
|
||||
(dbx_register_map): Likewise.
|
||||
(dbx64_register_map): Likewise.
|
||||
(svr4_dbx_register_map): Likewise.
|
||||
(PTA_MPX): New.
|
||||
(ix86_option_override_internal): Support MPX ISA.
|
||||
(ix86_conditional_register_usage): Support bound registers.
|
||||
(print_reg): Likewise.
|
||||
(ix86_code_end): Add MPX bnd prefix.
|
||||
(output_set_got): Likewise.
|
||||
(ix86_output_call_insn): Likewise.
|
||||
(ix86_print_operand): Add '!' (MPX bnd) print prefix support.
|
||||
(ix86_print_operand_punct_valid_p): Likewise.
|
||||
(ix86_print_operand_address): Support UNSPEC_BNDMK_ADDR and
|
||||
UNSPEC_BNDMK_ADDR.
|
||||
(ix86_class_likely_spilled_p): Add bound regs support.
|
||||
(ix86_hard_regno_mode_ok): Likewise.
|
||||
(x86_order_regs_for_local_alloc): Likewise.
|
||||
(ix86_bnd_prefixed_insn_p): New.
|
||||
* config/i386/i386.h (FIRST_PSEUDO_REGISTER): Fix to new value.
|
||||
(FIXED_REGISTERS): Add bound registers.
|
||||
(CALL_USED_REGISTERS): Likewise.
|
||||
(REG_ALLOC_ORDER): Likewise.
|
||||
(HARD_REGNO_NREGS): Likewise.
|
||||
(TARGET_MPX): New.
|
||||
(VALID_BND_REG_MODE): New.
|
||||
(FIRST_BND_REG): New.
|
||||
(LAST_BND_REG): New.
|
||||
(reg_class): Add BND_REGS.
|
||||
(REG_CLASS_NAMES): Likewise.
|
||||
(REG_CLASS_CONTENTS): Likewise.
|
||||
(BND_REGNO_P): New.
|
||||
(ANY_BND_REG_P): New.
|
||||
(BNDmode): New.
|
||||
(HI_REGISTER_NAMES): Add bound registers.
|
||||
* config/i386/i386.md (UNSPEC_BNDMK): New.
|
||||
(UNSPEC_BNDMK_ADDR): New.
|
||||
(UNSPEC_BNDSTX): New.
|
||||
(UNSPEC_BNDLDX): New.
|
||||
(UNSPEC_BNDLDX_ADDR): New.
|
||||
(UNSPEC_BNDCL): New.
|
||||
(UNSPEC_BNDCU): New.
|
||||
(UNSPEC_BNDCN): New.
|
||||
(UNSPEC_MPX_FENCE): New.
|
||||
(BND0_REG): New.
|
||||
(BND1_REG): New.
|
||||
(type): Add mpxmov, mpxmk, mpxchk, mpxld, mpxst.
|
||||
(length_immediate): Likewise.
|
||||
(prefix_0f): Likewise.
|
||||
(memory): Likewise.
|
||||
(prefix_rep): Check for bnd prefix.
|
||||
(length_nobnd): New.
|
||||
(length): Use length_nobnd if specified.
|
||||
(BND): New.
|
||||
(bnd_ptr): New.
|
||||
(BNDCHECK): New.
|
||||
(bndcheck): New.
|
||||
(*jcc_1): Add bnd prefix and rename length attr to length_nobnd.
|
||||
(*jcc_2): Likewise.
|
||||
(jump): Likewise.
|
||||
(simple_return_internal): Likewise.
|
||||
(simple_return_pop_internal): Likewise.
|
||||
(*indirect_jump): Add MPX bnd prefix.
|
||||
(*tablejump_1): Likewise.
|
||||
(simple_return_internal_long): Likewise.
|
||||
(simple_return_indirect_internal): Likewise.
|
||||
(<mode>_mk): New.
|
||||
(*<mode>_mk): New.
|
||||
(mov<mode>): New.
|
||||
(*mov<mode>_internal_mpx): New.
|
||||
(<mode>_<bndcheck>): New.
|
||||
(*<mode>_<bndcheck>): New.
|
||||
(<mode>_ldx): New.
|
||||
(*<mode>_ldx): New.
|
||||
(<mode>_stx): New.
|
||||
(*<mode>_stx): New.
|
||||
* config/i386/predicates.md (lea_address_operand): Rename to...
|
||||
(address_no_seg_operand): ... this.
|
||||
(address_mpx_no_base_operand): New.
|
||||
(address_mpx_no_index_operand): New.
|
||||
(bnd_mem_operator): New.
|
||||
* config/i386/i386.opt (mmpx): New.
|
||||
* doc/invoke.texi: Add documentation for the flags -mmpx, -mno-mpx.
|
||||
* doc/rtl.texi Add documentation for BND32mode and BND64mode.
|
||||
|
||||
Reverted:
|
||||
2013-10-24 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||
* mode-classes.def (MODE_POINTER_BOUNDS): New.
|
||||
* tree.def (POINTER_BOUNDS_TYPE): New.
|
||||
* genmodes.c (complete_mode): Support MODE_POINTER_BOUNDS.
|
||||
(POINTER_BOUNDS_MODE): New.
|
||||
(make_pointer_bounds_mode): New.
|
||||
* machmode.h (POINTER_BOUNDS_MODE_P): New.
|
||||
* stor-layout.c (int_mode_for_mode): Support MODE_POINTER_BOUNDS.
|
||||
(layout_type): Support POINTER_BOUNDS_TYPE.
|
||||
* tree-pretty-print.c (dump_generic_node): Support POINTER_BOUNDS_TYPE.
|
||||
* tree.c (build_int_cst_wide): Support POINTER_BOUNDS_TYPE.
|
||||
(type_contains_placeholder_1): Likewise.
|
||||
* tree.h (POINTER_BOUNDS_TYPE_P): New.
|
||||
* varasm.c (output_constant): Support POINTER_BOUNDS_TYPE.
|
||||
* doc/rtl.texi (MODE_POINTER_BOUNDS): New.
|
||||
|
||||
2013-11-29 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR middle-end/59338
|
||||
|
|
|
@ -234,8 +234,6 @@ DEF_FUNCTION_TYPE_1 (BT_FN_UINT16_UINT16, BT_UINT16, BT_UINT16)
|
|||
DEF_FUNCTION_TYPE_1 (BT_FN_UINT32_UINT32, BT_UINT32, BT_UINT32)
|
||||
DEF_FUNCTION_TYPE_1 (BT_FN_UINT64_UINT64, BT_UINT64, BT_UINT64)
|
||||
DEF_FUNCTION_TYPE_1 (BT_FN_BOOL_INT, BT_BOOL, BT_INT)
|
||||
DEF_FUNCTION_TYPE_1 (BT_FN_PTR_CONST_PTR, BT_PTR, BT_CONST_PTR)
|
||||
DEF_FUNCTION_TYPE_1 (BT_FN_CONST_PTR_CONST_PTR, BT_CONST_PTR, BT_CONST_PTR)
|
||||
|
||||
DEF_POINTER_TYPE (BT_PTR_FN_VOID_PTR, BT_FN_VOID_PTR)
|
||||
|
||||
|
@ -349,10 +347,6 @@ DEF_FUNCTION_TYPE_2 (BT_FN_BOOL_SIZE_CONST_VPTR, BT_BOOL, BT_SIZE,
|
|||
BT_CONST_VOLATILE_PTR)
|
||||
DEF_FUNCTION_TYPE_2 (BT_FN_BOOL_INT_BOOL, BT_BOOL, BT_INT, BT_BOOL)
|
||||
DEF_FUNCTION_TYPE_2 (BT_FN_VOID_UINT_UINT, BT_VOID, BT_UINT, BT_UINT)
|
||||
DEF_FUNCTION_TYPE_2 (BT_FN_PTR_CONST_PTR_SIZE, BT_PTR, BT_CONST_PTR, BT_SIZE)
|
||||
DEF_FUNCTION_TYPE_2 (BT_FN_PTR_CONST_PTR_CONST_PTR, BT_PTR, BT_CONST_PTR, BT_CONST_PTR)
|
||||
DEF_FUNCTION_TYPE_2 (BT_FN_VOID_PTRPTR_CONST_PTR, BT_VOID, BT_PTR_PTR, BT_CONST_PTR)
|
||||
DEF_FUNCTION_TYPE_2 (BT_FN_VOID_CONST_PTR_SIZE, BT_VOID, BT_CONST_PTR, BT_SIZE)
|
||||
|
||||
DEF_POINTER_TYPE (BT_PTR_FN_VOID_PTR_PTR, BT_FN_VOID_PTR_PTR)
|
||||
|
||||
|
@ -435,7 +429,6 @@ DEF_FUNCTION_TYPE_3 (BT_FN_VOID_VPTR_I2_INT, BT_VOID, BT_VOLATILE_PTR, BT_I2, BT
|
|||
DEF_FUNCTION_TYPE_3 (BT_FN_VOID_VPTR_I4_INT, BT_VOID, BT_VOLATILE_PTR, BT_I4, BT_INT)
|
||||
DEF_FUNCTION_TYPE_3 (BT_FN_VOID_VPTR_I8_INT, BT_VOID, BT_VOLATILE_PTR, BT_I8, BT_INT)
|
||||
DEF_FUNCTION_TYPE_3 (BT_FN_VOID_VPTR_I16_INT, BT_VOID, BT_VOLATILE_PTR, BT_I16, BT_INT)
|
||||
DEF_FUNCTION_TYPE_3 (BT_FN_PTR_CONST_PTR_CONST_PTR_SIZE, BT_PTR, BT_CONST_PTR, BT_CONST_PTR, BT_SIZE)
|
||||
|
||||
DEF_FUNCTION_TYPE_4 (BT_FN_SIZE_CONST_PTR_SIZE_SIZE_FILEPTR,
|
||||
BT_SIZE, BT_CONST_PTR, BT_SIZE, BT_SIZE, BT_FILEPTR)
|
||||
|
@ -542,8 +535,6 @@ DEF_FUNCTION_TYPE_VAR_1 (BT_FN_INT_CONST_STRING_VAR,
|
|||
BT_INT, BT_CONST_STRING)
|
||||
DEF_FUNCTION_TYPE_VAR_1 (BT_FN_UINT32_UINT32_VAR,
|
||||
BT_UINT32, BT_UINT32)
|
||||
DEF_FUNCTION_TYPE_VAR_1 (BT_FN_PTR_CONST_PTR_VAR,
|
||||
BT_PTR, BT_CONST_PTR)
|
||||
|
||||
DEF_FUNCTION_TYPE_VAR_2 (BT_FN_INT_FILEPTR_CONST_STRING_VAR,
|
||||
BT_INT, BT_FILEPTR, BT_CONST_STRING)
|
||||
|
|
|
@ -5787,18 +5787,7 @@ expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode,
|
|||
&& fcode != BUILT_IN_EXECVE
|
||||
&& fcode != BUILT_IN_ALLOCA
|
||||
&& fcode != BUILT_IN_ALLOCA_WITH_ALIGN
|
||||
&& fcode != BUILT_IN_FREE
|
||||
&& fcode != BUILT_IN_CHKP_SET_PTR_BOUNDS
|
||||
&& fcode != BUILT_IN_CHKP_INIT_PTR_BOUNDS
|
||||
&& fcode != BUILT_IN_CHKP_NULL_PTR_BOUNDS
|
||||
&& fcode != BUILT_IN_CHKP_COPY_PTR_BOUNDS
|
||||
&& fcode != BUILT_IN_CHKP_NARROW_PTR_BOUNDS
|
||||
&& fcode != BUILT_IN_CHKP_STORE_PTR_BOUNDS
|
||||
&& fcode != BUILT_IN_CHKP_CHECK_PTR_LBOUNDS
|
||||
&& fcode != BUILT_IN_CHKP_CHECK_PTR_UBOUNDS
|
||||
&& fcode != BUILT_IN_CHKP_CHECK_PTR_BOUNDS
|
||||
&& fcode != BUILT_IN_CHKP_GET_PTR_LBOUND
|
||||
&& fcode != BUILT_IN_CHKP_GET_PTR_UBOUND)
|
||||
&& fcode != BUILT_IN_FREE)
|
||||
return expand_call (exp, target, ignore);
|
||||
|
||||
/* The built-in function expanders test for target == const0_rtx
|
||||
|
@ -6850,51 +6839,6 @@ expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode,
|
|||
expand_builtin_cilk_pop_frame (exp);
|
||||
return const0_rtx;
|
||||
|
||||
case BUILT_IN_CHKP_INIT_PTR_BOUNDS:
|
||||
case BUILT_IN_CHKP_NULL_PTR_BOUNDS:
|
||||
case BUILT_IN_CHKP_COPY_PTR_BOUNDS:
|
||||
return expand_normal (CALL_EXPR_ARG (exp, 0));
|
||||
|
||||
case BUILT_IN_CHKP_CHECK_PTR_LBOUNDS:
|
||||
case BUILT_IN_CHKP_CHECK_PTR_UBOUNDS:
|
||||
case BUILT_IN_CHKP_CHECK_PTR_BOUNDS:
|
||||
case BUILT_IN_CHKP_SET_PTR_BOUNDS:
|
||||
case BUILT_IN_CHKP_NARROW_PTR_BOUNDS:
|
||||
case BUILT_IN_CHKP_STORE_PTR_BOUNDS:
|
||||
case BUILT_IN_CHKP_GET_PTR_LBOUND:
|
||||
case BUILT_IN_CHKP_GET_PTR_UBOUND:
|
||||
/* We allow user CHKP builtins if Pointer Bounds
|
||||
Checker is off. */
|
||||
if (!flag_check_pointer_bounds)
|
||||
{
|
||||
if (fcode == BUILT_IN_CHKP_SET_PTR_BOUNDS
|
||||
|| fcode == BUILT_IN_CHKP_NARROW_PTR_BOUNDS)
|
||||
return expand_normal (CALL_EXPR_ARG (exp, 0));
|
||||
else if (fcode == BUILT_IN_CHKP_GET_PTR_LBOUND)
|
||||
return expand_normal (size_zero_node);
|
||||
else if (fcode == BUILT_IN_CHKP_GET_PTR_UBOUND)
|
||||
return expand_normal (size_int (-1));
|
||||
else
|
||||
return const0_rtx;
|
||||
}
|
||||
/* FALLTHROUGH */
|
||||
|
||||
case BUILT_IN_CHKP_BNDMK:
|
||||
case BUILT_IN_CHKP_BNDSTX:
|
||||
case BUILT_IN_CHKP_BNDCL:
|
||||
case BUILT_IN_CHKP_BNDCU:
|
||||
case BUILT_IN_CHKP_BNDLDX:
|
||||
case BUILT_IN_CHKP_BNDRET:
|
||||
case BUILT_IN_CHKP_INTERSECT:
|
||||
case BUILT_IN_CHKP_ARG_BND:
|
||||
case BUILT_IN_CHKP_NARROW:
|
||||
case BUILT_IN_CHKP_EXTRACT_LOWER:
|
||||
case BUILT_IN_CHKP_EXTRACT_UPPER:
|
||||
/* Software implementation of pointers checker is NYI.
|
||||
Target support is required. */
|
||||
error ("Your target platform does not support -fcheck-pointers");
|
||||
break;
|
||||
|
||||
default: /* just do library call, if unknown builtin */
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -176,12 +176,6 @@ along with GCC; see the file COPYING3. If not see
|
|||
DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, BT_FN_INT_VAR, BT_LAST, \
|
||||
false, false, false, ATTRS, false, flag_enable_cilkplus)
|
||||
|
||||
/* Builtin used by the implementation of Pointer Bounds Checker. */
|
||||
#undef DEF_CHKP_BUILTIN
|
||||
#define DEF_CHKP_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
|
||||
DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE, \
|
||||
true, true, false, ATTRS, true, true)
|
||||
|
||||
/* Define an attribute list for math functions that are normally
|
||||
"impure" because some of them may write into global memory for
|
||||
`errno'. If !flag_errno_math they are instead "const". */
|
||||
|
@ -876,6 +870,3 @@ DEF_GCC_BUILTIN (BUILT_IN_LINE, "LINE", BT_FN_INT, ATTR_NOTHROW_LEAF_LIST)
|
|||
|
||||
/* Cilk Plus builtins. */
|
||||
#include "cilkplus.def"
|
||||
|
||||
/* Pointer Bounds Checker builtins. */
|
||||
#include "chkp-builtins.def"
|
||||
|
|
|
@ -382,8 +382,6 @@ static tree handle_omp_declare_simd_attribute (tree *, tree, tree, int,
|
|||
bool *);
|
||||
static tree handle_omp_declare_target_attribute (tree *, tree, tree, int,
|
||||
bool *);
|
||||
static tree handle_bnd_variable_size_attribute (tree *, tree, tree, int, bool *);
|
||||
static tree handle_bnd_legacy (tree *, tree, tree, int, bool *);
|
||||
|
||||
static void check_function_nonnull (tree, int, tree *);
|
||||
static void check_nonnull_arg (void *, tree, unsigned HOST_WIDE_INT);
|
||||
|
@ -771,10 +769,6 @@ const struct attribute_spec c_common_attribute_table[] =
|
|||
handle_omp_declare_simd_attribute, false },
|
||||
{ "omp declare target", 0, 0, true, false, false,
|
||||
handle_omp_declare_target_attribute, false },
|
||||
{ "bnd_variable_size", 0, 0, true, false, false,
|
||||
handle_bnd_variable_size_attribute, false },
|
||||
{ "bnd_legacy", 0, 0, true, false, false,
|
||||
handle_bnd_legacy, false },
|
||||
{ NULL, 0, 0, false, false, false, NULL, false }
|
||||
};
|
||||
|
||||
|
@ -8049,38 +8043,6 @@ handle_fnspec_attribute (tree *node ATTRIBUTE_UNUSED, tree ARG_UNUSED (name),
|
|||
return NULL_TREE;
|
||||
}
|
||||
|
||||
/* Handle a "bnd_variable_size" attribute; arguments as in
|
||||
struct attribute_spec.handler. */
|
||||
|
||||
static tree
|
||||
handle_bnd_variable_size_attribute (tree *node, tree name, tree ARG_UNUSED (args),
|
||||
int ARG_UNUSED (flags), bool *no_add_attrs)
|
||||
{
|
||||
if (TREE_CODE (*node) != FIELD_DECL)
|
||||
{
|
||||
warning (OPT_Wattributes, "%qE attribute ignored", name);
|
||||
*no_add_attrs = true;
|
||||
}
|
||||
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
/* Handle a "bnd_legacy" attribute; arguments as in
|
||||
struct attribute_spec.handler. */
|
||||
|
||||
static tree
|
||||
handle_bnd_legacy (tree *node, tree name, tree ARG_UNUSED (args),
|
||||
int ARG_UNUSED (flags), bool *no_add_attrs)
|
||||
{
|
||||
if (TREE_CODE (*node) != FUNCTION_DECL)
|
||||
{
|
||||
warning (OPT_Wattributes, "%qE attribute ignored", name);
|
||||
*no_add_attrs = true;
|
||||
}
|
||||
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
/* Handle a "warn_unused" attribute; arguments as in
|
||||
struct attribute_spec.handler. */
|
||||
|
||||
|
|
|
@ -862,11 +862,6 @@ fcanonical-system-headers
|
|||
C ObjC C++ ObjC++
|
||||
Where shorter, use canonicalized paths to systems headers.
|
||||
|
||||
fcheck-pointer-bounds
|
||||
C ObjC C++ ObjC++ LTO Report Var(flag_check_pointer_bounds)
|
||||
Add Pointer Bounds Checker instrumentation. fchkp-* flags are used to
|
||||
control instrumentation.
|
||||
|
||||
fcilkplus
|
||||
C ObjC C++ ObjC++ LTO Report Var(flag_enable_cilkplus) Init(0)
|
||||
Enable Cilk Plus
|
||||
|
|
|
@ -2186,22 +2186,12 @@ expand_call_stmt (gimple stmt)
|
|||
return;
|
||||
}
|
||||
|
||||
exp = build_vl_exp (CALL_EXPR, gimple_call_num_args (stmt) + 3);
|
||||
|
||||
CALL_EXPR_FN (exp) = gimple_call_fn (stmt);
|
||||
decl = gimple_call_fndecl (stmt);
|
||||
builtin_p = decl && DECL_BUILT_IN (decl);
|
||||
|
||||
/* Bind bounds call is expanded as assignment. */
|
||||
if (builtin_p
|
||||
&& DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
|
||||
&& DECL_FUNCTION_CODE (decl) == BUILT_IN_CHKP_BIND_BOUNDS)
|
||||
{
|
||||
expand_assignment (gimple_call_lhs (stmt),
|
||||
gimple_call_arg (stmt, 0), false);
|
||||
return;
|
||||
}
|
||||
|
||||
exp = build_vl_exp (CALL_EXPR, gimple_call_num_args (stmt) + 3);
|
||||
CALL_EXPR_FN (exp) = gimple_call_fn (stmt);
|
||||
|
||||
/* If this is not a builtin function, the function type through which the
|
||||
call is made may be different from the type of the function. */
|
||||
if (!builtin_p)
|
||||
|
|
|
@ -628,10 +628,6 @@ public:
|
|||
/* Set when variable is scheduled to be assembled. */
|
||||
unsigned output : 1;
|
||||
|
||||
/* Set when variable has statically initialized pointer
|
||||
or is a static bounds variable and needs initalization. */
|
||||
unsigned need_bounds_init : 1;
|
||||
|
||||
/* Set if the variable is dynamically initialized, except for
|
||||
function local statics. */
|
||||
unsigned dynamically_initialized : 1;
|
||||
|
|
|
@ -1,76 +0,0 @@
|
|||
/* This file contains the definitions and documentation for the
|
||||
builtins used in the GNU compiler.
|
||||
Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
|
||||
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/>. */
|
||||
|
||||
/* Before including this file, you should define macros:
|
||||
|
||||
DEF_BUILTIN_STUB(ENUM, NAME)
|
||||
DEF_CHKP_BUILTIN(ENUM, NAME, TYPE, ATTRS)
|
||||
|
||||
See builtins.def for details. */
|
||||
|
||||
/* Following builtins are used by compiler for Pointer Bounds Checker
|
||||
instrumentation. Currently these generic builtins are not
|
||||
implemented and target has to provide his own version. See
|
||||
builtin_chkp_function target hook documentation for more details. */
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_BNDMK, "__chkp_bndmk")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_BNDSTX, "__chkp_bndstx")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_BNDCL, "__chkp_bndcl")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_BNDCU, "__chkp_bndcu")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_BNDLDX, "__chkp_bndldx")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_BNDRET, "__chkp_bndret")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_INTERSECT, "__chkp_intersect")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_ARG_BND, "__chkp_arg_bnd")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_SIZEOF, "__chkp_sizeof")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_EXTRACT_LOWER, "__chkp_extract_lower")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_EXTRACT_UPPER, "__chkp_extract_upper")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_NARROW, "__chkp_narrow")
|
||||
|
||||
/* Builtins to bind bounds to call arguments. */
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_BIND_BOUNDS, "__chkp_bind_bounds", BT_FN_PTR_CONST_PTR_VAR, ATTR_CONST_NOTHROW_LEAF_LIST)
|
||||
|
||||
/* Pointer Bounds Checker builtins for users. Only
|
||||
BUILT_IN_CHKP_SET_PTR_BOUNDS may be redefined
|
||||
by target. Other builtins calls are expanded
|
||||
in the Pointer Bounds Checker pass. */
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_SET_PTR_BOUNDS, "__bnd_set_ptr_bounds", BT_FN_PTR_CONST_PTR_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_INIT_PTR_BOUNDS, "__bnd_init_ptr_bounds", BT_FN_PTR_CONST_PTR, ATTR_CONST_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_NULL_PTR_BOUNDS, "__bnd_null_ptr_bounds", BT_FN_PTR_CONST_PTR, ATTR_CONST_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_COPY_PTR_BOUNDS, "__bnd_copy_ptr_bounds", BT_FN_PTR_CONST_PTR_CONST_PTR, ATTR_CONST_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_NARROW_PTR_BOUNDS, "__bnd_narrow_ptr_bounds", BT_FN_PTR_CONST_PTR_CONST_PTR_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_STORE_PTR_BOUNDS, "__bnd_store_ptr_bounds", BT_FN_VOID_PTRPTR_CONST_PTR, ATTR_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_CHECK_PTR_LBOUNDS, "__bnd_chk_ptr_lbounds", BT_FN_VOID_CONST_PTR, ATTR_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_CHECK_PTR_UBOUNDS, "__bnd_chk_ptr_ubounds", BT_FN_VOID_CONST_PTR, ATTR_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_CHECK_PTR_BOUNDS, "__bnd_chk_ptr_bounds", BT_FN_VOID_CONST_PTR_SIZE, ATTR_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_GET_PTR_LBOUND, "__bnd_get_ptr_lbound", BT_FN_CONST_PTR_CONST_PTR, ATTR_CONST_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_GET_PTR_UBOUND, "__bnd_get_ptr_ubound", BT_FN_CONST_PTR_CONST_PTR, ATTR_CONST_NOTHROW_LEAF_LIST)
|
||||
|
||||
/* Pointer Bounds Checker specific versions of string functions. */
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMCPY_NOBND, "chkp_memcpy_nobnd", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMCPY_NOCHK, "chkp_memcpy_nochk", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMCPY_NOBND_NOCHK, "chkp_memcpy_nobnd_nochk", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMMOVE_NOBND, "chkp_memmove_nobnd", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMMOVE_NOCHK, "chkp_memmove_nochk", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMMOVE_NOBND_NOCHK, "chkp_memmove_nobnd_nochk", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMPCPY_NOBND, "chkp_mempcpy_nobnd", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMPCPY_NOCHK, "chkp_mempcpy_nochk", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMPCPY_NOBND_NOCHK, "chkp_mempcpy_nobnd_nochk", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMSET_NOBND, "chkp_memset_nobnd", BT_FN_PTR_PTR_INT_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMSET_NOCHK, "chkp_memset_nochk", BT_FN_PTR_PTR_INT_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMSET_NOBND_NOCHK, "chkp_memset_nobnd_nochk", BT_FN_PTR_PTR_INT_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
|
|
@ -18,7 +18,7 @@
|
|||
;; <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Unused letters:
|
||||
;;; H
|
||||
;;; B H
|
||||
;;; h j
|
||||
|
||||
;; Integer register constraints.
|
||||
|
@ -91,9 +91,6 @@
|
|||
(define_register_constraint "x" "TARGET_SSE ? SSE_REGS : NO_REGS"
|
||||
"Any SSE register.")
|
||||
|
||||
(define_register_constraint "B" "TARGET_MPX ? BND_REGS : NO_REGS"
|
||||
"@internal Any bound register.")
|
||||
|
||||
;; We use the Y prefix to denote any number of conditional register sets:
|
||||
;; z First SSE register.
|
||||
;; i SSE2 inter-unit moves to SSE register enabled
|
||||
|
@ -239,8 +236,6 @@
|
|||
;; T prefix is used for different address constraints
|
||||
;; v - VSIB address
|
||||
;; s - address with no segment register
|
||||
;; i - address with no index and no rip
|
||||
;; b - address with no base and no rip
|
||||
|
||||
(define_address_constraint "Tv"
|
||||
"VSIB address operand"
|
||||
|
@ -249,11 +244,3 @@
|
|||
(define_address_constraint "Ts"
|
||||
"Address operand without segment register"
|
||||
(match_operand 0 "address_no_seg_operand"))
|
||||
|
||||
(define_address_constraint "Ti"
|
||||
"MPX address operand without index"
|
||||
(match_operand 0 "address_mpx_no_index_operand"))
|
||||
|
||||
(define_address_constraint "Tb"
|
||||
"MPX address operand without base"
|
||||
(match_operand 0 "address_mpx_no_base_operand"))
|
||||
|
|
|
@ -372,8 +372,6 @@ ix86_target_macros_internal (HOST_WIDE_INT isa_flag,
|
|||
def_or_undef (parse_in, "__SSE_MATH__");
|
||||
if ((fpmath & FPMATH_SSE) && (isa_flag & OPTION_MASK_ISA_SSE2))
|
||||
def_or_undef (parse_in, "__SSE2_MATH__");
|
||||
if (isa_flag & OPTION_MASK_ISA_MPX)
|
||||
def_or_undef (parse_in, "__MPX__");
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -87,9 +87,6 @@ VECTOR_MODE (INT, DI, 1); /* V1DI */
|
|||
VECTOR_MODE (INT, SI, 1); /* V1SI */
|
||||
VECTOR_MODE (INT, QI, 2); /* V2QI */
|
||||
|
||||
POINTER_BOUNDS_MODE (BND32, 8);
|
||||
POINTER_BOUNDS_MODE (BND64, 16);
|
||||
|
||||
INT_MODE (OI, 32);
|
||||
INT_MODE (XI, 64);
|
||||
|
||||
|
|
|
@ -243,8 +243,6 @@ extern void ix86_expand_sse2_mulv4si3 (rtx, rtx, rtx);
|
|||
extern void ix86_expand_sse2_mulvxdi3 (rtx, rtx, rtx);
|
||||
extern void ix86_expand_sse2_abs (rtx, rtx);
|
||||
|
||||
extern bool ix86_bnd_prefixed_insn_p (rtx);
|
||||
|
||||
/* In i386-c.c */
|
||||
extern void ix86_target_macros (void);
|
||||
extern void ix86_register_pragmas (void);
|
||||
|
|
|
@ -2047,8 +2047,6 @@ enum reg_class const regclass_map[FIRST_PSEUDO_REGISTER] =
|
|||
/* Mask registers. */
|
||||
MASK_REGS, MASK_EVEX_REGS, MASK_EVEX_REGS, MASK_EVEX_REGS,
|
||||
MASK_EVEX_REGS, MASK_EVEX_REGS, MASK_EVEX_REGS, MASK_EVEX_REGS,
|
||||
/* MPX bound registers */
|
||||
BND_REGS, BND_REGS, BND_REGS, BND_REGS,
|
||||
};
|
||||
|
||||
/* The "default" register map used in 32bit mode. */
|
||||
|
@ -2065,7 +2063,6 @@ int const dbx_register_map[FIRST_PSEUDO_REGISTER] =
|
|||
-1, -1, -1, -1, -1, -1, -1, -1, /* AVX-512 registers 16-23*/
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* AVX-512 registers 24-31*/
|
||||
93, 94, 95, 96, 97, 98, 99, 100, /* Mask registers */
|
||||
101, 102, 103, 104, /* bound registers */
|
||||
};
|
||||
|
||||
/* The "default" register map used in 64bit mode. */
|
||||
|
@ -2082,7 +2079,6 @@ int const dbx64_register_map[FIRST_PSEUDO_REGISTER] =
|
|||
67, 68, 69, 70, 71, 72, 73, 74, /* AVX-512 registers 16-23 */
|
||||
75, 76, 77, 78, 79, 80, 81, 82, /* AVX-512 registers 24-31 */
|
||||
118, 119, 120, 121, 122, 123, 124, 125, /* Mask registers */
|
||||
126, 127, 128, 129, /* bound registers */
|
||||
};
|
||||
|
||||
/* Define the register numbers to be used in Dwarf debugging information.
|
||||
|
@ -2151,7 +2147,6 @@ int const svr4_dbx_register_map[FIRST_PSEUDO_REGISTER] =
|
|||
-1, -1, -1, -1, -1, -1, -1, -1, /* AVX-512 registers 16-23*/
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* AVX-512 registers 24-31*/
|
||||
93, 94, 95, 96, 97, 98, 99, 100, /* Mask registers */
|
||||
-1, -1, -1, -1, /* bound registers */
|
||||
};
|
||||
|
||||
/* Define parameter passing and return registers. */
|
||||
|
@ -2583,7 +2578,6 @@ ix86_target_string (HOST_WIDE_INT isa, int flags, const char *arch,
|
|||
{ "-mrtm", OPTION_MASK_ISA_RTM },
|
||||
{ "-mxsave", OPTION_MASK_ISA_XSAVE },
|
||||
{ "-mxsaveopt", OPTION_MASK_ISA_XSAVEOPT },
|
||||
{ "-mmpx", OPTION_MASK_ISA_MPX },
|
||||
};
|
||||
|
||||
/* Flag options. */
|
||||
|
@ -3078,7 +3072,6 @@ ix86_option_override_internal (bool main_args_p,
|
|||
#define PTA_AVX512ER (HOST_WIDE_INT_1 << 41)
|
||||
#define PTA_AVX512PF (HOST_WIDE_INT_1 << 42)
|
||||
#define PTA_AVX512CD (HOST_WIDE_INT_1 << 43)
|
||||
#define PTA_MPX (HOST_WIDE_INT_1 << 44)
|
||||
|
||||
/* if this reaches 64, need to widen struct pta flags below */
|
||||
|
||||
|
@ -4271,11 +4264,6 @@ ix86_conditional_register_usage (void)
|
|||
for (i = FIRST_MASK_REG; i <= LAST_MASK_REG; i++)
|
||||
fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = "";
|
||||
}
|
||||
|
||||
/* If MPX is disabled, squash the registers. */
|
||||
if (! TARGET_MPX)
|
||||
for (i = FIRST_BND_REG; i <= LAST_BND_REG; i++)
|
||||
fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = "";
|
||||
}
|
||||
|
||||
|
||||
|
@ -8998,7 +8986,7 @@ ix86_code_end (void)
|
|||
xops[0] = gen_rtx_REG (Pmode, regno);
|
||||
xops[1] = gen_rtx_MEM (Pmode, stack_pointer_rtx);
|
||||
output_asm_insn ("mov%z0\t{%1, %0|%0, %1}", xops);
|
||||
output_asm_insn ("%!ret", NULL);
|
||||
fputs ("\tret\n", asm_out_file);
|
||||
final_end_function ();
|
||||
init_insn_lengths ();
|
||||
free_after_compilation (cfun);
|
||||
|
@ -9056,7 +9044,7 @@ output_set_got (rtx dest, rtx label)
|
|||
|
||||
xops[2] = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
|
||||
xops[2] = gen_rtx_MEM (QImode, xops[2]);
|
||||
output_asm_insn ("%!call\t%X2", xops);
|
||||
output_asm_insn ("call\t%X2", xops);
|
||||
|
||||
#if TARGET_MACHO
|
||||
/* Output the Mach-O "canonical" pic base label name ("Lxx$pb") here.
|
||||
|
@ -14424,7 +14412,7 @@ print_reg (rtx x, int code, FILE *file)
|
|||
case 8:
|
||||
case 4:
|
||||
case 12:
|
||||
if (! ANY_FP_REG_P (x) && ! ANY_BND_REG_P (x))
|
||||
if (! ANY_FP_REG_P (x))
|
||||
putc (code == 8 && TARGET_64BIT ? 'r' : 'e', file);
|
||||
/* FALLTHRU */
|
||||
case 16:
|
||||
|
@ -14547,7 +14535,6 @@ get_some_local_dynamic_name (void)
|
|||
~ -- print "i" if TARGET_AVX2, "f" otherwise.
|
||||
@ -- print a segment register of thread base pointer load
|
||||
^ -- print addr32 prefix if TARGET_64BIT and Pmode != word_mode
|
||||
! -- print MPX prefix for jxx/call/ret instructions if required.
|
||||
*/
|
||||
|
||||
void
|
||||
|
@ -15047,11 +15034,6 @@ ix86_print_operand (FILE *file, rtx x, int code)
|
|||
fputs ("addr32 ", file);
|
||||
return;
|
||||
|
||||
case '!':
|
||||
if (ix86_bnd_prefixed_insn_p (NULL_RTX))
|
||||
fputs ("bnd ", file);
|
||||
return;
|
||||
|
||||
default:
|
||||
output_operand_lossage ("invalid operand code '%c'", code);
|
||||
}
|
||||
|
@ -15194,7 +15176,7 @@ static bool
|
|||
ix86_print_operand_punct_valid_p (unsigned char code)
|
||||
{
|
||||
return (code == '@' || code == '*' || code == '+' || code == '&'
|
||||
|| code == ';' || code == '~' || code == '^' || code == '!');
|
||||
|| code == ';' || code == '~' || code == '^');
|
||||
}
|
||||
|
||||
/* Print a memory operand whose address is ADDR. */
|
||||
|
@ -15224,25 +15206,6 @@ ix86_print_operand_address (FILE *file, rtx addr)
|
|||
ok = ix86_decompose_address (XVECEXP (addr, 0, 0), &parts);
|
||||
code = 'q';
|
||||
}
|
||||
else if (GET_CODE (addr) == UNSPEC && XINT (addr, 1) == UNSPEC_BNDMK_ADDR)
|
||||
{
|
||||
ok = ix86_decompose_address (XVECEXP (addr, 0, 1), &parts);
|
||||
gcc_assert (parts.base == NULL_RTX || parts.index == NULL_RTX);
|
||||
if (parts.base != NULL_RTX)
|
||||
{
|
||||
parts.index = parts.base;
|
||||
parts.scale = 1;
|
||||
}
|
||||
parts.base = XVECEXP (addr, 0, 0);
|
||||
addr = XVECEXP (addr, 0, 0);
|
||||
}
|
||||
else if (GET_CODE (addr) == UNSPEC && XINT (addr, 1) == UNSPEC_BNDLDX_ADDR)
|
||||
{
|
||||
ok = ix86_decompose_address (XVECEXP (addr, 0, 0), &parts);
|
||||
gcc_assert (parts.index == NULL_RTX);
|
||||
parts.index = XVECEXP (addr, 0, 1);
|
||||
addr = XVECEXP (addr, 0, 0);
|
||||
}
|
||||
else
|
||||
ok = ix86_decompose_address (addr, &parts);
|
||||
|
||||
|
@ -24551,13 +24514,13 @@ ix86_output_call_insn (rtx insn, rtx call_op)
|
|||
if (SIBLING_CALL_P (insn))
|
||||
{
|
||||
if (direct_p)
|
||||
xasm = "%!jmp\t%P0";
|
||||
xasm = "jmp\t%P0";
|
||||
/* SEH epilogue detection requires the indirect branch case
|
||||
to include REX.W. */
|
||||
else if (TARGET_SEH)
|
||||
xasm = "%!rex.W jmp %A0";
|
||||
xasm = "rex.W jmp %A0";
|
||||
else
|
||||
xasm = "%!jmp\t%A0";
|
||||
xasm = "jmp\t%A0";
|
||||
|
||||
output_asm_insn (xasm, &call_op);
|
||||
return "";
|
||||
|
@ -24594,9 +24557,9 @@ ix86_output_call_insn (rtx insn, rtx call_op)
|
|||
}
|
||||
|
||||
if (direct_p)
|
||||
xasm = "%!call\t%P0";
|
||||
xasm = "call\t%P0";
|
||||
else
|
||||
xasm = "%!call\t%A0";
|
||||
xasm = "call\t%A0";
|
||||
|
||||
output_asm_insn (xasm, &call_op);
|
||||
|
||||
|
@ -34762,7 +34725,6 @@ ix86_class_likely_spilled_p (reg_class_t rclass)
|
|||
case SSE_FIRST_REG:
|
||||
case FP_TOP_REG:
|
||||
case FP_SECOND_REG:
|
||||
case BND_REGS:
|
||||
return true;
|
||||
|
||||
default:
|
||||
|
@ -35111,8 +35073,6 @@ ix86_hard_regno_mode_ok (int regno, enum machine_mode mode)
|
|||
return VALID_FP_MODE_P (mode);
|
||||
if (MASK_REGNO_P (regno))
|
||||
return VALID_MASK_REG_MODE (mode);
|
||||
if (BND_REGNO_P (regno))
|
||||
return VALID_BND_REG_MODE (mode);
|
||||
if (SSE_REGNO_P (regno))
|
||||
{
|
||||
/* We implement the move patterns for all vector modes into and
|
||||
|
@ -35926,10 +35886,6 @@ x86_order_regs_for_local_alloc (void)
|
|||
for (i = FIRST_MASK_REG; i <= LAST_MASK_REG; i++)
|
||||
reg_alloc_order [pos++] = i;
|
||||
|
||||
/* MPX bound registers. */
|
||||
for (i = FIRST_BND_REG; i <= LAST_BND_REG; i++)
|
||||
reg_alloc_order [pos++] = i;
|
||||
|
||||
/* x87 registers. */
|
||||
if (TARGET_SSE_MATH)
|
||||
for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
|
||||
|
@ -42428,18 +42384,6 @@ ix86_expand_sse2_mulvxdi3 (rtx op0, rtx op1, rtx op2)
|
|||
gen_rtx_MULT (mode, op1, op2));
|
||||
}
|
||||
|
||||
/* Return 1 if control tansfer instruction INSN
|
||||
should be encoded with bnd prefix.
|
||||
If insn is NULL then return 1 when control
|
||||
transfer instructions should be prefixed with
|
||||
bnd by default for current function. */
|
||||
|
||||
bool
|
||||
ix86_bnd_prefixed_insn_p (rtx insn ATTRIBUTE_UNUSED)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Calculate integer abs() using only SSE2 instructions. */
|
||||
|
||||
void
|
||||
|
|
|
@ -128,8 +128,6 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|||
#define TARGET_XSAVE_P(x) TARGET_ISA_XSAVE_P(x)
|
||||
#define TARGET_XSAVEOPT TARGET_ISA_XSAVEOPT
|
||||
#define TARGET_XSAVEOPT_P(x) TARGET_ISA_XSAVEOPT_P(x)
|
||||
#define TARGET_MPX TARGET_ISA_MPX
|
||||
#define TARGET_MPX_P(x) TARGET_ISA_MPX_P(x)
|
||||
|
||||
#define TARGET_LP64 TARGET_ABI_64
|
||||
#define TARGET_LP64_P(x) TARGET_ABI_64_P(x)
|
||||
|
@ -960,7 +958,7 @@ enum target_cpu_default
|
|||
eliminated during reloading in favor of either the stack or frame
|
||||
pointer. */
|
||||
|
||||
#define FIRST_PSEUDO_REGISTER 81
|
||||
#define FIRST_PSEUDO_REGISTER 77
|
||||
|
||||
/* Number of hardware registers that go into the DWARF-2 unwind info.
|
||||
If not defined, equals FIRST_PSEUDO_REGISTER. */
|
||||
|
@ -992,9 +990,7 @@ enum target_cpu_default
|
|||
/*xmm24,xmm25,xmm26,xmm27,xmm28,xmm29,xmm30,xmm31*/ \
|
||||
0, 0, 0, 0, 0, 0, 0, 0, \
|
||||
/* k0, k1, k2, k3, k4, k5, k6, k7*/ \
|
||||
0, 0, 0, 0, 0, 0, 0, 0, \
|
||||
/* b0, b1, b2, b3*/ \
|
||||
0, 0, 0, 0 }
|
||||
0, 0, 0, 0, 0, 0, 0, 0 }
|
||||
|
||||
/* 1 for registers not available across function calls.
|
||||
These must include the FIXED_REGISTERS and also any
|
||||
|
@ -1028,9 +1024,7 @@ enum target_cpu_default
|
|||
/*xmm24,xmm25,xmm26,xmm27,xmm28,xmm29,xmm30,xmm31*/ \
|
||||
6, 6, 6, 6, 6, 6, 6, 6, \
|
||||
/* k0, k1, k2, k3, k4, k5, k6, k7*/ \
|
||||
1, 1, 1, 1, 1, 1, 1, 1, \
|
||||
/* b0, b1, b2, b3*/ \
|
||||
1, 1, 1, 1 }
|
||||
1, 1, 1, 1, 1, 1, 1, 1 }
|
||||
|
||||
/* Order in which to allocate registers. Each register must be
|
||||
listed once, even those in FIXED_REGISTERS. List frame pointer
|
||||
|
@ -1046,8 +1040,7 @@ enum target_cpu_default
|
|||
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, \
|
||||
33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, \
|
||||
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, \
|
||||
63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, \
|
||||
78, 79, 80 }
|
||||
63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76 }
|
||||
|
||||
/* ADJUST_REG_ALLOC_ORDER is a macro which permits reg_alloc_order
|
||||
to be rearranged based on a particular function. When using sse math,
|
||||
|
@ -1069,7 +1062,6 @@ enum target_cpu_default
|
|||
|
||||
#define HARD_REGNO_NREGS(REGNO, MODE) \
|
||||
(STACK_REGNO_P (REGNO) || SSE_REGNO_P (REGNO) || MMX_REGNO_P (REGNO) \
|
||||
|| BND_REGNO_P (REGNO) \
|
||||
? (COMPLEX_MODE_P (MODE) ? 2 : 1) \
|
||||
: ((MODE) == XFmode \
|
||||
? (TARGET_64BIT ? 2 : 3) \
|
||||
|
@ -1119,9 +1111,6 @@ enum target_cpu_default
|
|||
|| (MODE) == V2SImode || (MODE) == SImode \
|
||||
|| (MODE) == V4HImode || (MODE) == V8QImode)
|
||||
|
||||
#define VALID_BND_REG_MODE(MODE) \
|
||||
(TARGET_64BIT ? (MODE) == BND64mode : (MODE) == BND32mode)
|
||||
|
||||
#define VALID_DFP_MODE_P(MODE) \
|
||||
((MODE) == SDmode || (MODE) == DDmode || (MODE) == TDmode)
|
||||
|
||||
|
@ -1228,9 +1217,6 @@ enum target_cpu_default
|
|||
#define FIRST_MASK_REG (LAST_EXT_REX_SSE_REG + 1) /*69*/
|
||||
#define LAST_MASK_REG (FIRST_MASK_REG + 7) /*76*/
|
||||
|
||||
#define FIRST_BND_REG (LAST_MASK_REG + 1) /*77*/
|
||||
#define LAST_BND_REG (FIRST_BND_REG + 3) /*80*/
|
||||
|
||||
/* Override this in other tm.h files to cope with various OS lossage
|
||||
requiring a frame pointer. */
|
||||
#ifndef SUBTARGET_FRAME_POINTER_REQUIRED
|
||||
|
@ -1311,7 +1297,6 @@ enum reg_class
|
|||
SSE_FIRST_REG,
|
||||
SSE_REGS,
|
||||
EVEX_SSE_REGS,
|
||||
BND_REGS,
|
||||
ALL_SSE_REGS,
|
||||
MMX_REGS,
|
||||
FP_TOP_SSE_REGS,
|
||||
|
@ -1369,7 +1354,6 @@ enum reg_class
|
|||
"SSE_FIRST_REG", \
|
||||
"SSE_REGS", \
|
||||
"EVEX_SSE_REGS", \
|
||||
"BND_REGS", \
|
||||
"ALL_SSE_REGS", \
|
||||
"MMX_REGS", \
|
||||
"FP_TOP_SSE_REGS", \
|
||||
|
@ -1389,38 +1373,37 @@ enum reg_class
|
|||
TARGET_CONDITIONAL_REGISTER_USAGE. */
|
||||
|
||||
#define REG_CLASS_CONTENTS \
|
||||
{ { 0x00, 0x0, 0x0 }, \
|
||||
{ 0x01, 0x0, 0x0 }, /* AREG */ \
|
||||
{ 0x02, 0x0, 0x0 }, /* DREG */ \
|
||||
{ 0x04, 0x0, 0x0 }, /* CREG */ \
|
||||
{ 0x08, 0x0, 0x0 }, /* BREG */ \
|
||||
{ 0x10, 0x0, 0x0 }, /* SIREG */ \
|
||||
{ 0x20, 0x0, 0x0 }, /* DIREG */ \
|
||||
{ 0x03, 0x0, 0x0 }, /* AD_REGS */ \
|
||||
{ 0x0f, 0x0, 0x0 }, /* Q_REGS */ \
|
||||
{ 0x1100f0, 0x1fe0, 0x0 }, /* NON_Q_REGS */ \
|
||||
{ 0x7f, 0x1fe0, 0x0 }, /* INDEX_REGS */ \
|
||||
{ 0x1100ff, 0x0, 0x0 }, /* LEGACY_REGS */ \
|
||||
{ 0x07, 0x0, 0x0 }, /* CLOBBERED_REGS */ \
|
||||
{ 0x1100ff, 0x1fe0, 0x0 }, /* GENERAL_REGS */ \
|
||||
{ 0x100, 0x0, 0x0 }, /* FP_TOP_REG */ \
|
||||
{ 0x0200, 0x0, 0x0 }, /* FP_SECOND_REG */ \
|
||||
{ 0xff00, 0x0, 0x0 }, /* FLOAT_REGS */ \
|
||||
{ 0x200000, 0x0, 0x0 }, /* SSE_FIRST_REG */ \
|
||||
{ 0x1fe00000, 0x1fe000, 0x0 }, /* SSE_REGS */ \
|
||||
{ 0x0,0xffe00000, 0x1f }, /* EVEX_SSE_REGS */ \
|
||||
{ 0x0, 0x0,0x1e000 }, /* BND_REGS */ \
|
||||
{ 0x1fe00000,0xffffe000, 0x1f }, /* ALL_SSE_REGS */ \
|
||||
{ 0xe0000000, 0x1f, 0x0 }, /* MMX_REGS */ \
|
||||
{ 0x1fe00100,0xffffe000, 0x1f }, /* FP_TOP_SSE_REG */ \
|
||||
{ 0x1fe00200,0xffffe000, 0x1f }, /* FP_SECOND_SSE_REG */ \
|
||||
{ 0x1fe0ff00,0xffffe000, 0x1f }, /* FLOAT_SSE_REGS */ \
|
||||
{ 0x11ffff, 0x1fe0, 0x0 }, /* FLOAT_INT_REGS */ \
|
||||
{ 0x1ff100ff,0xffffffe0, 0x1f }, /* INT_SSE_REGS */ \
|
||||
{ 0x1ff1ffff,0xffffffe0, 0x1f }, /* FLOAT_INT_SSE_REGS */ \
|
||||
{ 0x0, 0x0, 0x1fc0 }, /* MASK_EVEX_REGS */ \
|
||||
{ 0x0, 0x0, 0x1fe0 }, /* MASK_REGS */ \
|
||||
{ 0xffffffff,0xffffffff, 0x1fff } \
|
||||
{ { 0x00, 0x0, 0x0 }, \
|
||||
{ 0x01, 0x0, 0x0 }, /* AREG */ \
|
||||
{ 0x02, 0x0, 0x0 }, /* DREG */ \
|
||||
{ 0x04, 0x0, 0x0 }, /* CREG */ \
|
||||
{ 0x08, 0x0, 0x0 }, /* BREG */ \
|
||||
{ 0x10, 0x0, 0x0 }, /* SIREG */ \
|
||||
{ 0x20, 0x0, 0x0 }, /* DIREG */ \
|
||||
{ 0x03, 0x0, 0x0 }, /* AD_REGS */ \
|
||||
{ 0x0f, 0x0, 0x0 }, /* Q_REGS */ \
|
||||
{ 0x1100f0, 0x1fe0, 0x0 }, /* NON_Q_REGS */ \
|
||||
{ 0x7f, 0x1fe0, 0x0 }, /* INDEX_REGS */ \
|
||||
{ 0x1100ff, 0x0, 0x0 }, /* LEGACY_REGS */ \
|
||||
{ 0x07, 0x0, 0x0 }, /* CLOBBERED_REGS */ \
|
||||
{ 0x1100ff, 0x1fe0, 0x0 }, /* GENERAL_REGS */ \
|
||||
{ 0x100, 0x0, 0x0 }, /* FP_TOP_REG */ \
|
||||
{ 0x0200, 0x0, 0x0 }, /* FP_SECOND_REG */ \
|
||||
{ 0xff00, 0x0, 0x0 }, /* FLOAT_REGS */ \
|
||||
{ 0x200000, 0x0, 0x0 }, /* SSE_FIRST_REG */ \
|
||||
{ 0x1fe00000, 0x1fe000, 0x0 }, /* SSE_REGS */ \
|
||||
{ 0x0,0xffe00000, 0x1f }, /* EVEX_SSE_REGS */ \
|
||||
{ 0x1fe00000,0xffffe000, 0x1f }, /* ALL_SSE_REGS */ \
|
||||
{ 0xe0000000, 0x1f, 0x0 }, /* MMX_REGS */ \
|
||||
{ 0x1fe00100,0xffffe000, 0x1f }, /* FP_TOP_SSE_REG */ \
|
||||
{ 0x1fe00200,0xffffe000, 0x1f }, /* FP_SECOND_SSE_REG */ \
|
||||
{ 0x1fe0ff00,0xffffe000, 0x1f }, /* FLOAT_SSE_REGS */ \
|
||||
{ 0x11ffff, 0x1fe0, 0x0 }, /* FLOAT_INT_REGS */ \
|
||||
{ 0x1ff100ff,0xffffffe0, 0x1f }, /* INT_SSE_REGS */ \
|
||||
{ 0x1ff1ffff,0xffffffe0, 0x1f }, /* FLOAT_INT_SSE_REGS */ \
|
||||
{ 0x0, 0x0,0x1fc0 }, /* MASK_EVEX_REGS */ \
|
||||
{ 0x0, 0x0,0x1fe0 }, /* MASK_REGS */ \
|
||||
{ 0xffffffff,0xffffffff,0x1fff } \
|
||||
}
|
||||
|
||||
/* The same information, inverted:
|
||||
|
@ -1496,9 +1479,6 @@ enum reg_class
|
|||
#define CC_REG_P(X) (REG_P (X) && CC_REGNO_P (REGNO (X)))
|
||||
#define CC_REGNO_P(X) ((X) == FLAGS_REG || (X) == FPSR_REG)
|
||||
|
||||
#define BND_REGNO_P(N) IN_RANGE ((N), FIRST_BND_REG, LAST_BND_REG)
|
||||
#define ANY_BND_REG_P(X) (REG_P (X) && BND_REGNO_P (REGNO (X)))
|
||||
|
||||
/* The class value for index registers, and the one for base regs. */
|
||||
|
||||
#define INDEX_REG_CLASS INDEX_REGS
|
||||
|
@ -1943,9 +1923,6 @@ do { \
|
|||
between pointers and any other objects of this machine mode. */
|
||||
#define Pmode (ix86_pmode == PMODE_DI ? DImode : SImode)
|
||||
|
||||
/* Specify the machine mode that bounds have. */
|
||||
#define BNDmode (ix86_pmode == PMODE_DI ? BND64mode : BND32mode)
|
||||
|
||||
/* A C expression whose value is zero if pointers that need to be extended
|
||||
from being `POINTER_SIZE' bits wide to `Pmode' are sign-extended and
|
||||
greater then zero if they are zero-extended and less then zero if the
|
||||
|
@ -2056,8 +2033,7 @@ do { \
|
|||
"xmm20", "xmm21", "xmm22", "xmm23", \
|
||||
"xmm24", "xmm25", "xmm26", "xmm27", \
|
||||
"xmm28", "xmm29", "xmm30", "xmm31", \
|
||||
"k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7", \
|
||||
"bnd0", "bnd1", "bnd2", "bnd3" }
|
||||
"k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7" }
|
||||
|
||||
#define REGISTER_NAMES HI_REGISTER_NAMES
|
||||
|
||||
|
|
|
@ -63,7 +63,6 @@
|
|||
;; ~ -- print "i" if TARGET_AVX2, "f" otherwise.
|
||||
;; @ -- print a segment register of thread base pointer load
|
||||
;; ^ -- print addr32 prefix if TARGET_64BIT and Pmode != word_mode
|
||||
;; ! -- print MPX prefix for jxx/call/ret instructions if required.
|
||||
|
||||
(define_c_enum "unspec" [
|
||||
;; Relocation specifiers
|
||||
|
@ -179,16 +178,6 @@
|
|||
;; For BMI2 support
|
||||
UNSPEC_PDEP
|
||||
UNSPEC_PEXT
|
||||
|
||||
UNSPEC_BNDMK
|
||||
UNSPEC_BNDMK_ADDR
|
||||
UNSPEC_BNDSTX
|
||||
UNSPEC_BNDLDX
|
||||
UNSPEC_BNDLDX_ADDR
|
||||
UNSPEC_BNDCL
|
||||
UNSPEC_BNDCU
|
||||
UNSPEC_BNDCN
|
||||
UNSPEC_MPX_FENCE
|
||||
])
|
||||
|
||||
(define_c_enum "unspecv" [
|
||||
|
@ -353,8 +342,6 @@
|
|||
(MASK5_REG 74)
|
||||
(MASK6_REG 75)
|
||||
(MASK7_REG 76)
|
||||
(BND0_REG 77)
|
||||
(BND1_REG 78)
|
||||
])
|
||||
|
||||
;; Insns whose names begin with "x86_" are emitted by gen_FOO calls
|
||||
|
@ -389,8 +376,7 @@
|
|||
ssecvt,ssecvt1,sseicvt,sseins,
|
||||
sseshuf,sseshuf1,ssemuladd,sse4arg,
|
||||
lwp,mskmov,msklog,
|
||||
mmx,mmxmov,mmxadd,mmxmul,mmxcmp,mmxcvt,mmxshft,
|
||||
mpxmov,mpxmk,mpxchk,mpxld,mpxst"
|
||||
mmx,mmxmov,mmxadd,mmxmul,mmxcmp,mmxcvt,mmxshft"
|
||||
(const_string "other"))
|
||||
|
||||
;; Main data type used by the insn
|
||||
|
@ -419,8 +405,7 @@
|
|||
;; The (bounding maximum) length of an instruction immediate.
|
||||
(define_attr "length_immediate" ""
|
||||
(cond [(eq_attr "type" "incdec,setcc,icmov,str,lea,other,multi,idiv,leave,
|
||||
bitmanip,imulx,msklog,mskmov,mpxmk,mpxmov,mpxchk,
|
||||
mpxld,mpxst")
|
||||
bitmanip,imulx,msklog,mskmov")
|
||||
(const_int 0)
|
||||
(eq_attr "unit" "i387,sse,mmx")
|
||||
(const_int 0)
|
||||
|
@ -475,17 +460,13 @@
|
|||
(const_int 0)
|
||||
(and (eq_attr "unit" "sse") (eq_attr "mode" "SF,DF"))
|
||||
(const_int 1)
|
||||
(and (eq_attr "type" "ibr,call,callv")
|
||||
(match_test "ix86_bnd_prefixed_insn_p (insn)"))
|
||||
(const_int 1)
|
||||
]
|
||||
(const_int 0)))
|
||||
|
||||
;; Set when 0f opcode prefix is used.
|
||||
(define_attr "prefix_0f" ""
|
||||
(if_then_else
|
||||
(ior (eq_attr "type" "imovx,setcc,icmov,bitmanip,msklog,mskmov,
|
||||
mpxmk,mpxmov,mpxchk,mpxld,mpxst")
|
||||
(ior (eq_attr "type" "imovx,setcc,icmov,bitmanip,msklog,mskmov")
|
||||
(eq_attr "unit" "sse,mmx"))
|
||||
(const_int 1)
|
||||
(const_int 0)))
|
||||
|
@ -588,19 +569,12 @@
|
|||
]
|
||||
(const_int 1)))
|
||||
|
||||
;; When this attribute is set, calculate total insn length from
|
||||
;; length_nobnd attribute, prefixed with eventual bnd prefix byte
|
||||
(define_attr "length_nobnd" "" (const_int 0))
|
||||
|
||||
;; The (bounding maximum) length of an instruction in bytes.
|
||||
;; ??? fistp and frndint are in fact fldcw/{fistp,frndint}/fldcw sequences.
|
||||
;; Later we may want to split them and compute proper length as for
|
||||
;; other insns.
|
||||
(define_attr "length" ""
|
||||
(cond [(eq_attr "length_nobnd" "!0")
|
||||
(plus (symbol_ref ("ix86_bnd_prefixed_insn_p (insn)"))
|
||||
(attr "length_nobnd"))
|
||||
(eq_attr "type" "other,multi,fistp,frndint")
|
||||
(cond [(eq_attr "type" "other,multi,fistp,frndint")
|
||||
(const_int 16)
|
||||
(eq_attr "type" "fcmp")
|
||||
(const_int 4)
|
||||
|
@ -641,16 +615,12 @@
|
|||
(define_attr "memory" "none,load,store,both,unknown"
|
||||
(cond [(eq_attr "type" "other,multi,str,lwp")
|
||||
(const_string "unknown")
|
||||
(eq_attr "type" "lea,fcmov,fpspc,mpxmk,mpxchk")
|
||||
(eq_attr "type" "lea,fcmov,fpspc")
|
||||
(const_string "none")
|
||||
(eq_attr "type" "fistp,leave")
|
||||
(const_string "both")
|
||||
(eq_attr "type" "frndint")
|
||||
(const_string "load")
|
||||
(eq_attr "type" "mpxld")
|
||||
(const_string "load")
|
||||
(eq_attr "type" "mpxst")
|
||||
(const_string "store")
|
||||
(eq_attr "type" "push")
|
||||
(if_then_else (match_operand 1 "memory_operand")
|
||||
(const_string "both")
|
||||
|
@ -696,7 +666,7 @@
|
|||
fmov,fcmp,fsgn,
|
||||
sse,ssemov,ssecmp,ssecomi,ssecvt,ssecvt1,sseicvt,
|
||||
sselog1,sseshuf1,sseadd1,sseiadd1,sseishft1,
|
||||
mmx,mmxmov,mmxcmp,mmxcvt,mskmov,msklog,mpxmov")
|
||||
mmx,mmxmov,mmxcmp,mmxcvt,mskmov,msklog")
|
||||
(match_operand 2 "memory_operand"))
|
||||
(const_string "load")
|
||||
(and (eq_attr "type" "icmov,ssemuladd,sse4arg")
|
||||
|
@ -935,21 +905,6 @@
|
|||
(define_mode_iterator DWIH [(SI "!TARGET_64BIT")
|
||||
(DI "TARGET_64BIT")])
|
||||
|
||||
;; Bound modes.
|
||||
(define_mode_iterator BND [(BND32 "!TARGET_LP64")
|
||||
(BND64 "TARGET_LP64")])
|
||||
|
||||
;; Pointer mode corresponding to bound mode.
|
||||
(define_mode_attr bnd_ptr [(BND32 "SI") (BND64 "DI")])
|
||||
|
||||
;; MPX check types
|
||||
(define_int_iterator BNDCHECK [UNSPEC_BNDCL UNSPEC_BNDCU UNSPEC_BNDCN])
|
||||
|
||||
;; Check name
|
||||
(define_int_attr bndcheck [(UNSPEC_BNDCL "cl")
|
||||
(UNSPEC_BNDCU "cu")
|
||||
(UNSPEC_BNDCN "cn")])
|
||||
|
||||
;; Instruction suffix for integer modes.
|
||||
(define_mode_attr imodesuffix [(QI "b") (HI "w") (SI "l") (DI "q")])
|
||||
|
||||
|
@ -10799,10 +10754,10 @@
|
|||
(label_ref (match_operand 0))
|
||||
(pc)))]
|
||||
""
|
||||
"%!%+j%C1\t%l0"
|
||||
"%+j%C1\t%l0"
|
||||
[(set_attr "type" "ibr")
|
||||
(set_attr "modrm" "0")
|
||||
(set (attr "length_nobnd")
|
||||
(set (attr "length")
|
||||
(if_then_else (and (ge (minus (match_dup 0) (pc))
|
||||
(const_int -126))
|
||||
(lt (minus (match_dup 0) (pc))
|
||||
|
@ -10817,10 +10772,10 @@
|
|||
(pc)
|
||||
(label_ref (match_operand 0))))]
|
||||
""
|
||||
"%!%+j%c1\t%l0"
|
||||
"%+j%c1\t%l0"
|
||||
[(set_attr "type" "ibr")
|
||||
(set_attr "modrm" "0")
|
||||
(set (attr "length_nobnd")
|
||||
(set (attr "length")
|
||||
(if_then_else (and (ge (minus (match_dup 0) (pc))
|
||||
(const_int -126))
|
||||
(lt (minus (match_dup 0) (pc))
|
||||
|
@ -11283,9 +11238,9 @@
|
|||
[(set (pc)
|
||||
(label_ref (match_operand 0)))]
|
||||
""
|
||||
"%!jmp\t%l0"
|
||||
"jmp\t%l0"
|
||||
[(set_attr "type" "ibr")
|
||||
(set (attr "length_nobnd")
|
||||
(set (attr "length")
|
||||
(if_then_else (and (ge (minus (match_dup 0) (pc))
|
||||
(const_int -126))
|
||||
(lt (minus (match_dup 0) (pc))
|
||||
|
@ -11305,7 +11260,7 @@
|
|||
(define_insn "*indirect_jump"
|
||||
[(set (pc) (match_operand:W 0 "indirect_branch_operand" "rw"))]
|
||||
""
|
||||
"%!jmp\t%A0"
|
||||
"jmp\t%A0"
|
||||
[(set_attr "type" "ibr")
|
||||
(set_attr "length_immediate" "0")])
|
||||
|
||||
|
@ -11354,7 +11309,7 @@
|
|||
[(set (pc) (match_operand:W 0 "indirect_branch_operand" "rw"))
|
||||
(use (label_ref (match_operand 1)))]
|
||||
""
|
||||
"%!jmp\t%A0"
|
||||
"jmp\t%A0"
|
||||
[(set_attr "type" "ibr")
|
||||
(set_attr "length_immediate" "0")])
|
||||
|
||||
|
@ -11741,8 +11696,8 @@
|
|||
(define_insn "simple_return_internal"
|
||||
[(simple_return)]
|
||||
"reload_completed"
|
||||
"%!ret"
|
||||
[(set_attr "length_nobnd" "1")
|
||||
"ret"
|
||||
[(set_attr "length" "1")
|
||||
(set_attr "atom_unit" "jeu")
|
||||
(set_attr "length_immediate" "0")
|
||||
(set_attr "modrm" "0")])
|
||||
|
@ -11754,12 +11709,7 @@
|
|||
[(simple_return)
|
||||
(unspec [(const_int 0)] UNSPEC_REP)]
|
||||
"reload_completed"
|
||||
{
|
||||
if (ix86_bnd_prefixed_insn_p (insn))
|
||||
return "%!ret";
|
||||
|
||||
return "rep%; ret";
|
||||
}
|
||||
"rep%; ret"
|
||||
[(set_attr "length" "2")
|
||||
(set_attr "atom_unit" "jeu")
|
||||
(set_attr "length_immediate" "0")
|
||||
|
@ -11770,8 +11720,8 @@
|
|||
[(simple_return)
|
||||
(use (match_operand:SI 0 "const_int_operand"))]
|
||||
"reload_completed"
|
||||
"%!ret\t%0"
|
||||
[(set_attr "length_nobnd" "3")
|
||||
"ret\t%0"
|
||||
[(set_attr "length" "3")
|
||||
(set_attr "atom_unit" "jeu")
|
||||
(set_attr "length_immediate" "2")
|
||||
(set_attr "modrm" "0")])
|
||||
|
@ -11780,7 +11730,7 @@
|
|||
[(simple_return)
|
||||
(use (match_operand:SI 0 "register_operand" "r"))]
|
||||
"reload_completed"
|
||||
"%!jmp\t%A0"
|
||||
"jmp\t%A0"
|
||||
[(set_attr "type" "ibr")
|
||||
(set_attr "length_immediate" "0")])
|
||||
|
||||
|
@ -18333,131 +18283,6 @@
|
|||
[(set_attr "type" "other")
|
||||
(set_attr "length" "3")])
|
||||
|
||||
;; MPX instructions
|
||||
|
||||
(define_expand "<mode>_mk"
|
||||
[(set (match_operand:BND 0 "register_operand")
|
||||
(unspec:BND
|
||||
[(mem:<bnd_ptr>
|
||||
(match_par_dup 3
|
||||
[(match_operand:<bnd_ptr> 1 "register_operand")
|
||||
(match_operand:<bnd_ptr> 2 "address_mpx_no_base_operand")]))]
|
||||
UNSPEC_BNDMK))]
|
||||
"TARGET_MPX"
|
||||
{
|
||||
operands[3] = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, operands[1],
|
||||
operands[2]),
|
||||
UNSPEC_BNDMK_ADDR);
|
||||
})
|
||||
|
||||
(define_insn "*<mode>_mk"
|
||||
[(set (match_operand:BND 0 "register_operand" "=B")
|
||||
(unspec:BND
|
||||
[(match_operator:<bnd_ptr> 3 "bnd_mem_operator"
|
||||
[(unspec:<bnd_ptr>
|
||||
[(match_operand:<bnd_ptr> 1 "register_operand" "r")
|
||||
(match_operand:<bnd_ptr> 2 "address_mpx_no_base_operand" "Tb")]
|
||||
UNSPEC_BNDMK_ADDR)])]
|
||||
UNSPEC_BNDMK))]
|
||||
"TARGET_MPX"
|
||||
"bndmk\t{%3, %0|%0, %3}"
|
||||
[(set_attr "type" "mpxmk")])
|
||||
|
||||
(define_expand "mov<mode>"
|
||||
[(set (match_operand:BND 0 "general_operand")
|
||||
(match_operand:BND 1 "general_operand"))]
|
||||
"TARGET_MPX"
|
||||
{
|
||||
ix86_expand_move (<MODE>mode, operands);DONE;
|
||||
})
|
||||
|
||||
(define_insn "*mov<mode>_internal_mpx"
|
||||
[(set (match_operand:BND 0 "nonimmediate_operand" "=B,m")
|
||||
(match_operand:BND 1 "general_operand" "Bm,B"))]
|
||||
"TARGET_MPX"
|
||||
"bndmov\t{%1, %0|%0, %1}"
|
||||
[(set_attr "type" "mpxmov")])
|
||||
|
||||
(define_expand "<mode>_<bndcheck>"
|
||||
[(parallel [(unspec [(match_operand:BND 0 "register_operand")
|
||||
(match_operand:<bnd_ptr> 1 "address_no_seg_operand")] BNDCHECK)
|
||||
(set (match_dup 2)
|
||||
(unspec:BLK [(match_dup 2)] UNSPEC_MPX_FENCE))])]
|
||||
"TARGET_MPX"
|
||||
{
|
||||
operands[2] = gen_rtx_MEM (BLKmode, operands[1]);
|
||||
MEM_VOLATILE_P (operands[2]) = 1;
|
||||
})
|
||||
|
||||
(define_insn "*<mode>_<bndcheck>"
|
||||
[(parallel [(unspec [(match_operand:BND 0 "register_operand" "B")
|
||||
(match_operand:<bnd_ptr> 1 "address_no_seg_operand" "Ts")] BNDCHECK)
|
||||
(set (match_operand:BLK 2 "bnd_mem_operator")
|
||||
(unspec:BLK [(match_dup 2)] UNSPEC_MPX_FENCE))])]
|
||||
"TARGET_MPX"
|
||||
"bnd<bndcheck>\t{%a1, %0|%0, %a1}"
|
||||
[(set_attr "type" "mpxchk")])
|
||||
|
||||
(define_expand "<mode>_ldx"
|
||||
[(parallel [(set:BND (match_operand:BND 0 "register_operand")
|
||||
(unspec:BND
|
||||
[(mem:<bnd_ptr>
|
||||
(match_par_dup 3
|
||||
[(match_operand:<bnd_ptr> 1 "address_mpx_no_index_operand")
|
||||
(match_operand:<bnd_ptr> 2 "register_operand")]))]
|
||||
UNSPEC_BNDLDX))
|
||||
(use (mem:BLK (match_dup 1)))])]
|
||||
"TARGET_MPX"
|
||||
{
|
||||
operands[3] = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, operands[1],
|
||||
operands[2]),
|
||||
UNSPEC_BNDLDX_ADDR);
|
||||
})
|
||||
|
||||
(define_insn "*<mode>_ldx"
|
||||
[(parallel [(set:BND (match_operand:BND 0 "register_operand" "=B")
|
||||
(unspec:BND
|
||||
[(match_operator:<bnd_ptr> 3 "bnd_mem_operator"
|
||||
[(unspec:<bnd_ptr>
|
||||
[(match_operand:<bnd_ptr> 1 "address_mpx_no_index_operand" "Ti")
|
||||
(match_operand:<bnd_ptr> 2 "register_operand" "l")]
|
||||
UNSPEC_BNDLDX_ADDR)])]
|
||||
UNSPEC_BNDLDX))
|
||||
(use (mem:BLK (match_dup 1)))])]
|
||||
"TARGET_MPX"
|
||||
"bndldx\t{%3, %0|%0, %3}"
|
||||
[(set_attr "type" "mpxld")])
|
||||
|
||||
(define_expand "<mode>_stx"
|
||||
[(parallel [(unspec [(mem:<bnd_ptr>
|
||||
(match_par_dup 3
|
||||
[(match_operand:<bnd_ptr> 0 "address_mpx_no_index_operand")
|
||||
(match_operand:<bnd_ptr> 1 "register_operand")]))
|
||||
(match_operand:BND 2 "register_operand")] UNSPEC_BNDSTX)
|
||||
(set (match_dup 4)
|
||||
(unspec:BLK [(match_dup 4)] UNSPEC_MPX_FENCE))])]
|
||||
"TARGET_MPX"
|
||||
{
|
||||
operands[3] = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, operands[0],
|
||||
operands[1]),
|
||||
UNSPEC_BNDLDX_ADDR);
|
||||
operands[4] = gen_rtx_MEM (BLKmode, operands[0]);
|
||||
MEM_VOLATILE_P (operands[4]) = 1;
|
||||
})
|
||||
|
||||
(define_insn "*<mode>_stx"
|
||||
[(parallel [(unspec [(match_operator:<bnd_ptr> 3 "bnd_mem_operator"
|
||||
[(unspec:<bnd_ptr>
|
||||
[(match_operand:<bnd_ptr> 0 "address_mpx_no_index_operand" "Ti")
|
||||
(match_operand:<bnd_ptr> 1 "register_operand" "l")]
|
||||
UNSPEC_BNDLDX_ADDR)])
|
||||
(match_operand:BND 2 "register_operand" "B")] UNSPEC_BNDSTX)
|
||||
(set (match_operand:BLK 4 "bnd_mem_operator")
|
||||
(unspec:BLK [(match_dup 4)] UNSPEC_MPX_FENCE))])]
|
||||
"TARGET_MPX"
|
||||
"bndstx\t{%2, %3|%3, %2}"
|
||||
[(set_attr "type" "mpxst")])
|
||||
|
||||
(include "mmx.md")
|
||||
(include "sse.md")
|
||||
(include "sync.md")
|
||||
|
|
|
@ -669,10 +669,6 @@ mrtm
|
|||
Target Report Mask(ISA_RTM) Var(ix86_isa_flags) Save
|
||||
Support RTM built-in functions and code generation
|
||||
|
||||
mmpx
|
||||
Target Report Mask(ISA_MPX) Var(ix86_isa_flags) Save
|
||||
Support MPX code generation
|
||||
|
||||
mstack-protector-guard=
|
||||
Target RejectNegative Joined Enum(stack_protector_guard) Var(ix86_stack_protector_guard) Init(SSP_TLS)
|
||||
Use given stack-protector guard
|
||||
|
|
|
@ -982,74 +982,9 @@
|
|||
return true;
|
||||
})
|
||||
|
||||
;; Return true if op is valid MPX address operand without base
|
||||
(define_predicate "address_mpx_no_base_operand"
|
||||
(match_operand 0 "address_operand")
|
||||
{
|
||||
struct ix86_address parts;
|
||||
int ok;
|
||||
|
||||
ok = ix86_decompose_address (op, &parts);
|
||||
gcc_assert (ok);
|
||||
|
||||
if (parts.index && parts.base)
|
||||
return false;
|
||||
|
||||
if (parts.seg != SEG_DEFAULT)
|
||||
return false;
|
||||
|
||||
/* Do not support (%rip). */
|
||||
if (parts.disp && flag_pic && TARGET_64BIT
|
||||
&& SYMBOLIC_CONST (parts.disp))
|
||||
{
|
||||
if (GET_CODE (parts.disp) != CONST
|
||||
|| GET_CODE (XEXP (parts.disp, 0)) != PLUS
|
||||
|| GET_CODE (XEXP (XEXP (parts.disp, 0), 0)) != UNSPEC
|
||||
|| !CONST_INT_P (XEXP (XEXP (parts.disp, 0), 1))
|
||||
|| (XINT (XEXP (XEXP (parts.disp, 0), 0), 1) != UNSPEC_DTPOFF
|
||||
&& XINT (XEXP (XEXP (parts.disp, 0), 0), 1) != UNSPEC_NTPOFF))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
})
|
||||
|
||||
;; Return true if op is valid MPX address operand without index
|
||||
(define_predicate "address_mpx_no_index_operand"
|
||||
(match_operand 0 "address_operand")
|
||||
{
|
||||
struct ix86_address parts;
|
||||
int ok;
|
||||
|
||||
ok = ix86_decompose_address (op, &parts);
|
||||
gcc_assert (ok);
|
||||
|
||||
if (parts.index)
|
||||
return false;
|
||||
|
||||
if (parts.seg != SEG_DEFAULT)
|
||||
return false;
|
||||
|
||||
/* Do not support (%rip). */
|
||||
if (parts.disp && flag_pic && TARGET_64BIT
|
||||
&& SYMBOLIC_CONST (parts.disp)
|
||||
&& (GET_CODE (parts.disp) != CONST
|
||||
|| GET_CODE (XEXP (parts.disp, 0)) != PLUS
|
||||
|| GET_CODE (XEXP (XEXP (parts.disp, 0), 0)) != UNSPEC
|
||||
|| !CONST_INT_P (XEXP (XEXP (parts.disp, 0), 1))
|
||||
|| (XINT (XEXP (XEXP (parts.disp, 0), 0), 1) != UNSPEC_DTPOFF
|
||||
&& XINT (XEXP (XEXP (parts.disp, 0), 0), 1) != UNSPEC_NTPOFF)))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
})
|
||||
|
||||
(define_predicate "vsib_mem_operator"
|
||||
(match_code "mem"))
|
||||
|
||||
(define_predicate "bnd_mem_operator"
|
||||
(match_code "mem"))
|
||||
|
||||
;; Return true if the rtx is known to be at least 32 bits aligned.
|
||||
(define_predicate "aligned_operand"
|
||||
(match_operand 0 "general_operand")
|
||||
|
|
|
@ -2367,10 +2367,6 @@ dbxout_type (tree type, int full)
|
|||
dbxout_type (TREE_TYPE (type), 0);
|
||||
break;
|
||||
|
||||
case POINTER_BOUNDS_TYPE:
|
||||
/* No debug info for pointer bounds type supported yet. */
|
||||
break;
|
||||
|
||||
default:
|
||||
gcc_unreachable ();
|
||||
}
|
||||
|
|
|
@ -82,7 +82,6 @@ extensions, accepted by GCC in C90 mode and in C++.
|
|||
* x86 specific memory model extensions for transactional memory:: x86 memory models.
|
||||
* Object Size Checking:: Built-in functions for limited buffer overflow
|
||||
checking.
|
||||
* Pointer Bounds Checker builtins:: Built-in functions for Pointer Bounds Checker.
|
||||
* Cilk Plus Builtins:: Built-in functions for the Cilk Plus language extension.
|
||||
* Other Builtins:: Other built-in functions.
|
||||
* Target Builtins:: Built-in functions specific to particular targets.
|
||||
|
@ -2167,7 +2166,7 @@ attributes are currently defined for functions on all targets:
|
|||
@code{returns_nonnull}, @code{gnu_inline},
|
||||
@code{externally_visible}, @code{hot}, @code{cold}, @code{artificial},
|
||||
@code{no_sanitize_address}, @code{no_address_safety_analysis},
|
||||
@code{no_sanitize_undefined}, @code{bnd_legacy},
|
||||
@code{no_sanitize_undefined},
|
||||
@code{error} and @code{warning}.
|
||||
Several other attributes are defined for functions on particular
|
||||
target systems. Other attributes, including @code{section} are
|
||||
|
@ -3611,12 +3610,6 @@ The @code{no_sanitize_undefined} attribute on functions is used
|
|||
to inform the compiler that it should not check for undefined behavior
|
||||
in the function when compiling with the @option{-fsanitize=undefined} option.
|
||||
|
||||
@item bnd_legacy
|
||||
@cindex @code{bnd_legacy} function attribute
|
||||
The @code{bnd_legacy} attribute on functions is used to inform
|
||||
compiler that function should not be instrumented when compiled
|
||||
with @option{-fcheck-pointers} option.
|
||||
|
||||
@item regparm (@var{number})
|
||||
@cindex @code{regparm} attribute
|
||||
@cindex functions that are passed arguments in registers on the 386
|
||||
|
@ -5410,12 +5403,12 @@ placed in either the @code{.bss_below100} section or the
|
|||
The keyword @code{__attribute__} allows you to specify special
|
||||
attributes of @code{struct} and @code{union} types when you define
|
||||
such types. This keyword is followed by an attribute specification
|
||||
inside double parentheses. Eight attributes are currently defined for
|
||||
inside double parentheses. Seven attributes are currently defined for
|
||||
types: @code{aligned}, @code{packed}, @code{transparent_union},
|
||||
@code{unused}, @code{deprecated}, @code{visibility}, @code{may_alias}
|
||||
and @code{bnd_variable_size}. Other attributes are defined for
|
||||
functions (@pxref{Function Attributes}) and for variables
|
||||
(@pxref{Variable Attributes}).
|
||||
@code{unused}, @code{deprecated}, @code{visibility}, and
|
||||
@code{may_alias}. Other attributes are defined for functions
|
||||
(@pxref{Function Attributes}) and for variables (@pxref{Variable
|
||||
Attributes}).
|
||||
|
||||
You may also specify any one of these attributes with @samp{__}
|
||||
preceding and following its keyword. This allows you to use these
|
||||
|
@ -5707,35 +5700,6 @@ and caught in another, the class must have default visibility.
|
|||
Otherwise the two shared objects are unable to use the same
|
||||
typeinfo node and exception handling will break.
|
||||
|
||||
@item bnd_variable_size
|
||||
When applied to a structure field, this attribute tells Pointer
|
||||
Bounds Checker that the size of this field should not be computed
|
||||
using static type information. It may be used to mark variable
|
||||
sized static array fields placed at the end of a structure.
|
||||
|
||||
@smallexample
|
||||
struct S
|
||||
@{
|
||||
int size;
|
||||
char data[1];
|
||||
@}
|
||||
S *p = (S *)malloc (sizeof(S) + 100);
|
||||
p->data[10] = 0; //Bounds violation
|
||||
@end smallexample
|
||||
|
||||
By using an attribute for a field we may avoid bound violation
|
||||
we most probably do not want to see:
|
||||
|
||||
@smallexample
|
||||
struct S
|
||||
@{
|
||||
int size;
|
||||
char data[1] __attribute__((bnd_variable_size));
|
||||
@}
|
||||
S *p = (S *)malloc (sizeof(S) + 100);
|
||||
p->data[10] = 0; //OK
|
||||
@end smallexample
|
||||
|
||||
@end table
|
||||
|
||||
To specify multiple attributes, separate them by commas within the
|
||||
|
@ -7871,176 +7835,6 @@ format string @var{fmt}. If the compiler is able to optimize them to
|
|||
@code{fputc} etc.@: functions, it does, otherwise the checking function
|
||||
is called and the @var{flag} argument passed to it.
|
||||
|
||||
@node Pointer Bounds Checker builtins
|
||||
@section Pointer Bounds Checker Built-in Functions
|
||||
@findex __builtin___bnd_set_ptr_bounds
|
||||
@findex __builtin___bnd_narrow_ptr_bounds
|
||||
@findex __builtin___bnd_copy_ptr_bounds
|
||||
@findex __builtin___bnd_init_ptr_bounds
|
||||
@findex __builtin___bnd_null_ptr_bounds
|
||||
@findex __builtin___bnd_store_ptr_bounds
|
||||
@findex __builtin___bnd_chk_ptr_lbounds
|
||||
@findex __builtin___bnd_chk_ptr_ubounds
|
||||
@findex __builtin___bnd_chk_ptr_bounds
|
||||
@findex __builtin___bnd_get_ptr_lbound
|
||||
@findex __builtin___bnd_get_ptr_ubound
|
||||
|
||||
GCC provides a set of built-in functions to control Pointer Bounds Checker
|
||||
instrumentation. Note that all Pointer Bounds Checker builtins are allowed
|
||||
to use even if you compile with Pointer Bounds Checker off. But functions
|
||||
behavior may differ in such case.
|
||||
|
||||
@deftypefn {Built-in Function} void * __builtin___bnd_set_ptr_bounds (const void * @var{q}, size_t @var{size})
|
||||
|
||||
This built-in function returns a new pointer with the value of @var{q}, and
|
||||
associate it with the bounds [@var{q}, @var{q}+@var{size}-1]. With Pointer
|
||||
Bounds Checker off built-in function just returns the first argument.
|
||||
|
||||
@smallexample
|
||||
extern void *__wrap_malloc (size_t n)
|
||||
@{
|
||||
void *p = (void *)__real_malloc (n);
|
||||
if (!p) return __builtin___bnd_null_ptr_bounds (p);
|
||||
return __builtin___bnd_set_ptr_bounds (p, n);
|
||||
@}
|
||||
@end smallexample
|
||||
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} void * __builtin___bnd_narrow_ptr_bounds (const void * @var{p}, const void * @var{q}, size_t @var{size})
|
||||
|
||||
This built-in function returns a new pointer with the value of @var{p}
|
||||
and associate it with the narrowed bounds formed by the intersection
|
||||
of bounds associated with @var{q} and the [@var{p}, @var{p} + @var{size} - 1].
|
||||
With Pointer Bounds Checker off built-in function just returns the first
|
||||
argument.
|
||||
|
||||
@smallexample
|
||||
void init_objects (object *objs, size_t size)
|
||||
@{
|
||||
size_t i;
|
||||
/* Initialize objects one-by-one passing pointers with bounds of an object,
|
||||
not the full array of objects. */
|
||||
for (i = 0; i < size; i++)
|
||||
init_object (__builtin___bnd_narrow_ptr_bounds (objs + i, objs, sizeof(object)));
|
||||
@}
|
||||
@end smallexample
|
||||
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} void * __builtin___bnd_copy_ptr_bounds (const void * @var{q}, const void * @var{r})
|
||||
|
||||
This built-in function returns a new pointer with the value of @var{q},
|
||||
and associate it with the bounds already associated with pointer @var{r}.
|
||||
With Pointer Bounds Checker off built-in function just returns the first
|
||||
argument.
|
||||
|
||||
@smallexample
|
||||
/* Here is a way to get pointer to object's field but
|
||||
still with the full object's bounds. */
|
||||
int *field_ptr = __builtin___bnd_copy_ptr_bounds (&objptr->int_filed, objptr);
|
||||
@end smallexample
|
||||
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} void * __builtin___bnd_init_ptr_bounds (const void * @var{q})
|
||||
|
||||
This built-in function returns a new pointer with the value of @var{q}, and
|
||||
associate it with INIT (allowing full memory access) bounds. With Pointer
|
||||
Bounds Checker off built-in function just returns the first argument.
|
||||
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} void * __builtin___bnd_null_ptr_bounds (const void * @var{q})
|
||||
|
||||
This built-in function returns a new pointer with the value of @var{q}, and
|
||||
associate it with NULL (allowing no memory access) bounds. With Pointer
|
||||
Bounds Checker off built-in function just returns the first argument.
|
||||
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} void __builtin___bnd_store_ptr_bounds (const void ** @var{ptr_addr}, const void * @var{ptr_val})
|
||||
|
||||
This built-in function stores the bounds associated with pointer @var{ptr_val}
|
||||
and location @var{ptr_addr} into Bounds Table. This can be useful to propagate
|
||||
bounds from legacy code without touching the associated pointer's memory when
|
||||
pointers were copied as integers. With Pointer Bounds Checker off built-in
|
||||
function call is ignored.
|
||||
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} void __builtin___bnd_chk_ptr_lbounds (const void * @var{q})
|
||||
|
||||
This built-in function checks if the pointer @var{q} is within the lower
|
||||
bound of its associated bounds. With Pointer Bounds Checker off built-in
|
||||
function call is ignored.
|
||||
|
||||
@smallexample
|
||||
extern void *__wrap_memset (void *dst, int c, size_t len)
|
||||
@{
|
||||
if (len > 0)
|
||||
@{
|
||||
__builtin___bnd_chk_ptr_lbounds (dst);
|
||||
__builtin___bnd_chk_ptr_ubounds ((char *)dst + len - 1);
|
||||
__real_memset (dst, c, len);
|
||||
@}
|
||||
return dst;
|
||||
@}
|
||||
@end smallexample
|
||||
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} void __builtin___bnd_chk_ptr_ubounds (const void * @var{q})
|
||||
|
||||
This built-in function checks if the pointer @var{q} is within the upper
|
||||
bound of its associated bounds. With Pointer Bounds Checker off built-in
|
||||
function call is ignored.
|
||||
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} void __builtin___bnd_chk_ptr_bounds (const void * @var{q}, size_t @var{size})
|
||||
|
||||
This built-in function checks if [@var{q}, @var{q} + @var{size} - 1] is within
|
||||
the lower and upper bounds associated with @var{q}. With Pointer Bounds Checker
|
||||
off built-in function call is ignored.
|
||||
|
||||
@smallexample
|
||||
extern void *__wrap_memcpy (void *dst, const void *src, size_t n)
|
||||
@{
|
||||
if (n > 0)
|
||||
@{
|
||||
__bnd_chk_ptr_bounds (dst, n);
|
||||
__bnd_chk_ptr_bounds (src, n);
|
||||
__real_memcpy (dst, src, n);
|
||||
@}
|
||||
return dst;
|
||||
@}
|
||||
@end smallexample
|
||||
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} const void * __builtin___bnd_get_ptr_lbound (const void * @var{q})
|
||||
|
||||
This built-in function returns the lower bound (which is a pointer) associated
|
||||
with the pointer @var{q}. This is at least useful for debugging using printf.
|
||||
With Pointer Bounds Checker off built-in function returns 0.
|
||||
|
||||
@smallexample
|
||||
void *lb = __builtin___bnd_get_ptr_lbound (q);
|
||||
void *ub = __builtin___bnd_get_ptr_ubound (q);
|
||||
printf ("q = %p lb(q) = %p ub(q) = %p", q, lb, ub);
|
||||
@end smallexample
|
||||
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} const void * __builtin___bnd_get_ptr_ubound (const void * @var{q})
|
||||
|
||||
This built-in function returns the upper bound (which is a pointer) associated
|
||||
with the pointer @var{q}. With Pointer Bounds Checker off built-in function
|
||||
returns -1.
|
||||
|
||||
@end deftypefn
|
||||
|
||||
@node Cilk Plus Builtins
|
||||
@section Cilk Plus C/C++ language extension Built-in Functions.
|
||||
|
||||
|
|
|
@ -669,7 +669,7 @@ Objective-C and Objective-C++ Dialects}.
|
|||
-mavx2 -mavx512f -mavx512pf -mavx512er -mavx512cd @gol
|
||||
-maes -mpclmul -mfsgsbase -mrdrnd -mf16c -mfma @gol
|
||||
-msse4a -m3dnow -mpopcnt -mabm -mbmi -mtbm -mfma4 -mxop -mlzcnt @gol
|
||||
-mbmi2 -mfxsr -mxsave -mxsaveopt -mrtm -mlwp -mmpx -mthreads @gol
|
||||
-mbmi2 -mfxsr -mxsave -mxsaveopt -mrtm -mlwp -mthreads @gol
|
||||
-mno-align-stringops -minline-all-stringops @gol
|
||||
-minline-stringops-dynamically -mstringop-strategy=@var{alg} @gol
|
||||
-mmemcpy-strategy=@var{strategy} -mmemset-strategy=@var{strategy}
|
||||
|
@ -15090,8 +15090,6 @@ preferred alignment to @option{-mpreferred-stack-boundary=2}.
|
|||
@itemx -mrtm
|
||||
@itemx -mtbm
|
||||
@itemx -mno-tbm
|
||||
@itemx -mmpx
|
||||
@itemx -mno-mpx
|
||||
@opindex mmmx
|
||||
@opindex mno-mmx
|
||||
@opindex msse
|
||||
|
@ -15101,7 +15099,7 @@ preferred alignment to @option{-mpreferred-stack-boundary=2}.
|
|||
These switches enable or disable the use of instructions in the MMX, SSE,
|
||||
SSE2, SSE3, SSSE3, SSE4.1, AVX, AVX2, AVX512F, AVX512PF, AVX512ER, AVX512CD,
|
||||
AES, PCLMUL, FSGSBASE, RDRND, F16C, FMA, SSE4A, FMA4, XOP, LWP, ABM, BMI, BMI2,
|
||||
FXSR, XSAVE, XSAVEOPT, LZCNT, RTM, MPX or 3DNow!@:
|
||||
FXSR, XSAVE, XSAVEOPT, LZCNT, RTM or 3DNow!@:
|
||||
extended instruction sets.
|
||||
These extensions are also available as built-in functions: see
|
||||
@ref{X86 Built-in Functions}, for details of the functions enabled and
|
||||
|
|
|
@ -1295,12 +1295,6 @@ These modes stand for a complex number represented as a pair of integer
|
|||
values. The integer values are in @code{QImode}, @code{HImode},
|
||||
@code{SImode}, @code{DImode}, @code{TImode}, and @code{OImode},
|
||||
respectively.
|
||||
|
||||
@findex BND32mode
|
||||
@findex BND64mode
|
||||
@item BND32mode BND64mode
|
||||
These modes stand for bounds for pointer of 32 and 64 bit size respectively.
|
||||
Mode size is double pointer mode size.
|
||||
@end table
|
||||
|
||||
The machine description defines @code{Pmode} as a C macro which expands
|
||||
|
@ -1388,12 +1382,6 @@ any @code{CC_MODE} modes listed in the @file{@var{machine}-modes.def}.
|
|||
@xref{Jump Patterns},
|
||||
also see @ref{Condition Code}.
|
||||
|
||||
@findex MODE_POINTER_BOUNDS
|
||||
@item MODE_POINTER_BOUNDS
|
||||
Pointer bounds modes. Used to represent values of pointer bounds type.
|
||||
Operations in these modes may be executed as NOPs depending on hardware
|
||||
features and environment setup.
|
||||
|
||||
@findex MODE_RANDOM
|
||||
@item MODE_RANDOM
|
||||
This is a catchall mode class for modes which don't fit into the above
|
||||
|
|
117
gcc/doc/tm.texi
117
gcc/doc/tm.texi
|
@ -4338,13 +4338,6 @@ This hook returns the va_list type of the calling convention specified by
|
|||
The default version of this hook returns @code{va_list_type_node}.
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Target Hook} tree TARGET_FN_ABI_VA_LIST_BOUNDS_SIZE (tree @var{fndecl})
|
||||
This hook returns size for @code{va_list} object in function specified
|
||||
by @var{fndecl}. This hook is used by Pointer Bounds Checker to build bounds
|
||||
for @code{va_list} object. Return @code{integer_zero_node} if no bounds
|
||||
should be used (e.g. @code{va_list} is a scalar pointer to the stack).
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Target Hook} tree TARGET_CANONICAL_VA_LIST_TYPE (tree @var{type})
|
||||
This hook returns the va_list type of the calling convention specified by the
|
||||
type of @var{type}. If @var{type} is not a valid va_list type, it returns
|
||||
|
@ -5162,26 +5155,6 @@ defined, then define this hook to return @code{true} if
|
|||
Otherwise, you should not define this hook.
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Target Hook} rtx TARGET_LOAD_BOUNDS_FOR_ARG (rtx @var{slot}, rtx @var{arg}, rtx @var{slot_no})
|
||||
This hook is used by expand pass to emit insn to load bounds of
|
||||
@var{arg} passed in @var{slot}. Expand pass uses this hook in case
|
||||
bounds of @var{arg} are not passed in register. If @var{slot} is a
|
||||
memory, then bounds are loaded as for regular pointer loaded from
|
||||
memory. If @var{slot} is not a memory then @var{slot_no} is an integer
|
||||
constant holding number of the target dependent special slot which
|
||||
should be used to obtain bounds. Hook returns RTX holding loaded bounds.
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Target Hook} void TARGET_STORE_BOUNDS_FOR_ARG (rtx @var{arg}, rtx @var{slot}, rtx @var{bounds}, rtx @var{slot_no})
|
||||
This hook is used by expand pass to emit insns to store @var{bounds} of
|
||||
@var{arg} passed in @var{slot}. Expand pass uses this hook in case
|
||||
@var{bounds} of @var{arg} are not passed in register. If @var{slot} is a
|
||||
memory, then @var{bounds} are stored as for regular pointer stored in
|
||||
memory. If @var{slot} is not a memory then @var{slot_no} is an integer
|
||||
constant holding number of the target dependent special slot which
|
||||
should be used to store @var{bounds}.
|
||||
@end deftypefn
|
||||
|
||||
@node Trampolines
|
||||
@section Trampolines for Nested Functions
|
||||
@cindex trampolines for nested functions
|
||||
|
@ -10977,96 +10950,6 @@ ignored. This function should return the result of the call to the
|
|||
built-in function.
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Target Hook} tree TARGET_BUILTIN_CHKP_FUNCTION (unsigned @var{fcode})
|
||||
This hook allows target to redefine built-in functions used by
|
||||
Pointer Bounds Checker for code instrumentation. Hook should return
|
||||
fndecl of function implementing generic builtin whose code is
|
||||
passed in @var{fcode}. Currently following built-in functions are
|
||||
obtained using this hook:
|
||||
@deftypefn {Built-in Function} bnd __chkp_bndmk (const void *@var{lb}, size_t @var{size})
|
||||
Function code - BUILT_IN_CHKP_BNDMK. This built-in function is used
|
||||
by Pointer Bounds Checker to create bound values. @var{lb} holds low
|
||||
bound of the resulting bounds. @var{size} holds size of created bounds.
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} void __chkp_bndstx (const void **@var{loc}, const void *@var{ptr}, bnd @var{b})
|
||||
Function code - @code{BUILT_IN_CHKP_BNDSTX}. This built-in function is used
|
||||
by Pointer Bounds Checker to store bounds @var{b} for pointer @var{ptr}
|
||||
stored by address @var{loc}.
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} bnd __chkp_bndldx (const void **@var{loc}, const void *@var{ptr})
|
||||
Function code - @code{BUILT_IN_CHKP_BNDLDX}. This built-in function is used
|
||||
by Pointer Bounds Checker to get bounds of pointer @var{ptr} loaded by
|
||||
address @var{loc}.
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} void __chkp_bndcl (bnd @var{b}, const void *@var{ptr})
|
||||
Function code - @code{BUILT_IN_CHKP_BNDCL}. This built-in function is used
|
||||
by Pointer Bounds Checker to perform check for pointer @var{ptr} against
|
||||
lower bound of bounds @var{b}.
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} void __chkp_bndcu (bnd @var{b}, const void *@var{ptr})
|
||||
Function code - @code{BUILT_IN_CHKP_BNDCU}. This built-in function is used
|
||||
by Pointer Bounds Checker to perform check for pointer @var{ptr} against
|
||||
upper bound of bounds @var{b}.
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} bnd __chkp_bndret (void *@var{ptr})
|
||||
Function code - @code{BUILT_IN_CHKP_BNDRET}. This built-in function is used
|
||||
by Pointer Bounds Checker to obtain bounds returned by call statement.
|
||||
@var{ptr} passed to buil-in is @code{SSA_NAME} returned by call.
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} bnd __chkp_arg_bnd (void *@var{arg})
|
||||
Function code - @code{BUILT_IN_CHKP_ARG_BND}. This built-in function is
|
||||
used by Pointer Bounds Checker to obtain bounds passed for input argument.
|
||||
@var{arg} is default @code{SSA_NAME} of the @code{PARM_DECL} whose
|
||||
bounds we want to obtain.
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} bnd __chkp_intersect (bnd @var{b1}, bnd @var{b2})
|
||||
Function code - @code{BUILT_IN_CHKP_INTERSECT}. This built-in function
|
||||
returns intersection of bounds @var{b1} and @var{b2}.
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} bnd __chkp_narrow (const void *@var{ptr}, bnd @var{b}, size_t @var{s})
|
||||
Function code - @code{BUILT_IN_CHKP_NARROW}. This built-in function
|
||||
returns intersection of bounds @var{b} and
|
||||
[@var{ptr}, @var{ptr} + @var{s} - @code{1}].
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} void *__chkp_set_bounds (const void *@var{ptr}, size_t @var{s})
|
||||
Function code - @code{BUILT_IN_CHKP_SET_PTR_BOUNDS}. This built-in function
|
||||
returns @var{ptr} with bounds [@var{ptr}, @var{ptr} + @var{s} - @code{1}].
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} size_t __chkp_sizeof (const void *@var{ptr})
|
||||
Function code - @code{BUILT_IN_CHKP_SIZEOF}. This built-in function
|
||||
returns size of object referenced by @var{ptr}. @var{ptr} is always
|
||||
@code{ADDR_EXPR} of @code{VAR_DECL}. This built-in is used by
|
||||
Pointer Boudns Checker when bounds of object cannot be computed statically
|
||||
(e.g. object has incomplete type).
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} const void *__chkp_extract_lower (bnd @var{b})
|
||||
Function code - @code{BUILT_IN_CHKP_EXTRACT_LOWER}. This built-in function
|
||||
returns lower bound of bounds @var{b}.
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Built-in Function} const void *__chkp_extract_upper (bnd @var{b})
|
||||
Function code - @code{BUILT_IN_CHKP_EXTRACT_UPPER}. This built-in function
|
||||
returns upper bound of bounds @var{b}.
|
||||
@end deftypefn
|
||||
@end deftypefn
|
||||
@deftypefn {Target Hook} tree TARGET_CHKP_BOUND_TYPE (void)
|
||||
Return type to be used for bounds
|
||||
@end deftypefn
|
||||
@deftypefn {Target Hook} {enum machine_mode} TARGET_CHKP_BOUND_MODE (void)
|
||||
Return mode to be used for bounds.
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Target Hook} tree TARGET_RESOLVE_OVERLOADED_BUILTIN (unsigned int @var{loc}, tree @var{fndecl}, void *@var{arglist})
|
||||
Select a replacement for a machine specific built-in function that
|
||||
was set up by @samp{TARGET_INIT_BUILTINS}. This is done
|
||||
|
|
|
@ -3696,8 +3696,6 @@ stack.
|
|||
|
||||
@hook TARGET_FN_ABI_VA_LIST
|
||||
|
||||
@hook TARGET_FN_ABI_VA_LIST_BOUNDS_SIZE
|
||||
|
||||
@hook TARGET_CANONICAL_VA_LIST_TYPE
|
||||
|
||||
@hook TARGET_GIMPLIFY_VA_ARG_EXPR
|
||||
|
@ -4068,10 +4066,6 @@ These machine description macros help implement varargs:
|
|||
|
||||
@hook TARGET_PRETEND_OUTGOING_VARARGS_NAMED
|
||||
|
||||
@hook TARGET_LOAD_BOUNDS_FOR_ARG
|
||||
|
||||
@hook TARGET_STORE_BOUNDS_FOR_ARG
|
||||
|
||||
@node Trampolines
|
||||
@section Trampolines for Nested Functions
|
||||
@cindex trampolines for nested functions
|
||||
|
@ -8210,10 +8204,6 @@ to by @var{ce_info}.
|
|||
|
||||
@hook TARGET_EXPAND_BUILTIN
|
||||
|
||||
@hook TARGET_BUILTIN_CHKP_FUNCTION
|
||||
@hook TARGET_CHKP_BOUND_TYPE
|
||||
@hook TARGET_CHKP_BOUND_MODE
|
||||
|
||||
@hook TARGET_RESOLVE_OVERLOADED_BUILTIN
|
||||
|
||||
@hook TARGET_FOLD_BUILTIN
|
||||
|
|
|
@ -18289,7 +18289,7 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
|
|||
gen_formal_parameter_pack_die (generic_decl_parm,
|
||||
parm, subr_die,
|
||||
&parm);
|
||||
else if (parm && !POINTER_BOUNDS_P (parm))
|
||||
else if (parm)
|
||||
{
|
||||
dw_die_ref parm_die = gen_decl_die (parm, NULL, subr_die);
|
||||
|
||||
|
@ -18301,8 +18301,6 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
|
|||
|
||||
parm = DECL_CHAIN (parm);
|
||||
}
|
||||
else if (parm)
|
||||
parm = DECL_CHAIN (parm);
|
||||
|
||||
if (generic_decl_parm)
|
||||
generic_decl_parm = DECL_CHAIN (generic_decl_parm);
|
||||
|
@ -19800,7 +19798,6 @@ gen_type_die_with_usage (tree type, dw_die_ref context_die,
|
|||
case FIXED_POINT_TYPE:
|
||||
case COMPLEX_TYPE:
|
||||
case BOOLEAN_TYPE:
|
||||
case POINTER_BOUNDS_TYPE:
|
||||
/* No DIEs needed for fundamental types. */
|
||||
break;
|
||||
|
||||
|
@ -20451,8 +20448,7 @@ dwarf2out_global_decl (tree decl)
|
|||
declarations, file-scope (extern) function declarations (which
|
||||
had no corresponding body) and file-scope tagged type declarations
|
||||
and definitions which have not yet been forced out. */
|
||||
if ((TREE_CODE (decl) != FUNCTION_DECL || !DECL_INITIAL (decl))
|
||||
&& !POINTER_BOUNDS_P (decl))
|
||||
if (TREE_CODE (decl) != FUNCTION_DECL || !DECL_INITIAL (decl))
|
||||
dwarf2out_decl (decl);
|
||||
}
|
||||
|
||||
|
|
|
@ -333,7 +333,6 @@ complete_mode (struct mode_data *m)
|
|||
break;
|
||||
|
||||
case MODE_INT:
|
||||
case MODE_POINTER_BOUNDS:
|
||||
case MODE_FLOAT:
|
||||
case MODE_DECIMAL_FLOAT:
|
||||
case MODE_FRACT:
|
||||
|
@ -535,19 +534,6 @@ make_special_mode (enum mode_class cl, const char *name,
|
|||
new_mode (cl, name, file, line);
|
||||
}
|
||||
|
||||
#define POINTER_BOUNDS_MODE(N, Y) \
|
||||
make_pointer_bounds_mode (#N, Y, __FILE__, __LINE__)
|
||||
|
||||
static void ATTRIBUTE_UNUSED
|
||||
make_pointer_bounds_mode (const char *name,
|
||||
unsigned int bytesize,
|
||||
const char *file, unsigned int line)
|
||||
{
|
||||
struct mode_data *m = new_mode (MODE_POINTER_BOUNDS, name, file, line);
|
||||
m->bytesize = bytesize;
|
||||
}
|
||||
|
||||
|
||||
#define INT_MODE(N, Y) FRACTIONAL_INT_MODE (N, -1U, Y)
|
||||
#define FRACTIONAL_INT_MODE(N, B, Y) \
|
||||
make_int_mode (#N, B, Y, __FILE__, __LINE__)
|
||||
|
|
|
@ -547,12 +547,11 @@ dump_gimple_assign (pretty_printer *buffer, gimple gs, int spc, int flags)
|
|||
static void
|
||||
dump_gimple_return (pretty_printer *buffer, gimple gs, int spc, int flags)
|
||||
{
|
||||
tree t, t2;
|
||||
tree t;
|
||||
|
||||
t = gimple_return_retval (gs);
|
||||
t2 = gimple_return_retbnd (gs);
|
||||
if (flags & TDF_RAW)
|
||||
dump_gimple_fmt (buffer, spc, flags, "%G <%T %T>", gs, t, t2);
|
||||
dump_gimple_fmt (buffer, spc, flags, "%G <%T>", gs, t);
|
||||
else
|
||||
{
|
||||
pp_string (buffer, "return");
|
||||
|
@ -561,11 +560,6 @@ dump_gimple_return (pretty_printer *buffer, gimple gs, int spc, int flags)
|
|||
pp_space (buffer);
|
||||
dump_generic_node (buffer, t, spc, flags, false);
|
||||
}
|
||||
if (t2)
|
||||
{
|
||||
pp_string (buffer, ", ");
|
||||
dump_generic_node (buffer, t2, spc, flags, false);
|
||||
}
|
||||
pp_semicolon (buffer);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -180,7 +180,7 @@ gimple_build_with_ops_stat (enum gimple_code code, unsigned subcode,
|
|||
gimple
|
||||
gimple_build_return (tree retval)
|
||||
{
|
||||
gimple s = gimple_build_with_ops (GIMPLE_RETURN, ERROR_MARK, 2);
|
||||
gimple s = gimple_build_with_ops (GIMPLE_RETURN, ERROR_MARK, 1);
|
||||
if (retval)
|
||||
gimple_return_set_retval (s, retval);
|
||||
return s;
|
||||
|
|
46
gcc/gimple.h
46
gcc/gimple.h
|
@ -90,7 +90,6 @@ enum gf_mask {
|
|||
GF_CALL_NOTHROW = 1 << 4,
|
||||
GF_CALL_ALLOCA_FOR_VAR = 1 << 5,
|
||||
GF_CALL_INTERNAL = 1 << 6,
|
||||
GF_CALL_WITH_BOUNDS = 1 << 7,
|
||||
GF_OMP_PARALLEL_COMBINED = 1 << 0,
|
||||
GF_OMP_FOR_KIND_MASK = 3 << 0,
|
||||
GF_OMP_FOR_KIND_FOR = 0 << 0,
|
||||
|
@ -2435,31 +2434,6 @@ gimple_call_internal_p (const_gimple gs)
|
|||
}
|
||||
|
||||
|
||||
/* Return true if call GS is marked as instrumented by
|
||||
Pointer Bounds Checker. */
|
||||
|
||||
static inline bool
|
||||
gimple_call_with_bounds_p (const_gimple gs)
|
||||
{
|
||||
GIMPLE_CHECK (gs, GIMPLE_CALL);
|
||||
return (gs->subcode & GF_CALL_WITH_BOUNDS) != 0;
|
||||
}
|
||||
|
||||
|
||||
/* If INSTRUMENTED_P is true, marm statement GS as instrumented by
|
||||
Pointer Bounds Checker. */
|
||||
|
||||
static inline void
|
||||
gimple_call_set_with_bounds (gimple gs, bool with_bounds)
|
||||
{
|
||||
GIMPLE_CHECK (gs, GIMPLE_CALL);
|
||||
if (with_bounds)
|
||||
gs->subcode |= GF_CALL_WITH_BOUNDS;
|
||||
else
|
||||
gs->subcode &= ~GF_CALL_WITH_BOUNDS;
|
||||
}
|
||||
|
||||
|
||||
/* Return the target of internal call GS. */
|
||||
|
||||
static inline enum internal_fn
|
||||
|
@ -5539,26 +5513,6 @@ gimple_return_set_retval (gimple gs, tree retval)
|
|||
}
|
||||
|
||||
|
||||
/* Return the return bounds for GIMPLE_RETURN GS. */
|
||||
|
||||
static inline tree
|
||||
gimple_return_retbnd (const_gimple gs)
|
||||
{
|
||||
GIMPLE_CHECK (gs, GIMPLE_RETURN);
|
||||
return gimple_op (gs, 1);
|
||||
}
|
||||
|
||||
|
||||
/* Set RETVAL to be the return bounds for GIMPLE_RETURN GS. */
|
||||
|
||||
static inline void
|
||||
gimple_return_set_retbnd (gimple gs, tree retval)
|
||||
{
|
||||
GIMPLE_CHECK (gs, GIMPLE_RETURN);
|
||||
gimple_set_op (gs, 1, retval);
|
||||
}
|
||||
|
||||
|
||||
/* Returns true when the gimple statement STMT is any of the OpenMP types. */
|
||||
|
||||
#define CASE_GIMPLE_OMP \
|
||||
|
|
|
@ -3774,19 +3774,10 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
|
|||
individual element initialization. Also don't do this for small
|
||||
all-zero initializers (which aren't big enough to merit
|
||||
clearing), and don't try to make bitwise copies of
|
||||
TREE_ADDRESSABLE types.
|
||||
|
||||
We cannot apply such transformation when compiling chkp static
|
||||
initializer because creation of initializer image in the memory
|
||||
will require static initialization of bounds for it. It should
|
||||
result in another gimplification of similar initializer and we
|
||||
may fall into infinite loop. */
|
||||
TREE_ADDRESSABLE types. */
|
||||
if (valid_const_initializer
|
||||
&& !(cleared || num_nonzero_elements == 0)
|
||||
&& !TREE_ADDRESSABLE (type)
|
||||
&& (!current_function_decl
|
||||
|| !lookup_attribute ("chkp ctor",
|
||||
DECL_ATTRIBUTES (current_function_decl))))
|
||||
&& !TREE_ADDRESSABLE (type))
|
||||
{
|
||||
HOST_WIDE_INT size = int_size_in_bytes (type);
|
||||
unsigned int align;
|
||||
|
|
30
gcc/ipa.c
30
gcc/ipa.c
|
@ -1275,11 +1275,9 @@ make_pass_ipa_whole_program_visibility (gcc::context *ctxt)
|
|||
}
|
||||
|
||||
/* Generate and emit a static constructor or destructor. WHICH must
|
||||
be one of 'I' (for a constructor), 'D' (for a destructor), 'P'
|
||||
(for chp static vars constructor) or 'B' (for chkp static bounds
|
||||
constructor). BODY is a STATEMENT_LIST containing GENERIC
|
||||
statements. PRIORITY is the initialization priority for this
|
||||
constructor or destructor.
|
||||
be one of 'I' (for a constructor) or 'D' (for a destructor). BODY
|
||||
is a STATEMENT_LIST containing GENERIC statements. PRIORITY is the
|
||||
initialization priority for this constructor or destructor.
|
||||
|
||||
FINAL specify whether the externally visible name for collect2 should
|
||||
be produced. */
|
||||
|
@ -1338,20 +1336,6 @@ cgraph_build_static_cdtor_1 (char which, tree body, int priority, bool final)
|
|||
DECL_STATIC_CONSTRUCTOR (decl) = 1;
|
||||
decl_init_priority_insert (decl, priority);
|
||||
break;
|
||||
case 'P':
|
||||
DECL_STATIC_CONSTRUCTOR (decl) = 1;
|
||||
DECL_ATTRIBUTES (decl) = tree_cons (get_identifier ("chkp ctor"),
|
||||
NULL,
|
||||
NULL_TREE);
|
||||
decl_init_priority_insert (decl, priority);
|
||||
break;
|
||||
case 'B':
|
||||
DECL_STATIC_CONSTRUCTOR (decl) = 1;
|
||||
DECL_ATTRIBUTES (decl) = tree_cons (get_identifier ("bnd_legacy"),
|
||||
NULL,
|
||||
NULL_TREE);
|
||||
decl_init_priority_insert (decl, priority);
|
||||
break;
|
||||
case 'D':
|
||||
DECL_STATIC_DESTRUCTOR (decl) = 1;
|
||||
decl_fini_priority_insert (decl, priority);
|
||||
|
@ -1369,11 +1353,9 @@ cgraph_build_static_cdtor_1 (char which, tree body, int priority, bool final)
|
|||
}
|
||||
|
||||
/* Generate and emit a static constructor or destructor. WHICH must
|
||||
be one of 'I' (for a constructor), 'D' (for a destructor), 'P'
|
||||
(for chkp static vars constructor) or 'B' (for chkp static bounds
|
||||
constructor). BODY is a STATEMENT_LIST containing GENERIC
|
||||
statements. PRIORITY is the initialization priority for this
|
||||
constructor or destructor. */
|
||||
be one of 'I' (for a constructor) or 'D' (for a destructor). BODY
|
||||
is a STATEMENT_LIST containing GENERIC statements. PRIORITY is the
|
||||
initialization priority for this constructor or destructor. */
|
||||
|
||||
void
|
||||
cgraph_build_static_cdtor (char which, tree body, int priority)
|
||||
|
|
|
@ -581,7 +581,6 @@ lto_output_varpool_node (struct lto_simple_output_block *ob, struct varpool_node
|
|||
&& boundary_p && !DECL_EXTERNAL (node->decl), 1);
|
||||
/* in_other_partition. */
|
||||
}
|
||||
bp_pack_value (&bp, node->need_bounds_init, 1);
|
||||
streamer_write_bitpack (&bp);
|
||||
if (node->same_comdat_group && !boundary_p)
|
||||
{
|
||||
|
@ -1152,7 +1151,6 @@ input_varpool_node (struct lto_file_decl_data *file_data,
|
|||
node->analyzed = bp_unpack_value (&bp, 1);
|
||||
node->used_from_other_partition = bp_unpack_value (&bp, 1);
|
||||
node->in_other_partition = bp_unpack_value (&bp, 1);
|
||||
node->need_bounds_init = bp_unpack_value (&bp, 1);
|
||||
if (node->in_other_partition)
|
||||
{
|
||||
DECL_EXTERNAL (node->decl) = 1;
|
||||
|
|
|
@ -174,9 +174,6 @@ extern const unsigned char mode_class[NUM_MACHINE_MODES];
|
|||
|| CLASS == MODE_ACCUM \
|
||||
|| CLASS == MODE_UACCUM)
|
||||
|
||||
#define POINTER_BOUNDS_MODE_P(MODE) \
|
||||
(GET_MODE_CLASS (MODE) == MODE_POINTER_BOUNDS)
|
||||
|
||||
/* Get the size in bytes and bits of an object of mode MODE. */
|
||||
|
||||
extern CONST_MODE_SIZE unsigned char mode_size[NUM_MACHINE_MODES];
|
||||
|
|
|
@ -22,7 +22,6 @@ along with GCC; see the file COPYING3. If not see
|
|||
DEF_MODE_CLASS (MODE_CC), /* condition code in a register */ \
|
||||
DEF_MODE_CLASS (MODE_INT), /* integer */ \
|
||||
DEF_MODE_CLASS (MODE_PARTIAL_INT), /* integer with padding bits */ \
|
||||
DEF_MODE_CLASS (MODE_POINTER_BOUNDS), /* bounds */ \
|
||||
DEF_MODE_CLASS (MODE_FRACT), /* signed fractional number */ \
|
||||
DEF_MODE_CLASS (MODE_UFRACT), /* unsigned fractional number */ \
|
||||
DEF_MODE_CLASS (MODE_ACCUM), /* signed accumulator */ \
|
||||
|
|
|
@ -266,8 +266,7 @@ struct GTY((chain_next ("RTX_NEXT (&%h)"),
|
|||
In a CODE_LABEL, part of the two-bit alternate entry field.
|
||||
1 in a CONCAT is VAL_EXPR_IS_COPIED in var-tracking.c.
|
||||
1 in a VALUE is SP_BASED_VALUE_P in cselib.c.
|
||||
1 in a SUBREG generated by LRA for reload insns.
|
||||
1 in a CALL for calls instrumented by Pointer Bounds Checker. */
|
||||
1 in a SUBREG generated by LRA for reload insns. */
|
||||
unsigned int jump : 1;
|
||||
/* In a CODE_LABEL, part of the two-bit alternate entry field.
|
||||
1 in a MEM if it cannot trap.
|
||||
|
@ -1421,10 +1420,6 @@ do { \
|
|||
#define LRA_SUBREG_P(RTX) \
|
||||
(RTL_FLAG_CHECK1 ("LRA_SUBREG_P", (RTX), SUBREG)->jump)
|
||||
|
||||
/* True if call is instrumented by Pointer Bounds Checker. */
|
||||
#define CALL_EXPR_WITH_BOUNDS_P(RTX) \
|
||||
(RTL_FLAG_CHECK1 ("CALL_EXPR_WITH_BOUNDS_P", (RTX), CALL)->jump)
|
||||
|
||||
/* Access various components of an ASM_OPERANDS rtx. */
|
||||
|
||||
#define ASM_OPERANDS_TEMPLATE(RTX) XCSTR (RTX, 0, ASM_OPERANDS)
|
||||
|
|
|
@ -386,7 +386,6 @@ int_mode_for_mode (enum machine_mode mode)
|
|||
case MODE_VECTOR_ACCUM:
|
||||
case MODE_VECTOR_UFRACT:
|
||||
case MODE_VECTOR_UACCUM:
|
||||
case MODE_POINTER_BOUNDS:
|
||||
mode = mode_for_size (GET_MODE_BITSIZE (mode), MODE_INT, 0);
|
||||
break;
|
||||
|
||||
|
@ -2125,14 +2124,6 @@ layout_type (tree type)
|
|||
SET_TYPE_MODE (type, VOIDmode);
|
||||
break;
|
||||
|
||||
case POINTER_BOUNDS_TYPE:
|
||||
SET_TYPE_MODE (type,
|
||||
mode_for_size (TYPE_PRECISION (type),
|
||||
MODE_POINTER_BOUNDS, 0));
|
||||
TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (TYPE_MODE (type)));
|
||||
TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (TYPE_MODE (type)));
|
||||
break;
|
||||
|
||||
case OFFSET_TYPE:
|
||||
TYPE_SIZE (type) = bitsize_int (POINTER_SIZE);
|
||||
TYPE_SIZE_UNIT (type) = size_int (POINTER_SIZE / BITS_PER_UNIT);
|
||||
|
|
131
gcc/target.def
131
gcc/target.def
|
@ -2078,104 +2078,6 @@ built-in function.",
|
|||
(tree exp, rtx target, rtx subtarget, enum machine_mode mode, int ignore),
|
||||
default_expand_builtin)
|
||||
|
||||
DEFHOOK
|
||||
(builtin_chkp_function,
|
||||
"This hook allows target to redefine built-in functions used by\n\
|
||||
Pointer Bounds Checker for code instrumentation. Hook should return\n\
|
||||
fndecl of function implementing generic builtin whose code is\n\
|
||||
passed in @var{fcode}. Currently following built-in functions are\n\
|
||||
obtained using this hook:\n\
|
||||
@deftypefn {Built-in Function} bnd __chkp_bndmk (const void *@var{lb}, size_t @var{size})\n\
|
||||
Function code - BUILT_IN_CHKP_BNDMK. This built-in function is used\n\
|
||||
by Pointer Bounds Checker to create bound values. @var{lb} holds low\n\
|
||||
bound of the resulting bounds. @var{size} holds size of created bounds.\n\
|
||||
@end deftypefn\n\
|
||||
\n\
|
||||
@deftypefn {Built-in Function} void __chkp_bndstx (const void **@var{loc}, const void *@var{ptr}, bnd @var{b})\n\
|
||||
Function code - @code{BUILT_IN_CHKP_BNDSTX}. This built-in function is used\n\
|
||||
by Pointer Bounds Checker to store bounds @var{b} for pointer @var{ptr}\n\
|
||||
stored by address @var{loc}.\n\
|
||||
@end deftypefn\n\
|
||||
\n\
|
||||
@deftypefn {Built-in Function} bnd __chkp_bndldx (const void **@var{loc}, const void *@var{ptr})\n\
|
||||
Function code - @code{BUILT_IN_CHKP_BNDLDX}. This built-in function is used\n\
|
||||
by Pointer Bounds Checker to get bounds of pointer @var{ptr} loaded by\n\
|
||||
address @var{loc}.\n\
|
||||
@end deftypefn\n\
|
||||
\n\
|
||||
@deftypefn {Built-in Function} void __chkp_bndcl (bnd @var{b}, const void *@var{ptr})\n\
|
||||
Function code - @code{BUILT_IN_CHKP_BNDCL}. This built-in function is used\n\
|
||||
by Pointer Bounds Checker to perform check for pointer @var{ptr} against\n\
|
||||
lower bound of bounds @var{b}.\n\
|
||||
@end deftypefn\n\
|
||||
\n\
|
||||
@deftypefn {Built-in Function} void __chkp_bndcu (bnd @var{b}, const void *@var{ptr})\n\
|
||||
Function code - @code{BUILT_IN_CHKP_BNDCU}. This built-in function is used\n\
|
||||
by Pointer Bounds Checker to perform check for pointer @var{ptr} against\n\
|
||||
upper bound of bounds @var{b}.\n\
|
||||
@end deftypefn\n\
|
||||
\n\
|
||||
@deftypefn {Built-in Function} bnd __chkp_bndret (void *@var{ptr})\n\
|
||||
Function code - @code{BUILT_IN_CHKP_BNDRET}. This built-in function is used\n\
|
||||
by Pointer Bounds Checker to obtain bounds returned by call statement.\n\
|
||||
@var{ptr} passed to buil-in is @code{SSA_NAME} returned by call.\n\
|
||||
@end deftypefn\n\
|
||||
\n\
|
||||
@deftypefn {Built-in Function} bnd __chkp_arg_bnd (void *@var{arg})\n\
|
||||
Function code - @code{BUILT_IN_CHKP_ARG_BND}. This built-in function is\n\
|
||||
used by Pointer Bounds Checker to obtain bounds passed for input argument.\n\
|
||||
@var{arg} is default @code{SSA_NAME} of the @code{PARM_DECL} whose\n\
|
||||
bounds we want to obtain.\n\
|
||||
@end deftypefn\n\
|
||||
\n\
|
||||
@deftypefn {Built-in Function} bnd __chkp_intersect (bnd @var{b1}, bnd @var{b2})\n\
|
||||
Function code - @code{BUILT_IN_CHKP_INTERSECT}. This built-in function\n\
|
||||
returns intersection of bounds @var{b1} and @var{b2}.\n\
|
||||
@end deftypefn\n\
|
||||
\n\
|
||||
@deftypefn {Built-in Function} bnd __chkp_narrow (const void *@var{ptr}, bnd @var{b}, size_t @var{s})\n\
|
||||
Function code - @code{BUILT_IN_CHKP_NARROW}. This built-in function\n\
|
||||
returns intersection of bounds @var{b} and\n\
|
||||
[@var{ptr}, @var{ptr} + @var{s} - @code{1}].\n\
|
||||
@end deftypefn\n\
|
||||
\n\
|
||||
@deftypefn {Built-in Function} void *__chkp_set_bounds (const void *@var{ptr}, size_t @var{s})\n\
|
||||
Function code - @code{BUILT_IN_CHKP_SET_PTR_BOUNDS}. This built-in function\n\
|
||||
returns @var{ptr} with bounds [@var{ptr}, @var{ptr} + @var{s} - @code{1}].\n\
|
||||
@end deftypefn\n\
|
||||
\n\
|
||||
@deftypefn {Built-in Function} size_t __chkp_sizeof (const void *@var{ptr})\n\
|
||||
Function code - @code{BUILT_IN_CHKP_SIZEOF}. This built-in function\n\
|
||||
returns size of object referenced by @var{ptr}. @var{ptr} is always\n\
|
||||
@code{ADDR_EXPR} of @code{VAR_DECL}. This built-in is used by\n\
|
||||
Pointer Boudns Checker when bounds of object cannot be computed statically\n\
|
||||
(e.g. object has incomplete type).\n\
|
||||
@end deftypefn\n\
|
||||
\n\
|
||||
@deftypefn {Built-in Function} const void *__chkp_extract_lower (bnd @var{b})\n\
|
||||
Function code - @code{BUILT_IN_CHKP_EXTRACT_LOWER}. This built-in function\n\
|
||||
returns lower bound of bounds @var{b}.\n\
|
||||
@end deftypefn\n\
|
||||
\n\
|
||||
@deftypefn {Built-in Function} const void *__chkp_extract_upper (bnd @var{b})\n\
|
||||
Function code - @code{BUILT_IN_CHKP_EXTRACT_UPPER}. This built-in function\n\
|
||||
returns upper bound of bounds @var{b}.\n\
|
||||
@end deftypefn",
|
||||
tree, (unsigned fcode),
|
||||
default_builtin_chkp_function)
|
||||
|
||||
DEFHOOK
|
||||
(chkp_bound_type,
|
||||
"Return type to be used for bounds",
|
||||
tree, (void),
|
||||
default_chkp_bound_type)
|
||||
|
||||
DEFHOOK
|
||||
(chkp_bound_mode,
|
||||
"Return mode to be used for bounds.",
|
||||
enum machine_mode, (void),
|
||||
default_chkp_bound_mode)
|
||||
|
||||
/* Select a replacement for a target-specific builtin. This is done
|
||||
*before* regular type checking, and so allows the target to
|
||||
implement a crude form of function overloading. The result is a
|
||||
|
@ -3426,15 +3328,6 @@ The default version of this hook returns @code{va_list_type_node}.",
|
|||
tree, (tree fndecl),
|
||||
std_fn_abi_va_list)
|
||||
|
||||
DEFHOOK
|
||||
(fn_abi_va_list_bounds_size,
|
||||
"This hook returns size for @code{va_list} object in function specified\n\
|
||||
by @var{fndecl}. This hook is used by Pointer Bounds Checker to build bounds\n\
|
||||
for @code{va_list} object. Return @code{integer_zero_node} if no bounds\n\
|
||||
should be used (e.g. @code{va_list} is a scalar pointer to the stack).",
|
||||
tree, (tree fndecl),
|
||||
default_fn_abi_va_list_bounds_size)
|
||||
|
||||
/* Get the __builtin_va_list type dependent on input type. */
|
||||
DEFHOOK
|
||||
(canonical_va_list_type,
|
||||
|
@ -3882,30 +3775,6 @@ not generate any instructions in this case.",
|
|||
int *pretend_args_size, int second_time),
|
||||
default_setup_incoming_varargs)
|
||||
|
||||
DEFHOOK
|
||||
(load_bounds_for_arg,
|
||||
"This hook is used by expand pass to emit insn to load bounds of\n\
|
||||
@var{arg} passed in @var{slot}. Expand pass uses this hook in case\n\
|
||||
bounds of @var{arg} are not passed in register. If @var{slot} is a\n\
|
||||
memory, then bounds are loaded as for regular pointer loaded from\n\
|
||||
memory. If @var{slot} is not a memory then @var{slot_no} is an integer\n\
|
||||
constant holding number of the target dependent special slot which\n\
|
||||
should be used to obtain bounds. Hook returns RTX holding loaded bounds.",
|
||||
rtx, (rtx slot, rtx arg, rtx slot_no),
|
||||
default_load_bounds_for_arg)
|
||||
|
||||
DEFHOOK
|
||||
(store_bounds_for_arg,
|
||||
"This hook is used by expand pass to emit insns to store @var{bounds} of\n\
|
||||
@var{arg} passed in @var{slot}. Expand pass uses this hook in case\n\
|
||||
@var{bounds} of @var{arg} are not passed in register. If @var{slot} is a\n\
|
||||
memory, then @var{bounds} are stored as for regular pointer stored in\n\
|
||||
memory. If @var{slot} is not a memory then @var{slot_no} is an integer\n\
|
||||
constant holding number of the target dependent special slot which\n\
|
||||
should be used to store @var{bounds}.",
|
||||
void, (rtx arg, rtx slot, rtx bounds, rtx slot_no),
|
||||
default_store_bounds_for_arg)
|
||||
|
||||
DEFHOOK
|
||||
(strict_argument_naming,
|
||||
"Define this hook to return @code{true} if the location where a function\n\
|
||||
|
|
|
@ -1571,28 +1571,6 @@ default_member_type_forces_blk (const_tree, enum machine_mode)
|
|||
{
|
||||
return false;
|
||||
}
|
||||
rtx
|
||||
default_load_bounds_for_arg (rtx addr ATTRIBUTE_UNUSED,
|
||||
rtx ptr ATTRIBUTE_UNUSED,
|
||||
rtx bnd ATTRIBUTE_UNUSED)
|
||||
{
|
||||
gcc_unreachable ();
|
||||
}
|
||||
|
||||
void
|
||||
default_store_bounds_for_arg (rtx val ATTRIBUTE_UNUSED,
|
||||
rtx addr ATTRIBUTE_UNUSED,
|
||||
rtx bounds ATTRIBUTE_UNUSED,
|
||||
rtx to ATTRIBUTE_UNUSED)
|
||||
{
|
||||
gcc_unreachable ();
|
||||
}
|
||||
|
||||
tree
|
||||
default_fn_abi_va_list_bounds_size (tree fndecl ATTRIBUTE_UNUSED)
|
||||
{
|
||||
return integer_zero_node;
|
||||
}
|
||||
|
||||
/* Default version of canonicalize_comparison. */
|
||||
|
||||
|
@ -1718,27 +1696,6 @@ std_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
|
|||
return build_va_arg_indirect_ref (addr);
|
||||
}
|
||||
|
||||
tree
|
||||
default_chkp_bound_type (void)
|
||||
{
|
||||
tree res = make_node (POINTER_BOUNDS_TYPE);
|
||||
TYPE_PRECISION (res) = TYPE_PRECISION (size_type_node) * 2;
|
||||
layout_type (res);
|
||||
return res;
|
||||
}
|
||||
|
||||
enum machine_mode
|
||||
default_chkp_bound_mode (void)
|
||||
{
|
||||
return VOIDmode;
|
||||
}
|
||||
|
||||
tree
|
||||
default_builtin_chkp_function (unsigned int fcode ATTRIBUTE_UNUSED)
|
||||
{
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
/* An implementation of TARGET_CAN_USE_DOLOOP_P for targets that do
|
||||
not support nested low-overhead loops. */
|
||||
|
||||
|
|
|
@ -206,12 +206,5 @@ extern bool default_member_type_forces_blk (const_tree, enum machine_mode);
|
|||
extern void default_atomic_assign_expand_fenv (tree *, tree *, tree *);
|
||||
extern tree build_va_arg_indirect_ref (tree);
|
||||
extern tree std_gimplify_va_arg_expr (tree, tree, gimple_seq *, gimple_seq *);
|
||||
|
||||
extern rtx default_load_bounds_for_arg (rtx, rtx, rtx);
|
||||
extern void default_store_bounds_for_arg (rtx, rtx, rtx, rtx);
|
||||
extern tree default_fn_abi_va_list_bounds_size (tree);
|
||||
extern tree default_chkp_bound_type (void);
|
||||
extern enum machine_mode default_chkp_bound_mode (void);
|
||||
extern tree default_builtin_chkp_function (unsigned int);
|
||||
extern bool can_use_doloop_if_innermost (double_int, double_int,
|
||||
unsigned int, bool);
|
||||
|
|
|
@ -1284,12 +1284,6 @@ process_options (void)
|
|||
"and -ftree-loop-linear)");
|
||||
#endif
|
||||
|
||||
if (flag_check_pointer_bounds)
|
||||
{
|
||||
if (targetm.chkp_bound_mode () == VOIDmode)
|
||||
error ("-fcheck-pointers is not supported for this target");
|
||||
}
|
||||
|
||||
/* One region RA really helps to decrease the code size. */
|
||||
if (flag_ira_region == IRA_REGION_AUTODETECT)
|
||||
flag_ira_region
|
||||
|
|
|
@ -457,8 +457,6 @@ enum tree_index {
|
|||
TI_FILEPTR_TYPE,
|
||||
TI_POINTER_SIZED_TYPE,
|
||||
|
||||
TI_POINTER_BOUNDS_TYPE,
|
||||
|
||||
TI_DFLOAT32_TYPE,
|
||||
TI_DFLOAT64_TYPE,
|
||||
TI_DFLOAT128_TYPE,
|
||||
|
|
|
@ -869,7 +869,6 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
|
|||
break;
|
||||
|
||||
case VOID_TYPE:
|
||||
case POINTER_BOUNDS_TYPE:
|
||||
case INTEGER_TYPE:
|
||||
case REAL_TYPE:
|
||||
case FIXED_POINT_TYPE:
|
||||
|
|
|
@ -1156,8 +1156,7 @@ build_int_cst_wide (tree type, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
|
|||
|
||||
case POINTER_TYPE:
|
||||
case REFERENCE_TYPE:
|
||||
case POINTER_BOUNDS_TYPE:
|
||||
/* Cache NULL pointer and zero bounds. */
|
||||
/* Cache NULL pointer. */
|
||||
if (!hi && !low)
|
||||
{
|
||||
limit = 1;
|
||||
|
@ -3286,7 +3285,6 @@ type_contains_placeholder_1 (const_tree type)
|
|||
switch (TREE_CODE (type))
|
||||
{
|
||||
case VOID_TYPE:
|
||||
case POINTER_BOUNDS_TYPE:
|
||||
case COMPLEX_TYPE:
|
||||
case ENUMERAL_TYPE:
|
||||
case BOOLEAN_TYPE:
|
||||
|
@ -9692,8 +9690,6 @@ build_common_tree_nodes (bool signed_char, bool short_double)
|
|||
void_type_node = make_node (VOID_TYPE);
|
||||
layout_type (void_type_node);
|
||||
|
||||
pointer_bounds_type_node = targetm.chkp_bound_type ();
|
||||
|
||||
/* We are not going to have real types in C with less than byte alignment,
|
||||
so we might as well not have any types that claim to have it. */
|
||||
TYPE_ALIGN (void_type_node) = BITS_PER_UNIT;
|
||||
|
|
|
@ -232,11 +232,6 @@ DEFTREECODE (QUAL_UNION_TYPE, "qual_union_type", tcc_type, 0)
|
|||
/* The void type in C */
|
||||
DEFTREECODE (VOID_TYPE, "void_type", tcc_type, 0)
|
||||
|
||||
/* Type to hold bounds for a pointer.
|
||||
Has TYPE_PRECISION component to specify number of bits used
|
||||
by this type. */
|
||||
DEFTREECODE (POINTER_BOUNDS_TYPE, "pointer_bounds_type", tcc_type, 0)
|
||||
|
||||
/* Type of functions. Special fields:
|
||||
TREE_TYPE type of value returned.
|
||||
TYPE_ARG_TYPES list of types of arguments expected.
|
||||
|
|
20
gcc/tree.h
20
gcc/tree.h
|
@ -548,21 +548,6 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int,
|
|||
/* Nonzero if this type is a complete type. */
|
||||
#define COMPLETE_TYPE_P(NODE) (TYPE_SIZE (NODE) != NULL_TREE)
|
||||
|
||||
/* Nonzero if this type is a pointer bounds type. */
|
||||
#define POINTER_BOUNDS_TYPE_P(NODE) \
|
||||
(TREE_CODE (NODE) == POINTER_BOUNDS_TYPE)
|
||||
|
||||
/* Nonzero if this node has a pointer bounds type. */
|
||||
#define POINTER_BOUNDS_P(NODE) \
|
||||
(POINTER_BOUNDS_TYPE_P (TREE_TYPE (NODE)))
|
||||
|
||||
/* Nonzero if this type supposes bounds existence. */
|
||||
#define BOUNDED_TYPE_P(type) (POINTER_TYPE_P (type))
|
||||
|
||||
/* Nonzero for objects with bounded type. */
|
||||
#define BOUNDED_P(node) \
|
||||
BOUNDED_TYPE_P (TREE_TYPE (node))
|
||||
|
||||
/* Nonzero if this type is the (possibly qualified) void type. */
|
||||
#define VOID_TYPE_P(NODE) (TREE_CODE (NODE) == VOID_TYPE)
|
||||
|
||||
|
@ -836,9 +821,6 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int,
|
|||
#define CALL_ALLOCA_FOR_VAR_P(NODE) \
|
||||
(CALL_EXPR_CHECK (NODE)->base.protected_flag)
|
||||
|
||||
/* In a CALL_EXPR, means call was instrumented by Pointer Bounds Checker. */
|
||||
#define CALL_WITH_BOUNDS_P(NODE) (CALL_EXPR_CHECK (NODE)->base.deprecated_flag)
|
||||
|
||||
/* In a type, nonzero means that all objects of the type are guaranteed by the
|
||||
language or front-end to be properly aligned, so we can indicate that a MEM
|
||||
of this type is aligned at least to the alignment of the type, even if it
|
||||
|
@ -3245,8 +3227,6 @@ tree_operand_check_code (const_tree __t, enum tree_code __code, int __i,
|
|||
#define complex_double_type_node global_trees[TI_COMPLEX_DOUBLE_TYPE]
|
||||
#define complex_long_double_type_node global_trees[TI_COMPLEX_LONG_DOUBLE_TYPE]
|
||||
|
||||
#define pointer_bounds_type_node global_trees[TI_POINTER_BOUNDS_TYPE]
|
||||
|
||||
#define void_type_node global_trees[TI_VOID_TYPE]
|
||||
/* The C type `void *'. */
|
||||
#define ptr_type_node global_trees[TI_PTR_TYPE]
|
||||
|
|
|
@ -4688,7 +4688,6 @@ output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align)
|
|||
case REFERENCE_TYPE:
|
||||
case OFFSET_TYPE:
|
||||
case FIXED_POINT_TYPE:
|
||||
case POINTER_BOUNDS_TYPE:
|
||||
case NULLPTR_TYPE:
|
||||
if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
|
||||
EXPAND_INITIALIZER),
|
||||
|
|
|
@ -204,8 +204,6 @@ dump_varpool_node (FILE *f, struct varpool_node *node)
|
|||
fprintf (f, " initialized");
|
||||
if (node->output)
|
||||
fprintf (f, " output");
|
||||
if (node->need_bounds_init)
|
||||
fprintf (f, " need-bounds-init");
|
||||
if (TREE_READONLY (node->decl))
|
||||
fprintf (f, " read-only");
|
||||
if (ctor_for_folding (node->decl) != error_mark_node)
|
||||
|
|
Loading…
Reference in New Issue