From 63dfb2c79769f0b57ddd80d90303c1ec089ab723 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 18 Feb 2011 21:50:34 +0000 Subject: [PATCH] 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. llvm-svn: 125965 --- include/llvm/InitializePasses.h | 1 + include/llvm/Target/TargetLibraryInfo.h | 56 +++++++++++++++++++++++++ lib/Target/CMakeLists.txt | 1 + lib/Target/Target.cpp | 1 + lib/Target/TargetLibraryInfo.cpp | 49 ++++++++++++++++++++++ 5 files changed, 108 insertions(+) create mode 100644 include/llvm/Target/TargetLibraryInfo.h create mode 100644 lib/Target/TargetLibraryInfo.cpp diff --git a/include/llvm/InitializePasses.h b/include/llvm/InitializePasses.h index 2a17c383f84..02dbfbd26d5 100644 --- a/include/llvm/InitializePasses.h +++ b/include/llvm/InitializePasses.h @@ -220,6 +220,7 @@ void initializeStrongPHIEliminationPass(PassRegistry&); void initializeTailCallElimPass(PassRegistry&); void initializeTailDupPass(PassRegistry&); void initializeTargetDataPass(PassRegistry&); +void initializeTargetLibraryInfoPass(PassRegistry&); void initializeTwoAddressInstructionPassPass(PassRegistry&); void initializeTypeBasedAliasAnalysisPass(PassRegistry&); void initializeUnifyFunctionExitNodesPass(PassRegistry&); diff --git a/include/llvm/Target/TargetLibraryInfo.h b/include/llvm/Target/TargetLibraryInfo.h new file mode 100644 index 00000000000..09c1857d7b4 --- /dev/null +++ b/include/llvm/Target/TargetLibraryInfo.h @@ -0,0 +1,56 @@ +//===-- llvm/Target/TargetLibraryInfo.h - Library information ---*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_TARGET_TARGETLIBRARYINFO_H +#define LLVM_TARGET_TARGETLIBRARYINFO_H + +#include "llvm/Pass.h" + +namespace llvm { + class Triple; + + namespace LibFunc { + enum Func { + /// void memset_pattern16(void *b, const void *pattern16, size_t len); + memset_pattern16, + + NumLibFuncs + }; + } + +/// TargetLibraryInfo - This immutable pass captures information about what +/// library functions are available for the current target, and allows a +/// frontend to disable optimizations through -fno-builtin etc. +class TargetLibraryInfo : public ImmutablePass { + unsigned char AvailableArray[(LibFunc::NumLibFuncs+7)/8]; +public: + static char ID; + TargetLibraryInfo(); + TargetLibraryInfo(const Triple &T); + + /// has - This function is used by optimizations that want to match on or form + /// a given library function. + bool has(LibFunc::Func F) const { + return (AvailableArray[F/8] & (1 << (F&7))) != 0; + } + + /// setUnavailable - this can be used by whatever sets up TargetLibraryInfo to + /// ban use of specific library functions. + void setUnavailable(LibFunc::Func F) { + AvailableArray[F/8] &= ~(1 << (F&7)); + } + + void setAvailable(LibFunc::Func F) { + AvailableArray[F/8] |= 1 << (F&7); + } +}; + +} // end namespace llvm + +#endif diff --git a/lib/Target/CMakeLists.txt b/lib/Target/CMakeLists.txt index 4d02d1e4a5b..f7a98664a36 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 9609099e914..0919fe42dc0 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 00000000000..f4a85b0cd62 --- /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); +}