aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Analysis/AliasAnalysis.h4
-rw-r--r--include/llvm/IntrinsicInst.h7
-rw-r--r--include/llvm/LinkAllVMCore.h59
-rw-r--r--include/llvm/PassSupport.h12
-rw-r--r--include/llvm/Support/IncludeFile.h40
-rw-r--r--include/llvm/System/IncludeFile.h40
-rw-r--r--lib/Analysis/AliasAnalysis.cpp1
-rw-r--r--lib/Support/IncludeFile.cpp20
-rw-r--r--lib/System/IncludeFile.cpp20
-rw-r--r--lib/VMCore/IntrinsicInst.cpp4
-rw-r--r--lib/VMCore/Pass.cpp3
11 files changed, 195 insertions, 15 deletions
diff --git a/include/llvm/Analysis/AliasAnalysis.h b/include/llvm/Analysis/AliasAnalysis.h
index 0de7a7fd86..d715e0880b 100644
--- a/include/llvm/Analysis/AliasAnalysis.h
+++ b/include/llvm/Analysis/AliasAnalysis.h
@@ -31,7 +31,7 @@
#define LLVM_ANALYSIS_ALIAS_ANALYSIS_H
#include "llvm/Support/CallSite.h"
-#include "llvm/Pass.h" // Need this for IncludeFile
+#include "llvm/Support/IncludeFile.h"
namespace llvm {
@@ -39,6 +39,8 @@ class LoadInst;
class StoreInst;
class VAArgInst;
class TargetData;
+class Pass;
+class AnalysisUsage;
class AliasAnalysis {
protected:
diff --git a/include/llvm/IntrinsicInst.h b/include/llvm/IntrinsicInst.h
index 146ce1db08..fbc3968f26 100644
--- a/include/llvm/IntrinsicInst.h
+++ b/include/llvm/IntrinsicInst.h
@@ -28,6 +28,7 @@
#include "llvm/Function.h"
#include "llvm/Instructions.h"
#include "llvm/Intrinsics.h"
+#include "llvm/Support/IncludeFile.h"
namespace llvm {
/// IntrinsicInst - A useful wrapper class for inspecting calls to intrinsic
@@ -312,6 +313,12 @@ namespace llvm {
return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
}
};
+
+// A hack to ensure that the IntrinsicInst.cpp file gets added as a dependency
+// of any file that
+extern char LinkIntrinsicInstStub;
+static IncludeFile LinkIntrinsicInst(&LinkIntrinsicInstStub);
+
}
#endif
diff --git a/include/llvm/LinkAllVMCore.h b/include/llvm/LinkAllVMCore.h
new file mode 100644
index 0000000000..28d088e2d0
--- /dev/null
+++ b/include/llvm/LinkAllVMCore.h
@@ -0,0 +1,59 @@
+//===- LinkAllVMCore.h - Reference All VMCore Code --------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file was developed by Reid Spencer and is distributed under the
+// University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This header file pulls in all analysis passes for tools like analyze and
+// bugpoint that need this functionality.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LINKALLVMCORE_H
+#define LLVM_LINKALLVMCORE_H
+
+#include <llvm/Support/IncludeFile.h>
+#include <llvm/Module.h>
+#include <llvm/IntrinsicInst.h>
+#include <llvm/IntrinsicInst.h>
+#include <llvm/Instructions.h>
+#include <llvm/Analysis/Dominators.h>
+#include <llvm/Analysis/Verifier.h>
+
+namespace {
+ struct ForceVMCoreLinking {
+ ForceVMCoreLinking() {
+ // We must reference the passes in such a way that compilers will not
+ // delete it all as dead code, even with whole program optimization,
+ // yet is effectively a NO-OP. As the compiler isn't smart enough
+ // to know that getenv() never returns -1, this will do the job.
+ if (std::getenv("bar") != (char*) -1)
+ return;
+
+ (void)new llvm::LocalDataStructures();
+ (void)new llvm::BUDataStructures();
+ (void)new llvm::TDDataStructures();
+ (void)new llvm::CompleteBUDataStructures();
+ (void)new llvm::EquivClassGraphs();
+ (void)llvm::createDataStructureStatsPass();
+ (void)llvm::createDataStructureGraphCheckerPass();
+ (void)llvm::createProfileLoaderPass();
+ (void)llvm::createNoProfileInfoPass();
+ (void)llvm::createInstCountPass();
+ (void)new llvm::IntervalPartition();
+ (void)new llvm::ImmediateDominators();
+ (void)new llvm::PostDominatorSet();
+ (void)new llvm::FindUsedTypes();
+ (void)new llvm::ScalarEvolution();
+ (void)new llvm::CallTargetFinder();
+ ((llvm::Function*)0)->viewCFGOnly();
+ llvm::AliasSetTracker X(*(llvm::AliasAnalysis*)0);
+ X.add((llvm::Value*)0, 0); // for -print-alias-sets
+ }
+ } ForceVMCoreLinking;
+}
+
+#endif
diff --git a/include/llvm/PassSupport.h b/include/llvm/PassSupport.h
index 8206e5f28e..57dcce7950 100644
--- a/include/llvm/PassSupport.h
+++ b/include/llvm/PassSupport.h
@@ -21,6 +21,7 @@
#ifndef LLVM_PASS_SUPPORT_H
#define LLVM_PASS_SUPPORT_H
+#include "llvm/Support/IncludeFile.h"
// No need to include Pass.h, we are being included by it!
namespace llvm {
@@ -367,17 +368,6 @@ struct PassRegistrationListener {
virtual void passEnumerate(const PassInfo *P) {}
};
-
-//===---------------------------------------------------------------------------
-/// IncludeFile class - This class is used as a hack to make sure that the
-/// implementation of a header file is included into a tool that uses the
-/// header. This is solely to overcome problems linking .a files and not
-/// getting the implementation of passes we need.
-///
-struct IncludeFile {
- IncludeFile(void *);
-};
-
} // End llvm namespace
#endif
diff --git a/include/llvm/Support/IncludeFile.h b/include/llvm/Support/IncludeFile.h
new file mode 100644
index 0000000000..2e4f12dbbf
--- /dev/null
+++ b/include/llvm/Support/IncludeFile.h
@@ -0,0 +1,40 @@
+//===- llvm/Support/IncludeFile.h - Ensure Linking Of Library ---*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file was developed by Reid Spencer and is distributed under the
+// University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the IncludeFile class.
+//
+//===----------------------------------------------------------------------===//
+
+/// This class is used as a facility to make sure that the implementation of a
+/// header file is included into a tool that uses the header. This is solely
+/// to overcome problems linking .a files and not getting the implementation
+/// of compilation units we need. This is commonly an issue with the various
+/// Passes but also occurs elsewhere in LLVM. We like to use .a files because
+/// they link faster and provide the smallest executables. However, sometimes
+/// those executables are too small, if the program doesn't reference something
+/// that might be needed, especially by a loaded share object. This little class
+/// helps to resolve that problem. The basic strategy is to use this class in
+/// a header file and pass the address of a variable to the constructor. If the
+/// variable is defined in the header file's corresponding .cpp file then all
+/// tools/libraries that #include the header file will require the .cpp as well.
+/// For example:<br/>
+/// <tt>extern int LinkMyCodeStub;</tt><br/>
+/// <tt>static IncludeFile LinkMyModule(&LinkMyCodeStub);</tt><br/>
+/// @brief Class to ensure linking of corresponding object file.
+
+#ifndef LLVM_SUPPORT_INCLUDEFILE_H
+#define LLVM_SUPPORT_INCLUDEFILE_H
+
+namespace llvm {
+struct IncludeFile {
+ IncludeFile(void *);
+};
+}
+
+#endif
diff --git a/include/llvm/System/IncludeFile.h b/include/llvm/System/IncludeFile.h
new file mode 100644
index 0000000000..2e4f12dbbf
--- /dev/null
+++ b/include/llvm/System/IncludeFile.h
@@ -0,0 +1,40 @@
+//===- llvm/Support/IncludeFile.h - Ensure Linking Of Library ---*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file was developed by Reid Spencer and is distributed under the
+// University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the IncludeFile class.
+//
+//===----------------------------------------------------------------------===//
+
+/// This class is used as a facility to make sure that the implementation of a
+/// header file is included into a tool that uses the header. This is solely
+/// to overcome problems linking .a files and not getting the implementation
+/// of compilation units we need. This is commonly an issue with the various
+/// Passes but also occurs elsewhere in LLVM. We like to use .a files because
+/// they link faster and provide the smallest executables. However, sometimes
+/// those executables are too small, if the program doesn't reference something
+/// that might be needed, especially by a loaded share object. This little class
+/// helps to resolve that problem. The basic strategy is to use this class in
+/// a header file and pass the address of a variable to the constructor. If the
+/// variable is defined in the header file's corresponding .cpp file then all
+/// tools/libraries that #include the header file will require the .cpp as well.
+/// For example:<br/>
+/// <tt>extern int LinkMyCodeStub;</tt><br/>
+/// <tt>static IncludeFile LinkMyModule(&LinkMyCodeStub);</tt><br/>
+/// @brief Class to ensure linking of corresponding object file.
+
+#ifndef LLVM_SUPPORT_INCLUDEFILE_H
+#define LLVM_SUPPORT_INCLUDEFILE_H
+
+namespace llvm {
+struct IncludeFile {
+ IncludeFile(void *);
+};
+}
+
+#endif
diff --git a/lib/Analysis/AliasAnalysis.cpp b/lib/Analysis/AliasAnalysis.cpp
index 6d5a37515d..2abcbde74e 100644
--- a/lib/Analysis/AliasAnalysis.cpp
+++ b/lib/Analysis/AliasAnalysis.cpp
@@ -25,6 +25,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/Analysis/AliasAnalysis.h"
+#include "llvm/Pass.h"
#include "llvm/BasicBlock.h"
#include "llvm/Instructions.h"
#include "llvm/Type.h"
diff --git a/lib/Support/IncludeFile.cpp b/lib/Support/IncludeFile.cpp
new file mode 100644
index 0000000000..d4729176f4
--- /dev/null
+++ b/lib/Support/IncludeFile.cpp
@@ -0,0 +1,20 @@
+//===- lib/Support/IncludeFile.cpp - Ensure Linking Of Implementation -----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file was developed by Reid Spencer and is distributed under the
+// University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements the IncludeFile constructor.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Support/IncludeFile.h"
+
+using namespace llvm;
+
+// This constructor is used to ensure linking of other modules. See the
+// llvm/Support/IncludeFile.h header for details.
+IncludeFile::IncludeFile(void*) {}
diff --git a/lib/System/IncludeFile.cpp b/lib/System/IncludeFile.cpp
new file mode 100644
index 0000000000..d4729176f4
--- /dev/null
+++ b/lib/System/IncludeFile.cpp
@@ -0,0 +1,20 @@
+//===- lib/Support/IncludeFile.cpp - Ensure Linking Of Implementation -----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file was developed by Reid Spencer and is distributed under the
+// University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements the IncludeFile constructor.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Support/IncludeFile.h"
+
+using namespace llvm;
+
+// This constructor is used to ensure linking of other modules. See the
+// llvm/Support/IncludeFile.h header for details.
+IncludeFile::IncludeFile(void*) {}
diff --git a/lib/VMCore/IntrinsicInst.cpp b/lib/VMCore/IntrinsicInst.cpp
index 2c2c5a96ed..b4395e1cd3 100644
--- a/lib/VMCore/IntrinsicInst.cpp
+++ b/lib/VMCore/IntrinsicInst.cpp
@@ -71,3 +71,7 @@ std::string DbgStopPointInst::getDirectory() const {
}
//===----------------------------------------------------------------------===//
+/// LinkIntrinsicInstStub -- This is a hack to make sure that programs that
+/// #include IntrinsicInst.h also link this file. See Support/IncludeFile.h
+/// for further details.
+char llvm::LinkIntrinsicInstStub;
diff --git a/lib/VMCore/Pass.cpp b/lib/VMCore/Pass.cpp
index 9fed647543..a7160f1f1e 100644
--- a/lib/VMCore/Pass.cpp
+++ b/lib/VMCore/Pass.cpp
@@ -23,9 +23,6 @@
#include <set>
using namespace llvm;
-// IncludeFile - Stub function used to help linking out.
-IncludeFile::IncludeFile(void*) {}
-
//===----------------------------------------------------------------------===//
// AnalysisID Class Implementation
//