diff options
-rw-r--r-- | include/llvm/Analysis/AliasAnalysis.h | 4 | ||||
-rw-r--r-- | include/llvm/IntrinsicInst.h | 7 | ||||
-rw-r--r-- | include/llvm/LinkAllVMCore.h | 59 | ||||
-rw-r--r-- | include/llvm/PassSupport.h | 12 | ||||
-rw-r--r-- | include/llvm/Support/IncludeFile.h | 40 | ||||
-rw-r--r-- | include/llvm/System/IncludeFile.h | 40 | ||||
-rw-r--r-- | lib/Analysis/AliasAnalysis.cpp | 1 | ||||
-rw-r--r-- | lib/Support/IncludeFile.cpp | 20 | ||||
-rw-r--r-- | lib/System/IncludeFile.cpp | 20 | ||||
-rw-r--r-- | lib/VMCore/IntrinsicInst.cpp | 4 | ||||
-rw-r--r-- | lib/VMCore/Pass.cpp | 3 |
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 // |