1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

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
This commit is contained in:
Chris Lattner 2011-02-18 21:50:34 +00:00
parent e7d107d271
commit 63dfb2c797
5 changed files with 108 additions and 0 deletions

View File

@ -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&);

View File

@ -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

View File

@ -9,6 +9,7 @@ add_llvm_library(LLVMTarget
TargetFrameLowering.cpp
TargetInstrInfo.cpp
TargetIntrinsicInfo.cpp
TargetLibraryInfo.cpp
TargetLoweringObjectFile.cpp
TargetMachine.cpp
TargetRegisterInfo.cpp

View File

@ -24,6 +24,7 @@ using namespace llvm;
void llvm::initializeTarget(PassRegistry &Registry) {
initializeTargetDataPass(Registry);
initializeTargetLibraryInfoPass(Registry);
}
void LLVMInitializeTarget(LLVMPassRegistryRef R) {

View File

@ -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);
}