mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-20 09:30:43 +00:00
Add the new `-no-builtin' flag. This flag is meant to mimic the GCC
`-fno-builtin' flag. Currently, it's used to replace "memset" with "_bzero" instead of "__bzero" on Darwin10+. This arguably violates the meaning of this flag, but is currently sufficient. The meaning of this flag should become more specific over time. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56885 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5ec9efd61b
commit
6f287b22d2
@ -1049,7 +1049,8 @@ public:
|
||||
SDValue Chain,
|
||||
SDValue Op1, SDValue Op2,
|
||||
SDValue Op3, unsigned Align,
|
||||
const Value *DstSV, uint64_t DstOff) {
|
||||
const Value *DstSV, uint64_t DstOff,
|
||||
bool NoBuiltin = false) {
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include "llvm/Target/TargetLowering.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/ADT/SetVector.h"
|
||||
@ -40,6 +41,11 @@
|
||||
#include <cmath>
|
||||
using namespace llvm;
|
||||
|
||||
static cl::opt<bool>
|
||||
NoBuiltin("no-builtin",
|
||||
cl::desc("Don't recognize built-in functions that do not begin "
|
||||
"with `__builtin_' as prefix"));
|
||||
|
||||
/// makeVTList - Return an instance of the SDVTList struct initialized with the
|
||||
/// specified members.
|
||||
static SDVTList makeVTList(const MVT *VTs, unsigned NumVTs) {
|
||||
@ -3189,7 +3195,7 @@ SDValue SelectionDAG::getMemset(SDValue Chain, SDValue Dst,
|
||||
// code. If the target chooses to do this, this is the next best.
|
||||
SDValue Result =
|
||||
TLI.EmitTargetCodeForMemset(*this, Chain, Dst, Src, Size, Align,
|
||||
DstSV, DstSVOff);
|
||||
DstSV, DstSVOff, NoBuiltin);
|
||||
if (Result.getNode())
|
||||
return Result;
|
||||
|
||||
|
@ -5128,15 +5128,17 @@ X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
|
||||
|
||||
SDValue
|
||||
X86TargetLowering::EmitTargetCodeForMemset(SelectionDAG &DAG,
|
||||
SDValue Chain,
|
||||
SDValue Dst, SDValue Src,
|
||||
SDValue Size, unsigned Align,
|
||||
const Value *DstSV, uint64_t DstSVOff) {
|
||||
SDValue Chain,
|
||||
SDValue Dst, SDValue Src,
|
||||
SDValue Size, unsigned Align,
|
||||
const Value *DstSV,
|
||||
uint64_t DstSVOff,
|
||||
bool NoBuiltin) {
|
||||
ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
|
||||
|
||||
/// If not DWORD aligned or size is more than the threshold, call the library.
|
||||
/// The libc version is likely to be faster for these cases. It can use the
|
||||
/// address value and run time information about the CPU.
|
||||
// If not DWORD aligned or size is more than the threshold, call the library.
|
||||
// The libc version is likely to be faster for these cases. It can use the
|
||||
// address value and run time information about the CPU.
|
||||
if ((Align & 3) != 0 ||
|
||||
!ConstantSize ||
|
||||
ConstantSize->getZExtValue() >
|
||||
@ -5145,8 +5147,9 @@ X86TargetLowering::EmitTargetCodeForMemset(SelectionDAG &DAG,
|
||||
|
||||
// Check to see if there is a specialized entry-point for memory zeroing.
|
||||
ConstantSDNode *V = dyn_cast<ConstantSDNode>(Src);
|
||||
if (const char *bzeroEntry =
|
||||
V && V->isNullValue() ? Subtarget->getBZeroEntry() : 0) {
|
||||
|
||||
if (const char *bzeroEntry = V &&
|
||||
V->isNullValue() ? Subtarget->getBZeroEntry(NoBuiltin) : 0) {
|
||||
MVT IntPtr = getPointerTy();
|
||||
const Type *IntPtrTy = TD->getIntPtrType();
|
||||
TargetLowering::ArgListTy Args;
|
||||
|
@ -575,17 +575,18 @@ namespace llvm {
|
||||
SDNode *ExpandATOMIC_CMP_SWAP(SDNode *N, SelectionDAG &DAG);
|
||||
|
||||
SDValue EmitTargetCodeForMemset(SelectionDAG &DAG,
|
||||
SDValue Chain,
|
||||
SDValue Dst, SDValue Src,
|
||||
SDValue Size, unsigned Align,
|
||||
const Value *DstSV, uint64_t DstSVOff);
|
||||
SDValue Chain,
|
||||
SDValue Dst, SDValue Src,
|
||||
SDValue Size, unsigned Align,
|
||||
const Value *DstSV, uint64_t DstSVOff,
|
||||
bool NoBuiltin);
|
||||
SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG,
|
||||
SDValue Chain,
|
||||
SDValue Dst, SDValue Src,
|
||||
SDValue Size, unsigned Align,
|
||||
bool AlwaysInline,
|
||||
const Value *DstSV, uint64_t DstSVOff,
|
||||
const Value *SrcSV, uint64_t SrcSVOff);
|
||||
SDValue Chain,
|
||||
SDValue Dst, SDValue Src,
|
||||
SDValue Size, unsigned Align,
|
||||
bool AlwaysInline,
|
||||
const Value *DstSV, uint64_t DstSVOff,
|
||||
const Value *SrcSV, uint64_t SrcSVOff);
|
||||
|
||||
/// Utility function to emit atomic bitwise operations (and, or, xor).
|
||||
// It takes the bitwise instruction to expand, the associated machine basic
|
||||
|
@ -59,16 +59,14 @@ bool X86Subtarget::GVRequiresExtraLoad(const GlobalValue* GV,
|
||||
return false;
|
||||
}
|
||||
|
||||
/// This function returns the name of a function which has an interface
|
||||
/// like the non-standard bzero function, if such a function exists on
|
||||
/// the current subtarget and it is considered prefereable over
|
||||
/// memset with zero passed as the second argument. Otherwise it
|
||||
/// returns null.
|
||||
const char *X86Subtarget::getBZeroEntry() const {
|
||||
|
||||
/// getBZeroEntry - This function returns the name of a function which has an
|
||||
/// interface like the non-standard bzero function, if such a function exists on
|
||||
/// the current subtarget and it is considered prefereable over memset with zero
|
||||
/// passed as the second argument. Otherwise it returns null.
|
||||
const char *X86Subtarget::getBZeroEntry(bool NoBuiltin) const {
|
||||
// Darwin 10 has a __bzero entry point for this purpose.
|
||||
if (getDarwinVers() >= 10)
|
||||
return "__bzero";
|
||||
return NoBuiltin ? "_bzero" : "__bzero";
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -184,7 +184,7 @@ public:
|
||||
/// the current subtarget and it is considered prefereable over
|
||||
/// memset with zero passed as the second argument. Otherwise it
|
||||
/// returns null.
|
||||
const char *getBZeroEntry() const;
|
||||
const char *getBZeroEntry(bool NoBuiltin) const;
|
||||
};
|
||||
|
||||
namespace X86 {
|
||||
|
Loading…
Reference in New Issue
Block a user