mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
Suppress all uses of LLVM_END_WITH_NULL. NFC.
Use variadic templates instead of relying on <cstdarg> + sentinel. This enforces better type checking and makes code more readable. Differential Revision: https://reviews.llvm.org/D32541 llvm-svn: 302571
This commit is contained in:
parent
d55c78bcc5
commit
8b4ecc5d40
@ -706,6 +706,18 @@ struct is_one_of<T, U, Ts...> {
|
||||
std::is_same<T, U>::value || is_one_of<T, Ts...>::value;
|
||||
};
|
||||
|
||||
/// \brief traits class for checking whether type T is a base class for all
|
||||
/// the given types in the variadic list.
|
||||
template <typename T, typename... Ts> struct are_base_of {
|
||||
static const bool value = true;
|
||||
};
|
||||
|
||||
template <typename T, typename U, typename... Ts>
|
||||
struct are_base_of<T, U, Ts...> {
|
||||
static const bool value =
|
||||
std::is_base_of<T, U>::value && are_base_of<T, Ts...>::value;
|
||||
};
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Extra additions for arrays
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/None.h"
|
||||
#include "llvm/ADT/Optional.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/IR/Constant.h"
|
||||
#include "llvm/IR/DerivedTypes.h"
|
||||
@ -452,7 +453,14 @@ class ConstantStruct final : public ConstantAggregate {
|
||||
public:
|
||||
// ConstantStruct accessors
|
||||
static Constant *get(StructType *T, ArrayRef<Constant*> V);
|
||||
static Constant *get(StructType *T, ...) LLVM_END_WITH_NULL;
|
||||
|
||||
template <typename... Csts>
|
||||
static typename std::enable_if<are_base_of<Constant, Csts...>::value,
|
||||
Constant *>::type
|
||||
get(StructType *T, Csts *... Vs) {
|
||||
SmallVector<Constant *, 8> Values{{Vs...}};
|
||||
return get(T, Values);
|
||||
}
|
||||
|
||||
/// Return an anonymous struct that has the specified elements.
|
||||
/// If the struct is possibly empty, then you must specify a context.
|
||||
|
@ -19,6 +19,7 @@
|
||||
#define LLVM_IR_DERIVEDTYPES_H
|
||||
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/IR/Type.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
@ -228,7 +229,14 @@ public:
|
||||
static StructType *create(LLVMContext &Context, ArrayRef<Type *> Elements,
|
||||
StringRef Name, bool isPacked = false);
|
||||
static StructType *create(LLVMContext &Context, ArrayRef<Type *> Elements);
|
||||
static StructType *create(StringRef Name, Type *elt1, ...) LLVM_END_WITH_NULL;
|
||||
template <class... Tys>
|
||||
static typename std::enable_if<are_base_of<Type, Tys...>::value,
|
||||
StructType *>::type
|
||||
create(StringRef Name, Type *elt1, Tys *... elts) {
|
||||
assert(elt1 && "Cannot create a struct type with no elements with this");
|
||||
SmallVector<llvm::Type *, 8> StructFields{{elt1, elts...}};
|
||||
return create(StructFields, Name);
|
||||
}
|
||||
|
||||
/// This static method is the primary way to create a literal StructType.
|
||||
static StructType *get(LLVMContext &Context, ArrayRef<Type*> Elements,
|
||||
@ -240,7 +248,15 @@ public:
|
||||
/// This static method is a convenience method for creating structure types by
|
||||
/// specifying the elements as arguments. Note that this method always returns
|
||||
/// a non-packed struct, and requires at least one element type.
|
||||
static StructType *get(Type *elt1, ...) LLVM_END_WITH_NULL;
|
||||
template <class... Tys>
|
||||
static typename std::enable_if<are_base_of<Type, Tys...>::value,
|
||||
StructType *>::type
|
||||
get(Type *elt1, Tys *... elts) {
|
||||
assert(elt1 && "Cannot create a struct type with no elements with this");
|
||||
LLVMContext &Ctx = elt1->getContext();
|
||||
SmallVector<llvm::Type *, 8> StructFields{{elt1, elts...}};
|
||||
return llvm::StructType::get(Ctx, StructFields);
|
||||
}
|
||||
|
||||
bool isPacked() const { return (getSubclassData() & SCDB_Packed) != 0; }
|
||||
|
||||
@ -269,7 +285,14 @@ public:
|
||||
|
||||
/// Specify a body for an opaque identified type.
|
||||
void setBody(ArrayRef<Type*> Elements, bool isPacked = false);
|
||||
void setBody(Type *elt1, ...) LLVM_END_WITH_NULL;
|
||||
|
||||
template <typename... Tys>
|
||||
typename std::enable_if<are_base_of<Type, Tys...>::value, void>::type
|
||||
setBody(Type *elt1, Tys *... elts) {
|
||||
assert(elt1 && "Cannot create a struct type with no elements with this");
|
||||
SmallVector<llvm::Type *, 8> StructFields{{elt1, elts...}};
|
||||
setBody(StructFields);
|
||||
}
|
||||
|
||||
/// Return true if the specified type is valid as a element type.
|
||||
static bool isValidElementType(Type *ElemTy);
|
||||
|
@ -111,12 +111,6 @@
|
||||
#define LLVM_PREFETCH(addr, rw, locality)
|
||||
#endif
|
||||
|
||||
#if __has_attribute(sentinel) || LLVM_GNUC_PREREQ(3, 0, 0)
|
||||
#define LLVM_END_WITH_NULL __attribute__((sentinel))
|
||||
#else
|
||||
#define LLVM_END_WITH_NULL
|
||||
#endif
|
||||
|
||||
#if __has_attribute(used) || LLVM_GNUC_PREREQ(3, 1, 0)
|
||||
#define LLVM_ATTRIBUTE_USED __attribute__((__used__))
|
||||
#else
|
||||
|
@ -93,8 +93,8 @@ bool SjLjEHPrepare::doInitialization(Module &M) {
|
||||
doubleUnderDataTy, // __data
|
||||
VoidPtrTy, // __personality
|
||||
VoidPtrTy, // __lsda
|
||||
doubleUnderJBufTy, // __jbuf
|
||||
nullptr);
|
||||
doubleUnderJBufTy // __jbuf
|
||||
);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -30,7 +30,7 @@
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include <algorithm>
|
||||
#include <cstdarg>
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -966,16 +966,6 @@ Constant *ConstantStruct::get(StructType *ST, ArrayRef<Constant*> V) {
|
||||
return ST->getContext().pImpl->StructConstants.getOrCreate(ST, V);
|
||||
}
|
||||
|
||||
Constant *ConstantStruct::get(StructType *T, ...) {
|
||||
va_list ap;
|
||||
SmallVector<Constant*, 8> Values;
|
||||
va_start(ap, T);
|
||||
while (Constant *Val = va_arg(ap, llvm::Constant*))
|
||||
Values.push_back(Val);
|
||||
va_end(ap);
|
||||
return get(T, Values);
|
||||
}
|
||||
|
||||
ConstantVector::ConstantVector(VectorType *T, ArrayRef<Constant *> V)
|
||||
: ConstantAggregate(T, ConstantVectorVal, V) {
|
||||
assert(V.size() == T->getNumElements() &&
|
||||
@ -1810,8 +1800,7 @@ Constant *ConstantExpr::getSizeOf(Type* Ty) {
|
||||
Constant *ConstantExpr::getAlignOf(Type* Ty) {
|
||||
// alignof is implemented as: (i64) gep ({i1,Ty}*)null, 0, 1
|
||||
// Note that a non-inbounds gep is used, as null isn't within any object.
|
||||
Type *AligningTy =
|
||||
StructType::get(Type::getInt1Ty(Ty->getContext()), Ty, nullptr);
|
||||
Type *AligningTy = StructType::get(Type::getInt1Ty(Ty->getContext()), Ty);
|
||||
Constant *NullPtr = Constant::getNullValue(AligningTy->getPointerTo(0));
|
||||
Constant *Zero = ConstantInt::get(Type::getInt64Ty(Ty->getContext()), 0);
|
||||
Constant *One = ConstantInt::get(Type::getInt32Ty(Ty->getContext()), 1);
|
||||
|
@ -1543,8 +1543,7 @@ AtomicCmpXchgInst::AtomicCmpXchgInst(Value *Ptr, Value *Cmp, Value *NewVal,
|
||||
SynchronizationScope SynchScope,
|
||||
Instruction *InsertBefore)
|
||||
: Instruction(
|
||||
StructType::get(Cmp->getType(), Type::getInt1Ty(Cmp->getContext()),
|
||||
nullptr),
|
||||
StructType::get(Cmp->getType(), Type::getInt1Ty(Cmp->getContext())),
|
||||
AtomicCmpXchg, OperandTraits<AtomicCmpXchgInst>::op_begin(this),
|
||||
OperandTraits<AtomicCmpXchgInst>::operands(this), InsertBefore) {
|
||||
Init(Ptr, Cmp, NewVal, SuccessOrdering, FailureOrdering, SynchScope);
|
||||
@ -1556,8 +1555,7 @@ AtomicCmpXchgInst::AtomicCmpXchgInst(Value *Ptr, Value *Cmp, Value *NewVal,
|
||||
SynchronizationScope SynchScope,
|
||||
BasicBlock *InsertAtEnd)
|
||||
: Instruction(
|
||||
StructType::get(Cmp->getType(), Type::getInt1Ty(Cmp->getContext()),
|
||||
nullptr),
|
||||
StructType::get(Cmp->getType(), Type::getInt1Ty(Cmp->getContext())),
|
||||
AtomicCmpXchg, OperandTraits<AtomicCmpXchgInst>::op_begin(this),
|
||||
OperandTraits<AtomicCmpXchgInst>::operands(this), InsertAtEnd) {
|
||||
Init(Ptr, Cmp, NewVal, SuccessOrdering, FailureOrdering, SynchScope);
|
||||
|
@ -30,7 +30,6 @@
|
||||
#include "llvm/Support/Path.h"
|
||||
#include "llvm/Support/RandomNumberGenerator.h"
|
||||
#include <algorithm>
|
||||
#include <cstdarg>
|
||||
#include <cstdlib>
|
||||
|
||||
using namespace llvm;
|
||||
|
@ -16,7 +16,6 @@
|
||||
#include "llvm/ADT/SmallString.h"
|
||||
#include "llvm/IR/Module.h"
|
||||
#include <algorithm>
|
||||
#include <cstdarg>
|
||||
using namespace llvm;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -419,21 +418,6 @@ StructType *StructType::get(LLVMContext &Context, bool isPacked) {
|
||||
return get(Context, None, isPacked);
|
||||
}
|
||||
|
||||
StructType *StructType::get(Type *type, ...) {
|
||||
assert(type && "Cannot create a struct type with no elements with this");
|
||||
LLVMContext &Ctx = type->getContext();
|
||||
va_list ap;
|
||||
SmallVector<llvm::Type*, 8> StructFields;
|
||||
va_start(ap, type);
|
||||
while (type) {
|
||||
StructFields.push_back(type);
|
||||
type = va_arg(ap, llvm::Type*);
|
||||
}
|
||||
auto *Ret = llvm::StructType::get(Ctx, StructFields);
|
||||
va_end(ap);
|
||||
return Ret;
|
||||
}
|
||||
|
||||
StructType *StructType::create(LLVMContext &Context, ArrayRef<Type*> Elements,
|
||||
StringRef Name, bool isPacked) {
|
||||
StructType *ST = create(Context, Name);
|
||||
@ -462,21 +446,6 @@ StructType *StructType::create(ArrayRef<Type*> Elements) {
|
||||
return create(Elements[0]->getContext(), Elements, StringRef());
|
||||
}
|
||||
|
||||
StructType *StructType::create(StringRef Name, Type *type, ...) {
|
||||
assert(type && "Cannot create a struct type with no elements with this");
|
||||
LLVMContext &Ctx = type->getContext();
|
||||
va_list ap;
|
||||
SmallVector<llvm::Type*, 8> StructFields;
|
||||
va_start(ap, type);
|
||||
while (type) {
|
||||
StructFields.push_back(type);
|
||||
type = va_arg(ap, llvm::Type*);
|
||||
}
|
||||
auto *Ret = llvm::StructType::create(Ctx, StructFields, Name);
|
||||
va_end(ap);
|
||||
return Ret;
|
||||
}
|
||||
|
||||
bool StructType::isSized(SmallPtrSetImpl<Type*> *Visited) const {
|
||||
if ((getSubclassData() & SCDB_IsSized) != 0)
|
||||
return true;
|
||||
@ -508,19 +477,6 @@ StringRef StructType::getName() const {
|
||||
return ((StringMapEntry<StructType*> *)SymbolTableEntry)->getKey();
|
||||
}
|
||||
|
||||
void StructType::setBody(Type *type, ...) {
|
||||
assert(type && "Cannot create a struct type with no elements with this");
|
||||
va_list ap;
|
||||
SmallVector<llvm::Type*, 8> StructFields;
|
||||
va_start(ap, type);
|
||||
while (type) {
|
||||
StructFields.push_back(type);
|
||||
type = va_arg(ap, llvm::Type*);
|
||||
}
|
||||
setBody(StructFields);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
bool StructType::isValidElementType(Type *ElemTy) {
|
||||
return !ElemTy->isVoidTy() && !ElemTy->isLabelTy() &&
|
||||
!ElemTy->isMetadataTy() && !ElemTy->isFunctionTy() &&
|
||||
|
@ -2265,7 +2265,7 @@ SDValue AArch64TargetLowering::LowerFSINCOS(SDValue Op,
|
||||
SDValue Callee =
|
||||
DAG.getExternalSymbol(LibcallName, getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
StructType *RetTy = StructType::get(ArgTy, ArgTy, nullptr);
|
||||
StructType *RetTy = StructType::get(ArgTy, ArgTy);
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(DAG.getEntryNode())
|
||||
|
@ -7364,7 +7364,7 @@ SDValue ARMTargetLowering::LowerFSINCOS(SDValue Op, SelectionDAG &DAG) const {
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
|
||||
// Pair of floats / doubles used to pass the result.
|
||||
Type *RetTy = StructType::get(ArgTy, ArgTy, nullptr);
|
||||
Type *RetTy = StructType::get(ArgTy, ArgTy);
|
||||
auto &DL = DAG.getDataLayout();
|
||||
|
||||
ArgListTy Args;
|
||||
@ -13114,7 +13114,7 @@ SDValue ARMTargetLowering::LowerDivRem(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDValue Callee = DAG.getExternalSymbol(getLibcallName(LC),
|
||||
getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
Type *RetTy = (Type*)StructType::get(Ty, Ty, nullptr);
|
||||
Type *RetTy = StructType::get(Ty, Ty);
|
||||
|
||||
if (Subtarget->isTargetWindows())
|
||||
InChain = WinDBZCheckDenominator(DAG, Op.getNode(), InChain);
|
||||
|
@ -23306,9 +23306,8 @@ static SDValue LowerFSINCOS(SDValue Op, const X86Subtarget &Subtarget,
|
||||
SDValue Callee =
|
||||
DAG.getExternalSymbol(LibcallName, TLI.getPointerTy(DAG.getDataLayout()));
|
||||
|
||||
Type *RetTy = isF64
|
||||
? (Type*)StructType::get(ArgTy, ArgTy, nullptr)
|
||||
: (Type*)VectorType::get(ArgTy, 4);
|
||||
Type *RetTy = isF64 ? (Type *)StructType::get(ArgTy, ArgTy)
|
||||
: (Type *)VectorType::get(ArgTy, 4);
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl)
|
||||
|
@ -1782,7 +1782,7 @@ void AddressSanitizerModule::InstrumentGlobalsMachO(
|
||||
// On recent Mach-O platforms, use a structure which binds the liveness of
|
||||
// the global variable to the metadata struct. Keep the list of "Liveness" GV
|
||||
// created to be added to llvm.compiler.used
|
||||
StructType *LivenessTy = StructType::get(IntptrTy, IntptrTy, nullptr);
|
||||
StructType *LivenessTy = StructType::get(IntptrTy, IntptrTy);
|
||||
SmallVector<GlobalValue *, 16> LivenessGlobals(ExtendedGlobals.size());
|
||||
|
||||
for (size_t i = 0; i < ExtendedGlobals.size(); i++) {
|
||||
@ -1793,9 +1793,9 @@ void AddressSanitizerModule::InstrumentGlobalsMachO(
|
||||
|
||||
// On recent Mach-O platforms, we emit the global metadata in a way that
|
||||
// allows the linker to properly strip dead globals.
|
||||
auto LivenessBinder = ConstantStruct::get(
|
||||
LivenessTy, Initializer->getAggregateElement(0u),
|
||||
ConstantExpr::getPointerCast(Metadata, IntptrTy), nullptr);
|
||||
auto LivenessBinder =
|
||||
ConstantStruct::get(LivenessTy, Initializer->getAggregateElement(0u),
|
||||
ConstantExpr::getPointerCast(Metadata, IntptrTy));
|
||||
GlobalVariable *Liveness = new GlobalVariable(
|
||||
M, LivenessTy, false, GlobalVariable::InternalLinkage, LivenessBinder,
|
||||
Twine("__asan_binder_") + G->getName());
|
||||
@ -1893,7 +1893,7 @@ bool AddressSanitizerModule::InstrumentGlobals(IRBuilder<> &IRB, Module &M, bool
|
||||
// We initialize an array of such structures and pass it to a run-time call.
|
||||
StructType *GlobalStructTy =
|
||||
StructType::get(IntptrTy, IntptrTy, IntptrTy, IntptrTy, IntptrTy,
|
||||
IntptrTy, IntptrTy, IntptrTy, nullptr);
|
||||
IntptrTy, IntptrTy, IntptrTy);
|
||||
SmallVector<GlobalVariable *, 16> NewGlobals(n);
|
||||
SmallVector<Constant *, 16> Initializers(n);
|
||||
|
||||
@ -1929,10 +1929,9 @@ bool AddressSanitizerModule::InstrumentGlobals(IRBuilder<> &IRB, Module &M, bool
|
||||
assert(((RightRedzoneSize + SizeInBytes) % MinRZ) == 0);
|
||||
Type *RightRedZoneTy = ArrayType::get(IRB.getInt8Ty(), RightRedzoneSize);
|
||||
|
||||
StructType *NewTy = StructType::get(Ty, RightRedZoneTy, nullptr);
|
||||
Constant *NewInitializer =
|
||||
ConstantStruct::get(NewTy, G->getInitializer(),
|
||||
Constant::getNullValue(RightRedZoneTy), nullptr);
|
||||
StructType *NewTy = StructType::get(Ty, RightRedZoneTy);
|
||||
Constant *NewInitializer = ConstantStruct::get(
|
||||
NewTy, G->getInitializer(), Constant::getNullValue(RightRedZoneTy));
|
||||
|
||||
// Create a new global variable with enough space for a redzone.
|
||||
GlobalValue::LinkageTypes Linkage = G->getLinkage();
|
||||
@ -2013,7 +2012,7 @@ bool AddressSanitizerModule::InstrumentGlobals(IRBuilder<> &IRB, Module &M, bool
|
||||
ConstantExpr::getPointerCast(Name, IntptrTy),
|
||||
ConstantExpr::getPointerCast(ModuleName, IntptrTy),
|
||||
ConstantInt::get(IntptrTy, MD.IsDynInit), SourceLoc,
|
||||
ConstantExpr::getPointerCast(ODRIndicator, IntptrTy), nullptr);
|
||||
ConstantExpr::getPointerCast(ODRIndicator, IntptrTy));
|
||||
|
||||
if (ClInitializers && MD.IsDynInit) HasDynamicallyInitializedGlobals = true;
|
||||
|
||||
|
@ -388,7 +388,7 @@ FunctionType *DataFlowSanitizer::getArgsFunctionType(FunctionType *T) {
|
||||
ArgTypes.push_back(ShadowPtrTy);
|
||||
Type *RetType = T->getReturnType();
|
||||
if (!RetType->isVoidTy())
|
||||
RetType = StructType::get(RetType, ShadowTy, (Type *)nullptr);
|
||||
RetType = StructType::get(RetType, ShadowTy);
|
||||
return FunctionType::get(RetType, ArgTypes, T->isVarArg());
|
||||
}
|
||||
|
||||
@ -476,16 +476,14 @@ bool DataFlowSanitizer::doInitialization(Module &M) {
|
||||
GetArgTLS = ConstantExpr::getIntToPtr(
|
||||
ConstantInt::get(IntptrTy, uintptr_t(GetArgTLSPtr)),
|
||||
PointerType::getUnqual(
|
||||
FunctionType::get(PointerType::getUnqual(ArgTLSTy),
|
||||
(Type *)nullptr)));
|
||||
FunctionType::get(PointerType::getUnqual(ArgTLSTy), (Type*)nullptr)));
|
||||
}
|
||||
if (GetRetvalTLSPtr) {
|
||||
RetvalTLS = nullptr;
|
||||
GetRetvalTLS = ConstantExpr::getIntToPtr(
|
||||
ConstantInt::get(IntptrTy, uintptr_t(GetRetvalTLSPtr)),
|
||||
PointerType::getUnqual(
|
||||
FunctionType::get(PointerType::getUnqual(ShadowTy),
|
||||
(Type *)nullptr)));
|
||||
FunctionType::get(PointerType::getUnqual(ShadowTy), (Type*)nullptr)));
|
||||
}
|
||||
|
||||
ColdCallWeights = MDBuilder(*Ctx).createBranchWeights(1, 1000);
|
||||
|
@ -398,8 +398,8 @@ GlobalVariable *EfficiencySanitizer::createCacheFragInfoGV(
|
||||
// u64 *ArrayCounter;
|
||||
// };
|
||||
auto *StructInfoTy =
|
||||
StructType::get(Int8PtrTy, Int32Ty, Int32Ty, Int32PtrTy, Int32PtrTy,
|
||||
Int8PtrPtrTy, Int64PtrTy, Int64PtrTy, nullptr);
|
||||
StructType::get(Int8PtrTy, Int32Ty, Int32Ty, Int32PtrTy, Int32PtrTy,
|
||||
Int8PtrPtrTy, Int64PtrTy, Int64PtrTy);
|
||||
auto *StructInfoPtrTy = StructInfoTy->getPointerTo();
|
||||
// This structure should be kept consistent with the CacheFragInfo struct
|
||||
// in the runtime library.
|
||||
@ -408,8 +408,7 @@ GlobalVariable *EfficiencySanitizer::createCacheFragInfoGV(
|
||||
// u32 NumStructs;
|
||||
// StructInfo *Structs;
|
||||
// };
|
||||
auto *CacheFragInfoTy =
|
||||
StructType::get(Int8PtrTy, Int32Ty, StructInfoPtrTy, nullptr);
|
||||
auto *CacheFragInfoTy = StructType::get(Int8PtrTy, Int32Ty, StructInfoPtrTy);
|
||||
|
||||
std::vector<StructType *> Vec = M.getIdentifiedStructTypes();
|
||||
unsigned NumStructs = 0;
|
||||
@ -457,24 +456,23 @@ GlobalVariable *EfficiencySanitizer::createCacheFragInfoGV(
|
||||
ArrayCounterIdx[0] = ConstantInt::get(Int32Ty, 0);
|
||||
ArrayCounterIdx[1] = ConstantInt::get(Int32Ty,
|
||||
getArrayCounterIdx(StructTy));
|
||||
Initializers.push_back(
|
||||
ConstantStruct::get(
|
||||
StructInfoTy,
|
||||
ConstantExpr::getPointerCast(StructCounterName, Int8PtrTy),
|
||||
ConstantInt::get(Int32Ty,
|
||||
DL.getStructLayout(StructTy)->getSizeInBytes()),
|
||||
ConstantInt::get(Int32Ty, StructTy->getNumElements()),
|
||||
Offset == nullptr ? ConstantPointerNull::get(Int32PtrTy) :
|
||||
ConstantExpr::getPointerCast(Offset, Int32PtrTy),
|
||||
Size == nullptr ? ConstantPointerNull::get(Int32PtrTy) :
|
||||
ConstantExpr::getPointerCast(Size, Int32PtrTy),
|
||||
TypeName == nullptr ? ConstantPointerNull::get(Int8PtrPtrTy) :
|
||||
ConstantExpr::getPointerCast(TypeName, Int8PtrPtrTy),
|
||||
ConstantExpr::getGetElementPtr(CounterArrayTy, Counters,
|
||||
FieldCounterIdx),
|
||||
ConstantExpr::getGetElementPtr(CounterArrayTy, Counters,
|
||||
ArrayCounterIdx),
|
||||
nullptr));
|
||||
Initializers.push_back(ConstantStruct::get(
|
||||
StructInfoTy,
|
||||
ConstantExpr::getPointerCast(StructCounterName, Int8PtrTy),
|
||||
ConstantInt::get(Int32Ty,
|
||||
DL.getStructLayout(StructTy)->getSizeInBytes()),
|
||||
ConstantInt::get(Int32Ty, StructTy->getNumElements()),
|
||||
Offset == nullptr ? ConstantPointerNull::get(Int32PtrTy)
|
||||
: ConstantExpr::getPointerCast(Offset, Int32PtrTy),
|
||||
Size == nullptr ? ConstantPointerNull::get(Int32PtrTy)
|
||||
: ConstantExpr::getPointerCast(Size, Int32PtrTy),
|
||||
TypeName == nullptr
|
||||
? ConstantPointerNull::get(Int8PtrPtrTy)
|
||||
: ConstantExpr::getPointerCast(TypeName, Int8PtrPtrTy),
|
||||
ConstantExpr::getGetElementPtr(CounterArrayTy, Counters,
|
||||
FieldCounterIdx),
|
||||
ConstantExpr::getGetElementPtr(CounterArrayTy, Counters,
|
||||
ArrayCounterIdx)));
|
||||
}
|
||||
// Structs.
|
||||
Constant *StructInfo;
|
||||
@ -491,11 +489,8 @@ GlobalVariable *EfficiencySanitizer::createCacheFragInfoGV(
|
||||
|
||||
auto *CacheFragInfoGV = new GlobalVariable(
|
||||
M, CacheFragInfoTy, true, GlobalVariable::InternalLinkage,
|
||||
ConstantStruct::get(CacheFragInfoTy,
|
||||
UnitName,
|
||||
ConstantInt::get(Int32Ty, NumStructs),
|
||||
StructInfo,
|
||||
nullptr));
|
||||
ConstantStruct::get(CacheFragInfoTy, UnitName,
|
||||
ConstantInt::get(Int32Ty, NumStructs), StructInfo));
|
||||
return CacheFragInfoGV;
|
||||
}
|
||||
|
||||
|
@ -67,8 +67,7 @@ IRBuilder<> *EscapeEnumerator::Next() {
|
||||
// Create a cleanup block.
|
||||
LLVMContext &C = F.getContext();
|
||||
BasicBlock *CleanupBB = BasicBlock::Create(C, CleanupBBName, &F);
|
||||
Type *ExnTy =
|
||||
StructType::get(Type::getInt8PtrTy(C), Type::getInt32Ty(C), nullptr);
|
||||
Type *ExnTy = StructType::get(Type::getInt8PtrTy(C), Type::getInt32Ty(C));
|
||||
if (!F.hasPersonalityFn()) {
|
||||
Constant *PersFn = getDefaultPersonalityFn(F.getParent());
|
||||
F.setPersonalityFn(PersFn);
|
||||
|
@ -35,7 +35,7 @@ static void appendToGlobalArray(const char *Array, Module &M, Function *F,
|
||||
// Upgrade a 2-field global array type to the new 3-field format if needed.
|
||||
if (Data && OldEltTy->getNumElements() < 3)
|
||||
EltTy = StructType::get(IRB.getInt32Ty(), PointerType::getUnqual(FnTy),
|
||||
IRB.getInt8PtrTy(), nullptr);
|
||||
IRB.getInt8PtrTy());
|
||||
else
|
||||
EltTy = OldEltTy;
|
||||
if (Constant *Init = GVCtor->getInitializer()) {
|
||||
@ -44,10 +44,10 @@ static void appendToGlobalArray(const char *Array, Module &M, Function *F,
|
||||
for (unsigned i = 0; i != n; ++i) {
|
||||
auto Ctor = cast<Constant>(Init->getOperand(i));
|
||||
if (EltTy != OldEltTy)
|
||||
Ctor = ConstantStruct::get(
|
||||
EltTy, Ctor->getAggregateElement((unsigned)0),
|
||||
Ctor->getAggregateElement(1),
|
||||
Constant::getNullValue(IRB.getInt8PtrTy()), nullptr);
|
||||
Ctor =
|
||||
ConstantStruct::get(EltTy, Ctor->getAggregateElement((unsigned)0),
|
||||
Ctor->getAggregateElement(1),
|
||||
Constant::getNullValue(IRB.getInt8PtrTy()));
|
||||
CurrentCtors.push_back(Ctor);
|
||||
}
|
||||
}
|
||||
@ -55,7 +55,7 @@ static void appendToGlobalArray(const char *Array, Module &M, Function *F,
|
||||
} else {
|
||||
// Use the new three-field struct if there isn't one already.
|
||||
EltTy = StructType::get(IRB.getInt32Ty(), PointerType::getUnqual(FnTy),
|
||||
IRB.getInt8PtrTy(), nullptr);
|
||||
IRB.getInt8PtrTy());
|
||||
}
|
||||
|
||||
// Build a 2 or 3 field global_ctor entry. We don't take a comdat key.
|
||||
|
@ -1450,11 +1450,11 @@ static void insertSinCosCall(IRBuilder<> &B, Function *OrigCallee, Value *Arg,
|
||||
// x86_64 can't use {float, float} since that would be returned in both
|
||||
// xmm0 and xmm1, which isn't what a real struct would do.
|
||||
ResTy = T.getArch() == Triple::x86_64
|
||||
? static_cast<Type *>(VectorType::get(ArgTy, 2))
|
||||
: static_cast<Type *>(StructType::get(ArgTy, ArgTy, nullptr));
|
||||
? static_cast<Type *>(VectorType::get(ArgTy, 2))
|
||||
: static_cast<Type *>(StructType::get(ArgTy, ArgTy));
|
||||
} else {
|
||||
Name = "__sincospi_stret";
|
||||
ResTy = StructType::get(ArgTy, ArgTy, nullptr);
|
||||
ResTy = StructType::get(ArgTy, ArgTy);
|
||||
}
|
||||
|
||||
Module *M = OrigCallee->getParent();
|
||||
|
@ -949,11 +949,10 @@ void Mapper::mapAppendingVariable(GlobalVariable &GV, Constant *InitPrefix,
|
||||
Constant *NewV;
|
||||
if (IsOldCtorDtor) {
|
||||
auto *S = cast<ConstantStruct>(V);
|
||||
auto *E1 = mapValue(S->getOperand(0));
|
||||
auto *E2 = mapValue(S->getOperand(1));
|
||||
Value *Null = Constant::getNullValue(VoidPtrTy);
|
||||
NewV =
|
||||
ConstantStruct::get(cast<StructType>(EltTy), E1, E2, Null, nullptr);
|
||||
auto *E1 = cast<Constant>(mapValue(S->getOperand(0)));
|
||||
auto *E2 = cast<Constant>(mapValue(S->getOperand(1)));
|
||||
Constant *Null = Constant::getNullValue(VoidPtrTy);
|
||||
NewV = ConstantStruct::get(cast<StructType>(EltTy), E1, E2, Null);
|
||||
} else {
|
||||
NewV = cast_or_null<Constant>(mapValue(V));
|
||||
}
|
||||
|
@ -232,8 +232,7 @@ static Constant *GetTorInit(std::vector<std::pair<Function *, int>> &TorList) {
|
||||
std::vector<Constant *> ArrayElts;
|
||||
Type *Int32Ty = Type::getInt32Ty(TorList[0].first->getContext());
|
||||
|
||||
StructType *STy =
|
||||
StructType::get(Int32Ty, TorList[0].first->getType(), nullptr);
|
||||
StructType *STy = StructType::get(Int32Ty, TorList[0].first->getType());
|
||||
for (unsigned i = 0, e = TorList.size(); i != e; ++i) {
|
||||
Constant *Elts[] = {ConstantInt::get(Int32Ty, TorList[i].second),
|
||||
TorList[i].first};
|
||||
|
@ -101,7 +101,7 @@ class TypeBuilder<DummyStruct, XCompile> {
|
||||
public:
|
||||
static StructType *get(LLVMContext &Context) {
|
||||
return StructType::get(
|
||||
TypeBuilder<types::i<32>[256], XCompile>::get(Context), nullptr);
|
||||
TypeBuilder<types::i<32>[256], XCompile>::get(Context));
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -264,23 +264,21 @@ namespace {
|
||||
|
||||
TEST(TypeBuilderTest, Extensions) {
|
||||
LLVMContext Context;
|
||||
EXPECT_EQ(PointerType::getUnqual(StructType::get(
|
||||
TypeBuilder<int, false>::get(Context),
|
||||
TypeBuilder<int *, false>::get(Context),
|
||||
TypeBuilder<void *[], false>::get(Context), (void *)nullptr)),
|
||||
EXPECT_EQ(PointerType::getUnqual(
|
||||
StructType::get(TypeBuilder<int, false>::get(Context),
|
||||
TypeBuilder<int *, false>::get(Context),
|
||||
TypeBuilder<void *[], false>::get(Context))),
|
||||
(TypeBuilder<MyType *, false>::get(Context)));
|
||||
EXPECT_EQ(
|
||||
PointerType::getUnqual(StructType::get(
|
||||
TypeBuilder<types::i<32>, false>::get(Context),
|
||||
TypeBuilder<types::i<32> *, false>::get(Context),
|
||||
TypeBuilder<types::i<8> *[], false>::get(Context), (void *)nullptr)),
|
||||
(TypeBuilder<MyPortableType *, false>::get(Context)));
|
||||
EXPECT_EQ(
|
||||
PointerType::getUnqual(StructType::get(
|
||||
TypeBuilder<types::i<32>, false>::get(Context),
|
||||
TypeBuilder<types::i<32> *, false>::get(Context),
|
||||
TypeBuilder<types::i<8> *[], false>::get(Context), (void *)nullptr)),
|
||||
(TypeBuilder<MyPortableType *, true>::get(Context)));
|
||||
EXPECT_EQ(PointerType::getUnqual(StructType::get(
|
||||
TypeBuilder<types::i<32>, false>::get(Context),
|
||||
TypeBuilder<types::i<32> *, false>::get(Context),
|
||||
TypeBuilder<types::i<8> *[], false>::get(Context))),
|
||||
(TypeBuilder<MyPortableType *, false>::get(Context)));
|
||||
EXPECT_EQ(PointerType::getUnqual(StructType::get(
|
||||
TypeBuilder<types::i<32>, false>::get(Context),
|
||||
TypeBuilder<types::i<32> *, false>::get(Context),
|
||||
TypeBuilder<types::i<8> *[], false>::get(Context))),
|
||||
(TypeBuilder<MyPortableType *, true>::get(Context)));
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
Loading…
x
Reference in New Issue
Block a user