aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-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
6 files changed, 150 insertions, 12 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