[llvm-commits] [dragonegg] r137215 - /dragonegg/trunk/src/Backend.cpp
Duncan Sands
baldrick at free.fr
Wed Aug 10 08:59:56 PDT 2011
Author: baldrick
Date: Wed Aug 10 10:59:56 2011
New Revision: 137215
URL: http://llvm.org/viewvc/llvm-project?rev=137215&view=rev
Log:
Moving output of externally visible global variables into the
PLUGIN_ALL_IPA_PASSES_END hook means it runs just before cgraph
removes unneeded variables (while before it was running after).
This results in lots of extra variables being output with gcc-4.6,
causing link failures due to linkage not being output quite right.
This patch tweaks linkage, making that part of things a bit better
(I'm not convinced it is completely correct though); and it uses a
more powerful test for which variables need to be output, resulting
in essentially the same output as if cgraph variable removal had
been done first.
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=137215&r1=137214&r2=137215&view=diff
==============================================================================
--- dragonegg/trunk/src/Backend.cpp (original)
+++ dragonegg/trunk/src/Backend.cpp Wed Aug 10 10:59:56 2011
@@ -863,25 +863,23 @@
// Set the linkage.
GlobalValue::LinkageTypes Linkage;
- if (CODE_CONTAINS_STRUCT (TREE_CODE (decl), TS_DECL_WITH_VIS)
- && false) {// FIXME DECL_LLVM_PRIVATE(decl)) {
+ if (false) {// FIXME DECL_LLVM_PRIVATE(decl)) {
Linkage = GlobalValue::PrivateLinkage;
- } else if (CODE_CONTAINS_STRUCT (TREE_CODE (decl), TS_DECL_WITH_VIS)
- && false) {//FIXME DECL_LLVM_LINKER_PRIVATE(decl)) {
+ } else if (false) {//FIXME DECL_LLVM_LINKER_PRIVATE(decl)) {
Linkage = GlobalValue::LinkerPrivateLinkage;
} else if (!TREE_PUBLIC(decl)) {
Linkage = GlobalValue::InternalLinkage;
+ } else if (DECL_COMDAT(decl)) {
+ Linkage = GlobalValue::getLinkOnceLinkage(flag_odr);
+ } else if (DECL_ONE_ONLY(decl)) {
+ Linkage = GlobalValue::getWeakLinkage(flag_odr);
} else if (DECL_WEAK(decl)) {
// The user may have explicitly asked for weak linkage - ignore flag_odr.
Linkage = GlobalValue::WeakAnyLinkage;
- } else if (DECL_ONE_ONLY(decl)) {
- Linkage = GlobalValue::getWeakLinkage(flag_odr);
} else if (DECL_COMMON(decl) && // DECL_COMMON is only meaningful if no init
(!DECL_INITIAL(decl) || DECL_INITIAL(decl) == error_mark_node)) {
// llvm-gcc also includes DECL_VIRTUAL_P here.
Linkage = GlobalValue::CommonLinkage;
- } else if (DECL_COMDAT(decl)) {
- Linkage = GlobalValue::getLinkOnceLinkage(flag_odr);
} else {
Linkage = GV->getLinkage();
}
@@ -1664,11 +1662,17 @@
for (struct varpool_node *vnode = varpool_nodes; vnode; vnode = vnode->next) {
if (!vnode->needed || vnode->alias)
continue;
+ tree decl = vnode->decl;
+ // If this variable need not be output if unused, then skip it.
+ if (!vnode->force_output && vnode->analyzed &&
#if (GCC_MINOR > 5)
- if (vnode->in_other_partition)
- continue;
+ varpool_can_remove_if_no_refs(vnode)
+#else
+ (DECL_COMDAT(decl) || (DECL_ARTIFICIAL(decl) &&
+ !vnode->externally_visible))
#endif
- tree decl = vnode->decl;
+ )
+ continue;
if (TREE_CODE(decl) == VAR_DECL && !DECL_EXTERNAL(decl) &&
(TREE_PUBLIC(decl) || DECL_PRESERVE_P(decl) ||
TREE_THIS_VOLATILE(decl)))
More information about the llvm-commits
mailing list