diff options
author | Dan Albert <danalbert@google.com> | 2015-06-17 11:09:54 -0700 |
---|---|---|
committer | Dan Albert <danalbert@google.com> | 2015-06-17 14:15:22 -0700 |
commit | f378ebf14df0952eae870c9865bab8326aa8f137 (patch) | |
tree | 31794503eb2a8c64ea5f313b93100f1163afcffb /gcc-4.4.3/gcc/simplify-got.c | |
parent | 2c58169824949d3a597d9fa81931e001ef9b1bd0 (diff) | |
download | toolchain_gcc-f378ebf14df0952eae870c9865bab8326aa8f137.tar.gz toolchain_gcc-f378ebf14df0952eae870c9865bab8326aa8f137.tar.bz2 toolchain_gcc-f378ebf14df0952eae870c9865bab8326aa8f137.zip |
Delete old versions of GCC.
Change-Id: I710f125d905290e1024cbd67f48299861790c66c
Diffstat (limited to 'gcc-4.4.3/gcc/simplify-got.c')
-rw-r--r-- | gcc-4.4.3/gcc/simplify-got.c | 196 |
1 files changed, 0 insertions, 196 deletions
diff --git a/gcc-4.4.3/gcc/simplify-got.c b/gcc-4.4.3/gcc/simplify-got.c deleted file mode 100644 index a983cf0c8..000000000 --- a/gcc-4.4.3/gcc/simplify-got.c +++ /dev/null @@ -1,196 +0,0 @@ -/* Simplify the code to load global variable's address from GOT. - Copyright (C) 2010 - Free Software Foundation, Inc. - Contributed by Wei Guozhi <carrot@google.com>. - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 3, or (at your option) any later -version. - -GCC is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING3. If not see -<http://www.gnu.org/licenses/>. */ - -/* This file contains optimization for global variable's address loading - from GOT. - - When generating PIC code, we need to load global variable's address from - GOT. Many targets do this as following: - - (set pic_reg ...) # load the base address of GOT into pic_reg. - ... - (set off_set ...) # load the offset from the base of GOT to - # a global variable's GOT entry. - (set address # load the address from GOT. - (mem (plus pic_reg off_set))) - ... - - If the target has an alternative method (usually uses a different - relocation) to load the global address and in some cases it has less - cost and avoid the pic_reg, we can use this pass to improve it. - - In order to employ this optimization the target must satisfy the - following constraints: - - 1. There should be at least 2 methods to load a global variable's - address from GOT. - - 2. By default all global variables accesses use the method described - above. - - 3. There is a target dependent situation that the alternative method is - better when considering the number of global variable accesses and - the number of accessed variables. - - 4. The alternative method doesn't use the base of GOT (pic_reg). -*/ - -#include "config.h" -#include "system.h" -#include "coretypes.h" -#include "tm.h" -#include "rtl.h" -#include "flags.h" -#include "target.h" -#include "tree-pass.h" -#include "df.h" -#include "timevar.h" - -#define VAR_TABLE_SIZE 10 - -/* Information needed when rewrite the GOT access insns. */ -struct got_access_info -{ - rtx symbol; /* The global variable. */ - rtx offset_reg; /* Register contains the GOT entry offset. */ - rtx address_reg; /* Register contains the final global address. */ - rtx offset_insn; /* The insn loads the offset. */ - rtx load_insn; /* The insn which loads the address from GOT. */ -}; - -/* This optimization is enabled only when the pic_reg is actually used. */ -static bool -gate_handle_simplify_got (void) -{ - return (optimize > 0) && targetm.got_access.get_pic_reg (); -} - -static unsigned int -rest_of_handle_simplify_got (void) -{ - df_ref ref; - rtx use = NULL_RTX; - int i, n_symbol, n_access = 0; - struct got_access_info* got_accesses; - htab_t var_table = htab_create (VAR_TABLE_SIZE, - htab_hash_pointer, - htab_eq_pointer, - NULL); - rtx pic_reg = targetm.got_access.get_pic_reg (); - gcc_assert (pic_reg); - - ref = DF_REG_USE_CHAIN (REGNO (pic_reg)); - got_accesses = XNEWVEC(struct got_access_info, - DF_REG_USE_COUNT (REGNO (pic_reg))); - - /* Check if all uses of pic_reg are loading global address through the - default method. */ - while (ref) - { - rtx insn = DF_REF_INSN (ref); - - /* Check for the special USE insn, it is not a real usage of pic_reg. */ - if (GET_CODE (PATTERN (insn)) == USE) - use = insn; - else - { - /* If an insn both set and use pic_reg, it is in the process of - constructing the value of pic_reg. We should also ignore it. */ - rtx set = single_set (insn); - if (!(set && (SET_DEST (set) == pic_reg))) - { - rtx offset_reg; - rtx offset_insn; - rtx symbol = targetm.got_access.loaded_global_var (insn, - &offset_reg, - &offset_insn); - if (symbol) - { - rtx* slot = (rtx*) htab_find_slot (var_table, symbol, INSERT); - if (*slot == HTAB_EMPTY_ENTRY) - *slot = symbol; - - gcc_assert (set); - got_accesses[n_access].symbol = symbol; - got_accesses[n_access].offset_reg = offset_reg; - got_accesses[n_access].address_reg = SET_DEST (set); - got_accesses[n_access].load_insn = insn; - got_accesses[n_access].offset_insn = offset_insn; - n_access++; - } - else - { - /* This insn doesn't load a global address, but it has - other unexpected usage of pic_reg, give up. */ - free (got_accesses); - htab_delete (var_table); - return 0; - } - } - } - ref = DF_REF_NEXT_REG(ref); - } - - /* Check if we can simplify it. */ - n_symbol = htab_elements (var_table); - gcc_assert (n_symbol <= n_access); - if (!targetm.got_access.can_simplify_got_access (n_symbol, n_access)) - { - free (got_accesses); - htab_delete (var_table); - return 0; - } - - /* Rewrite the global address loading insns. */ - for (i=0; i<n_access; i++) - targetm.got_access.load_global_address (got_accesses[i].symbol, - got_accesses[i].offset_reg, - got_accesses[i].address_reg, - got_accesses[i].load_insn, - got_accesses[i].offset_insn); - - /* Since there is no usage of pic_reg now, we can remove it. */ - if (use) - remove_insn (use); - targetm.got_access.clear_pic_reg (); - free (got_accesses); - htab_delete (var_table); - return 0; -} - -struct rtl_opt_pass pass_simplify_got = -{ - { - RTL_PASS, - "simplify_got", /* name */ - gate_handle_simplify_got, /* gate */ - rest_of_handle_simplify_got, /* execute */ - NULL, /* sub */ - NULL, /* next */ - 0, /* static_pass_number */ - TV_SIMPLIFY_GOT, /* tv_id */ - 0, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - TODO_dump_func /* todo_flags_finish */ - } -}; |