[llvm-commits] [dragonegg] r134322 - /dragonegg/trunk/src/Backend.cpp
Duncan Sands
baldrick at free.fr
Sat Jul 2 06:17:27 PDT 2011
Author: baldrick
Date: Sat Jul 2 08:17:27 2011
New Revision: 134322
URL: http://llvm.org/viewvc/llvm-project?rev=134322&view=rev
Log:
Output global variables by iterating over varpool_nodes in the
PLUGIN_FINISH_UNIT hook (thanks to Richard Guenther for suggesting
this). While there, don't output a global if it is not marked as
being needed, fixing PR10200 (link failure due to too many variables
being output when using gcc-4.6).
Modified:
dragonegg/trunk/src/Backend.cpp
Modified: dragonegg/trunk/src/Backend.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/src/Backend.cpp?rev=134322&r1=134321&r2=134322&view=diff
==============================================================================
--- dragonegg/trunk/src/Backend.cpp (original)
+++ dragonegg/trunk/src/Backend.cpp Sat Jul 2 08:17:27 2011
@@ -1620,8 +1620,8 @@
NULL /* variable_transform */
};
-/// emit_variables - Output GCC global variables to the LLVM IR.
-static void emit_variables(cgraph_node_set /*set*/
+/// emit_var_aliases - Output GCC global variable aliases to the LLVM IR.
+static void emit_var_aliases(cgraph_node_set /*set*/
#if (GCC_MINOR > 5)
, varpool_node_set /*vset*/
#endif
@@ -1631,54 +1631,43 @@
InitializeBackend();
- // Output all externally visible global variables, whether they are used in
- // this compilation unit or not, as well as any internal variables explicitly
- // marked with the 'used' attribute. All other internal variables are output
- // when their user is, or discarded if unused.
- struct varpool_node *vnode;
- FOR_EACH_STATIC_VARIABLE (vnode) {
- tree var = vnode->decl;
- if (TREE_CODE(var) == VAR_DECL &&
- (TREE_PUBLIC(var) || DECL_PRESERVE_P(var)))
- emit_global(var);
- }
-
// Emit any aliases.
alias_pair *p;
for (unsigned i = 0; VEC_iterate(alias_pair, alias_pairs, i, p); i++)
emit_alias(p->decl, p->target);
}
-/// pass_emit_variables - IPA pass that turns GCC variables into LLVM IR.
-static struct ipa_opt_pass_d pass_emit_variables = {
+/// pass_emit_var_aliases - IPA pass that outputs GCC global variable aliases
+/// into LLVM IR.
+static struct ipa_opt_pass_d pass_emit_var_aliases = {
{
IPA_PASS,
- "emit_variables", /* name */
- gate_emission, /* gate */
- NULL, /* execute */
- NULL, /* sub */
- NULL, /* next */
- 0, /* static_pass_number */
- TV_NONE, /* tv_id */
- 0, /* properties_required */
- 0, /* properties_provided */
- 0, /* properties_destroyed */
- 0, /* todo_flags_start */
- 0 /* todo_flags_finish */
+ "emit_var_aliases", /* name */
+ gate_emission, /* gate */
+ NULL, /* execute */
+ NULL, /* sub */
+ NULL, /* next */
+ 0, /* static_pass_number */
+ TV_NONE, /* tv_id */
+ 0, /* properties_required */
+ 0, /* properties_provided */
+ 0, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ 0 /* todo_flags_finish */
},
- NULL, /* generate_summary */
- emit_variables, /* write_summary */
- NULL, /* read_summary */
+ NULL, /* generate_summary */
+ emit_var_aliases, /* write_summary */
+ NULL, /* read_summary */
#if (GCC_MINOR > 5)
- NULL, /* write_optimization_summary */
- NULL, /* read_optimization_summary */
+ NULL, /* write_optimization_summary */
+ NULL, /* read_optimization_summary */
#else
- NULL, /* function_read_summary */
+ NULL, /* function_read_summary */
#endif
- NULL, /* stmt_fixup */
- 0, /* function_transform_todo_flags_start */
- NULL, /* function_transform */
- NULL /* variable_transform */
+ NULL, /* stmt_fixup */
+ 0, /* function_transform_todo_flags_start */
+ NULL, /* function_transform */
+ NULL /* variable_transform */
};
/// rtl_emit_function - Turn a gimple function into LLVM IR. This is called
@@ -1721,23 +1710,37 @@
};
-/// llvm_finish - Run shutdown code when GCC exits.
-static void llvm_finish(void * /*gcc_data*/, void * /*user_data*/) {
- FinalizePlugin();
-}
-
/// llvm_finish_unit - Finish the .s file. This is called by GCC once the
/// compilation unit has been completely processed.
static void llvm_finish_unit(void * /*gcc_data*/, void * /*user_data*/) {
if (errorcount || sorrycount)
return; // Do not process broken code.
+//TODO timevar_push(TV_LLVM_PERFILE);
if (!quiet_flag)
errs() << "Finishing compilation unit\n";
InitializeBackend();
-//TODO timevar_push(TV_LLVM_PERFILE);
+ // Output all externally visible global variables, whether they are used in
+ // this compilation unit or not, as well as any internal variables explicitly
+ // marked with the 'used' attribute. All other internal variables are output
+ // when their user is, or discarded if unused.
+ for (struct varpool_node *vnode = varpool_nodes; vnode; vnode = vnode->next) {
+ if (!vnode->needed)
+ continue;
+#if (GCC_MINOR > 5)
+ if (vnode->in_other_partition)
+ continue;
+#endif
+ if (vnode->alias)
+ continue;
+ tree var = vnode->decl;
+ if (TREE_CODE(var) == VAR_DECL && !DECL_EXTERNAL(var) &&
+ (TREE_PUBLIC(var) || DECL_PRESERVE_P(var) || TREE_THIS_VOLATILE(var)))
+ emit_global(var);
+ }
+
LLVMContext &Context = getGlobalContext();
createPerFunctionOptimizationPasses();
@@ -1837,6 +1840,11 @@
FinalizePlugin();
}
+/// llvm_finish - Run shutdown code when GCC exits.
+static void llvm_finish(void * /*gcc_data*/, void * /*user_data*/) {
+ FinalizePlugin();
+}
+
/// gate_null - Gate method for a pass that does nothing.
static bool gate_null (void) {
@@ -2029,7 +2037,7 @@
}
// Provide GCC with our version and help information.
- register_callback (plugin_name, PLUGIN_INFO, NULL, &llvm_plugin_info);
+ register_callback(plugin_name, PLUGIN_INFO, NULL, &llvm_plugin_info);
// Process any plugin arguments.
{
@@ -2084,11 +2092,11 @@
TakeoverAsmOutput();
// Register our garbage collector roots.
- register_callback (plugin_name, PLUGIN_REGISTER_GGC_CACHES, NULL,
- (void *)gt_ggc_rc__gt_cache_h);
+ register_callback(plugin_name, PLUGIN_REGISTER_GGC_CACHES, NULL,
+ (void *)gt_ggc_rc__gt_cache_h);
// Perform late initialization just before processing the compilation unit.
- register_callback (plugin_name, PLUGIN_START_UNIT, llvm_start_unit, NULL);
+ register_callback(plugin_name, PLUGIN_START_UNIT, llvm_start_unit, NULL);
// Turn off all gcc optimization passes.
if (!EnableGCCOptimizations) {
@@ -2107,7 +2115,7 @@
pass_info.reference_pass_name = "einline_ipa";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
#endif
// Leave pass_ipa_free_lang_data.
@@ -2141,14 +2149,14 @@
pass_info.reference_pass_name = "early_optimizations";
pass_info.ref_pass_instance_number = 1;
pass_info.pos_op = PASS_POS_INSERT_BEFORE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
// Turn off pass_early_local_passes::pass_all_early_optimizations.
pass_info.pass = &pass_gimple_null.pass;
pass_info.reference_pass_name = "early_optimizations";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
// Leave pass_early_local_passes::pass_release_ssa_names. ???
@@ -2162,14 +2170,14 @@
pass_info.reference_pass_name = "increase_alignment";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
// Turn off pass_ipa_matrix_reorg.
pass_info.pass = &pass_simple_ipa_null.pass;
pass_info.reference_pass_name = "matrix-reorg";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
// Leave pass_ipa_whole_program_visibility. ???
@@ -2178,49 +2186,49 @@
pass_info.reference_pass_name = "cp";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
// Turn off pass_ipa_inline.
pass_info.pass = &pass_ipa_null.pass;
pass_info.reference_pass_name = "inline";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
// Turn off pass_ipa_reference.
pass_info.pass = &pass_ipa_null.pass;
pass_info.reference_pass_name = "static-var";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
// Turn off pass_ipa_pure_const.
pass_info.pass = &pass_ipa_null.pass;
pass_info.reference_pass_name = "pure-const";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
// Turn off pass_ipa_type_escape.
pass_info.pass = &pass_simple_ipa_null.pass;
pass_info.reference_pass_name = "type-escape-var";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
// Turn off pass_ipa_pta.
pass_info.pass = &pass_simple_ipa_null.pass;
pass_info.reference_pass_name = "pta";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
// Turn off pass_ipa_struct_reorg.
pass_info.pass = &pass_simple_ipa_null.pass;
pass_info.reference_pass_name = "ipa_struct_reorg";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
}
// Replace the LTO gimple pass with a pass that converts same-body aliases and
@@ -2229,15 +2237,15 @@
pass_info.reference_pass_name = "lto_gimple_out";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
- // Replace the LTO decls pass with a pass that converts global variables to
- // LLVM IR.
- pass_info.pass = &pass_emit_variables.pass;
+ // Replace the LTO decls pass with a pass that converts global variable
+ // aliases to LLVM IR.
+ pass_info.pass = &pass_emit_var_aliases.pass;
pass_info.reference_pass_name = "lto_decls_out";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
#if (GCC_MINOR < 6)
// Disable any other LTO passes.
@@ -2245,7 +2253,7 @@
pass_info.reference_pass_name = "lto_wpa_fixup";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
#endif
if (!EnableGCCOptimizations) {
@@ -2254,56 +2262,56 @@
pass_info.reference_pass_name = "ehdisp";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
// Disable pass_all_optimizations, which runs after LLVM conversion.
pass_info.pass = &pass_gimple_null.pass;
pass_info.reference_pass_name = "*all_optimizations";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
// Disable pass_lower_complex_O0, which runs after LLVM conversion.
pass_info.pass = &pass_gimple_null.pass;
pass_info.reference_pass_name = "cplxlower0";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
// Disable pass_cleanup_eh, which runs after LLVM conversion.
pass_info.pass = &pass_gimple_null.pass;
pass_info.reference_pass_name = "ehcleanup";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
// Disable pass_lower_resx, which runs after LLVM conversion.
pass_info.pass = &pass_gimple_null.pass;
pass_info.reference_pass_name = "resx";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
// Disable pass_nrv, which runs after LLVM conversion.
pass_info.pass = &pass_gimple_null.pass;
pass_info.reference_pass_name = "nrv";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
// Disable pass_mudflap_2, which runs after LLVM conversion.
pass_info.pass = &pass_gimple_null.pass;
pass_info.reference_pass_name = "mudflap2";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
// Disable pass_cleanup_cfg_post_optimizing, which runs after LLVM conversion.
pass_info.pass = &pass_gimple_null.pass;
pass_info.reference_pass_name = "optimized";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
// TODO: Disable pass_warn_function_noreturn?
}
@@ -2313,26 +2321,27 @@
pass_info.reference_pass_name = "expand";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
// Turn off all other rtl passes.
pass_info.pass = &pass_gimple_null.pass;
pass_info.reference_pass_name = "*rest_of_compilation";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
pass_info.pass = &pass_rtl_null.pass;
pass_info.reference_pass_name = "*clean_state";
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_REPLACE;
- register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
- // Finish the .s file once the compilation unit has been completely processed.
- register_callback (plugin_name, PLUGIN_FINISH_UNIT, llvm_finish_unit, NULL);
+ // Output GCC global variables to the LLVM IR and finish the .s file once the
+ // compilation unit has been completely processed.
+ register_callback(plugin_name, PLUGIN_FINISH_UNIT, llvm_finish_unit, NULL);
// Run shutdown code when GCC exits.
- register_callback (plugin_name, PLUGIN_FINISH, llvm_finish, NULL);
+ register_callback(plugin_name, PLUGIN_FINISH, llvm_finish, NULL);
return 0;
}
More information about the llvm-commits
mailing list