summaryrefslogtreecommitdiff
path: root/lib/Target
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2011-02-18 21:50:34 +0000
committerChris Lattner <sabre@nondot.org>2011-02-18 21:50:34 +0000
commitce99120084f549a523213064648662a704e8b789 (patch)
tree302ee420dae97f757a2da56a2c84fbc849a8e742 /lib/Target
parentd78b7891104e7110d6e71646f98c4f07d814e6b3 (diff)
downloadllvm-ce99120084f549a523213064648662a704e8b789.tar.gz
llvm-ce99120084f549a523213064648662a704e8b789.tar.bz2
llvm-ce99120084f549a523213064648662a704e8b789.tar.xz
introduce a new TargetLibraryInfo pass, which transformations can use to
query about available library functions. For now this just has memset_pattern16, which exists on darwin, but it can be extended for a bunch of other things in the future. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125965 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target')
-rw-r--r--lib/Target/CMakeLists.txt1
-rw-r--r--lib/Target/Target.cpp1
-rw-r--r--lib/Target/TargetLibraryInfo.cpp49
3 files changed, 51 insertions, 0 deletions
diff --git a/lib/Target/CMakeLists.txt b/lib/Target/CMakeLists.txt
index 4d02d1e4a5..f7a98664a3 100644
--- a/lib/Target/CMakeLists.txt
+++ b/lib/Target/CMakeLists.txt
@@ -9,6 +9,7 @@ add_llvm_library(LLVMTarget
TargetFrameLowering.cpp
TargetInstrInfo.cpp
TargetIntrinsicInfo.cpp
+ TargetLibraryInfo.cpp
TargetLoweringObjectFile.cpp
TargetMachine.cpp
TargetRegisterInfo.cpp
diff --git a/lib/Target/Target.cpp b/lib/Target/Target.cpp
index 9609099e91..0919fe42dc 100644
--- a/lib/Target/Target.cpp
+++ b/lib/Target/Target.cpp
@@ -24,6 +24,7 @@ using namespace llvm;
void llvm::initializeTarget(PassRegistry &Registry) {
initializeTargetDataPass(Registry);
+ initializeTargetLibraryInfoPass(Registry);
}
void LLVMInitializeTarget(LLVMPassRegistryRef R) {
diff --git a/lib/Target/TargetLibraryInfo.cpp b/lib/Target/TargetLibraryInfo.cpp
new file mode 100644
index 0000000000..f4a85b0cd6
--- /dev/null
+++ b/lib/Target/TargetLibraryInfo.cpp
@@ -0,0 +1,49 @@
+//===-- TargetLibraryInfo.cpp - Runtime library information ----------------==//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements the TargetLibraryInfo class.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Target/TargetLibraryInfo.h"
+#include "llvm/ADT/Triple.h"
+using namespace llvm;
+
+// Register the default implementation.
+INITIALIZE_PASS(TargetLibraryInfo, "targetlibinfo",
+ "Target Library Information", false, true)
+char TargetLibraryInfo::ID = 0;
+
+/// initialize - Initialize the set of available library functions based on the
+/// specified target triple. This should be carefully written so that a missing
+/// target triple gets a sane set of defaults.
+static void initialize(TargetLibraryInfo &TLI, const Triple &T) {
+ initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry());
+
+
+ // memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later.
+ if (T.getOS() != Triple::Darwin || T.getDarwinMajorNumber() < 9)
+ TLI.setUnavailable(LibFunc::memset_pattern16);
+
+}
+
+
+TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
+ // Default to everything being available.
+ memset(AvailableArray, -1, sizeof(AvailableArray));
+
+ initialize(*this, Triple());
+}
+
+TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
+ // Default to everything being available.
+ memset(AvailableArray, -1, sizeof(AvailableArray));
+
+ initialize(*this, T);
+}