mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-04 09:54:09 +00:00
Fix ODR violations: a virtual function must be defined, even if it's never
called. Provide an (asserting) definition of Operator's private destructor. Remove destructors from all classes derived from Operator. We don't need them for safety, because their implicit definitions would be ill-formed (they'd call Operator's private destructor), and we don't need them to avoid emitting vtables, because we don't do anything with Operator subclasses which would trigger vtable instantiation. The Operator hierarchy is still a complete disaster with regard to undefined behavior, but this at least allows LLVM to link when using Clang's -fcatch-undefined-behavior with a new vptr-based type checking mechanism. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166530 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a6cf7a62a7
commit
30f57da439
@ -36,8 +36,10 @@ private:
|
||||
void *operator new(size_t, unsigned) LLVM_DELETED_FUNCTION;
|
||||
void *operator new(size_t s) LLVM_DELETED_FUNCTION;
|
||||
Operator() LLVM_DELETED_FUNCTION;
|
||||
// NOTE: cannot use LLVM_DELETED_FUNCTION because it's not legal to delete
|
||||
// an overridden method that's not deleted in the base class.
|
||||
|
||||
// NOTE: Cannot use LLVM_DELETED_FUNCTION because it's not legal to delete
|
||||
// an overridden method that's not deleted in the base class. Cannot leave
|
||||
// this unimplemented because that leads to an ODR-violation.
|
||||
~Operator();
|
||||
|
||||
public:
|
||||
@ -79,8 +81,6 @@ public:
|
||||
};
|
||||
|
||||
private:
|
||||
~OverflowingBinaryOperator(); // DO NOT IMPLEMENT
|
||||
|
||||
friend class BinaryOperator;
|
||||
friend class ConstantExpr;
|
||||
void setHasNoUnsignedWrap(bool B) {
|
||||
@ -132,8 +132,6 @@ public:
|
||||
};
|
||||
|
||||
private:
|
||||
~PossiblyExactOperator(); // DO NOT IMPLEMENT
|
||||
|
||||
friend class BinaryOperator;
|
||||
friend class ConstantExpr;
|
||||
void setIsExact(bool B) {
|
||||
@ -168,9 +166,6 @@ public:
|
||||
/// FPMathOperator - Utility class for floating point operations which can have
|
||||
/// information about relaxed accuracy requirements attached to them.
|
||||
class FPMathOperator : public Operator {
|
||||
private:
|
||||
~FPMathOperator(); // DO NOT IMPLEMENT
|
||||
|
||||
public:
|
||||
|
||||
/// \brief Get the maximum error permitted by this operation in ULPs. An
|
||||
@ -191,7 +186,6 @@ public:
|
||||
/// opcodes.
|
||||
template<typename SuperClass, unsigned Opc>
|
||||
class ConcreteOperator : public SuperClass {
|
||||
~ConcreteOperator(); // DO NOT IMPLEMENT
|
||||
public:
|
||||
static inline bool classof(const Instruction *I) {
|
||||
return I->getOpcode() == Opc;
|
||||
@ -207,45 +201,35 @@ public:
|
||||
|
||||
class AddOperator
|
||||
: public ConcreteOperator<OverflowingBinaryOperator, Instruction::Add> {
|
||||
~AddOperator(); // DO NOT IMPLEMENT
|
||||
};
|
||||
class SubOperator
|
||||
: public ConcreteOperator<OverflowingBinaryOperator, Instruction::Sub> {
|
||||
~SubOperator(); // DO NOT IMPLEMENT
|
||||
};
|
||||
class MulOperator
|
||||
: public ConcreteOperator<OverflowingBinaryOperator, Instruction::Mul> {
|
||||
~MulOperator(); // DO NOT IMPLEMENT
|
||||
};
|
||||
class ShlOperator
|
||||
: public ConcreteOperator<OverflowingBinaryOperator, Instruction::Shl> {
|
||||
~ShlOperator(); // DO NOT IMPLEMENT
|
||||
};
|
||||
|
||||
|
||||
class SDivOperator
|
||||
: public ConcreteOperator<PossiblyExactOperator, Instruction::SDiv> {
|
||||
~SDivOperator(); // DO NOT IMPLEMENT
|
||||
};
|
||||
class UDivOperator
|
||||
: public ConcreteOperator<PossiblyExactOperator, Instruction::UDiv> {
|
||||
~UDivOperator(); // DO NOT IMPLEMENT
|
||||
};
|
||||
class AShrOperator
|
||||
: public ConcreteOperator<PossiblyExactOperator, Instruction::AShr> {
|
||||
~AShrOperator(); // DO NOT IMPLEMENT
|
||||
};
|
||||
class LShrOperator
|
||||
: public ConcreteOperator<PossiblyExactOperator, Instruction::LShr> {
|
||||
~LShrOperator(); // DO NOT IMPLEMENT
|
||||
};
|
||||
|
||||
|
||||
|
||||
class GEPOperator
|
||||
: public ConcreteOperator<Operator, Instruction::GetElementPtr> {
|
||||
~GEPOperator(); // DO NOT IMPLEMENT
|
||||
|
||||
enum {
|
||||
IsInBounds = (1 << 0)
|
||||
};
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include "llvm/Constant.h"
|
||||
#include "llvm/GlobalValue.h"
|
||||
#include "llvm/User.h"
|
||||
#include "llvm/Operator.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
@ -78,4 +79,12 @@ void User::operator delete(void *Usr) {
|
||||
::operator delete(Storage);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Operator Class
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
Operator::~Operator() {
|
||||
llvm_unreachable("should never destroy an Operator");
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
|
Loading…
Reference in New Issue
Block a user