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:
parent
e7d107d271
commit
63dfb2c797
@ -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&);
|
||||
|
56
include/llvm/Target/TargetLibraryInfo.h
Normal file
56
include/llvm/Target/TargetLibraryInfo.h
Normal 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
|
@ -9,6 +9,7 @@ add_llvm_library(LLVMTarget
|
||||
TargetFrameLowering.cpp
|
||||
TargetInstrInfo.cpp
|
||||
TargetIntrinsicInfo.cpp
|
||||
TargetLibraryInfo.cpp
|
||||
TargetLoweringObjectFile.cpp
|
||||
TargetMachine.cpp
|
||||
TargetRegisterInfo.cpp
|
||||
|
@ -24,6 +24,7 @@ using namespace llvm;
|
||||
|
||||
void llvm::initializeTarget(PassRegistry &Registry) {
|
||||
initializeTargetDataPass(Registry);
|
||||
initializeTargetLibraryInfoPass(Registry);
|
||||
}
|
||||
|
||||
void LLVMInitializeTarget(LLVMPassRegistryRef R) {
|
||||
|
49
lib/Target/TargetLibraryInfo.cpp
Normal file
49
lib/Target/TargetLibraryInfo.cpp
Normal 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);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user