diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2006-06-07 20:00:19 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2006-06-07 20:00:19 +0000 |
commit | 6df60a9effe4d20a48cfd9d105c0ab3c5dc3e690 (patch) | |
tree | d5e3f627411a59fbe751d3208a73c0ab053baee8 | |
parent | 19fd7ef7300616aa245e15e73b435c9bd0c83de3 (diff) |
For PR780:
Break the "IncludeFile" mechanism into its own header file and adjust other
files accordingly. Use this facility for the IntrinsicInst problem which
was the subject of PR800.
More to follow on this.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28709 91177308-0d34-0410-b5e6-96231b3b80d8
-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 // |