mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
On X86, MEMBARRIER, MFENCE, SFENCE, LFENCE are not target memory intrinsics,
so don't claim they are. They are allocated using DAG.getNode, so attempts to access MemSDNode fields results in reading off the end of the allocated memory. This fixes crashes with "llc -debug" due to debug code trying to print MemSDNode fields for these barrier nodes (since the crashes are not deterministic, use valgrind to see this). Add some nasty checking to try to catch this kind of thing in the future. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119901 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b9e6fe1e3a
commit
59d2dad59e
@ -171,9 +171,6 @@ class SelectionDAG {
|
|||||||
/// DbgInfo - Tracks dbg_value information through SDISel.
|
/// DbgInfo - Tracks dbg_value information through SDISel.
|
||||||
SDDbgInfo *DbgInfo;
|
SDDbgInfo *DbgInfo;
|
||||||
|
|
||||||
/// VerifyNode - Sanity check the given node. Aborts if it is invalid.
|
|
||||||
void VerifyNode(SDNode *N);
|
|
||||||
|
|
||||||
/// setGraphColorHelper - Implementation of setSubgraphColor.
|
/// setGraphColorHelper - Implementation of setSubgraphColor.
|
||||||
/// Return whether we had to truncate the search.
|
/// Return whether we had to truncate the search.
|
||||||
///
|
///
|
||||||
|
@ -745,8 +745,8 @@ SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N,
|
|||||||
return Node;
|
return Node;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// VerifyNode - Sanity check the given node. Aborts if it is invalid.
|
/// VerifyNodeCommon - Sanity check the given node. Aborts if it is invalid.
|
||||||
void SelectionDAG::VerifyNode(SDNode *N) {
|
static void VerifyNodeCommon(SDNode *N) {
|
||||||
switch (N->getOpcode()) {
|
switch (N->getOpcode()) {
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -780,6 +780,43 @@ void SelectionDAG::VerifyNode(SDNode *N) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// VerifySDNode - Sanity check the given SDNode. Aborts if it is invalid.
|
||||||
|
static void VerifySDNode(SDNode *N) {
|
||||||
|
// The SDNode allocators cannot be used to allocate nodes with fields that are
|
||||||
|
// not present in an SDNode!
|
||||||
|
assert(!isa<MemSDNode>(N) && "Bad MemSDNode!");
|
||||||
|
assert(!isa<ShuffleVectorSDNode>(N) && "Bad ShuffleVectorSDNode!");
|
||||||
|
assert(!isa<ConstantSDNode>(N) && "Bad ConstantSDNode!");
|
||||||
|
assert(!isa<ConstantFPSDNode>(N) && "Bad ConstantFPSDNode!");
|
||||||
|
assert(!isa<GlobalAddressSDNode>(N) && "Bad GlobalAddressSDNode!");
|
||||||
|
assert(!isa<FrameIndexSDNode>(N) && "Bad FrameIndexSDNode!");
|
||||||
|
assert(!isa<JumpTableSDNode>(N) && "Bad JumpTableSDNode!");
|
||||||
|
assert(!isa<ConstantPoolSDNode>(N) && "Bad ConstantPoolSDNode!");
|
||||||
|
assert(!isa<BasicBlockSDNode>(N) && "Bad BasicBlockSDNode!");
|
||||||
|
assert(!isa<SrcValueSDNode>(N) && "Bad SrcValueSDNode!");
|
||||||
|
assert(!isa<MDNodeSDNode>(N) && "Bad MDNodeSDNode!");
|
||||||
|
assert(!isa<RegisterSDNode>(N) && "Bad RegisterSDNode!");
|
||||||
|
assert(!isa<BlockAddressSDNode>(N) && "Bad BlockAddressSDNode!");
|
||||||
|
assert(!isa<EHLabelSDNode>(N) && "Bad EHLabelSDNode!");
|
||||||
|
assert(!isa<ExternalSymbolSDNode>(N) && "Bad ExternalSymbolSDNode!");
|
||||||
|
assert(!isa<CondCodeSDNode>(N) && "Bad CondCodeSDNode!");
|
||||||
|
assert(!isa<CvtRndSatSDNode>(N) && "Bad CvtRndSatSDNode!");
|
||||||
|
assert(!isa<VTSDNode>(N) && "Bad VTSDNode!");
|
||||||
|
assert(!isa<MachineSDNode>(N) && "Bad MachineSDNode!");
|
||||||
|
|
||||||
|
VerifyNodeCommon(N);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// VerifyMachineNode - Sanity check the given MachineNode. Aborts if it is
|
||||||
|
/// invalid.
|
||||||
|
static void VerifyMachineNode(SDNode *N) {
|
||||||
|
// The MachineNode allocators cannot be used to allocate nodes with fields
|
||||||
|
// that are not present in a MachineNode!
|
||||||
|
// Currently there are no such nodes.
|
||||||
|
|
||||||
|
VerifyNodeCommon(N);
|
||||||
|
}
|
||||||
|
|
||||||
/// getEVTAlignment - Compute the default alignment value for the
|
/// getEVTAlignment - Compute the default alignment value for the
|
||||||
/// given type.
|
/// given type.
|
||||||
///
|
///
|
||||||
@ -2297,7 +2334,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT) {
|
|||||||
|
|
||||||
AllNodes.push_back(N);
|
AllNodes.push_back(N);
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
VerifyNode(N);
|
VerifySDNode(N);
|
||||||
#endif
|
#endif
|
||||||
return SDValue(N, 0);
|
return SDValue(N, 0);
|
||||||
}
|
}
|
||||||
@ -2537,7 +2574,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL,
|
|||||||
|
|
||||||
AllNodes.push_back(N);
|
AllNodes.push_back(N);
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
VerifyNode(N);
|
VerifySDNode(N);
|
||||||
#endif
|
#endif
|
||||||
return SDValue(N, 0);
|
return SDValue(N, 0);
|
||||||
}
|
}
|
||||||
@ -2979,7 +3016,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,
|
|||||||
|
|
||||||
AllNodes.push_back(N);
|
AllNodes.push_back(N);
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
VerifyNode(N);
|
VerifySDNode(N);
|
||||||
#endif
|
#endif
|
||||||
return SDValue(N, 0);
|
return SDValue(N, 0);
|
||||||
}
|
}
|
||||||
@ -3047,7 +3084,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,
|
|||||||
|
|
||||||
AllNodes.push_back(N);
|
AllNodes.push_back(N);
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
VerifyNode(N);
|
VerifySDNode(N);
|
||||||
#endif
|
#endif
|
||||||
return SDValue(N, 0);
|
return SDValue(N, 0);
|
||||||
}
|
}
|
||||||
@ -4211,7 +4248,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,
|
|||||||
|
|
||||||
AllNodes.push_back(N);
|
AllNodes.push_back(N);
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
VerifyNode(N);
|
VerifySDNode(N);
|
||||||
#endif
|
#endif
|
||||||
return SDValue(N, 0);
|
return SDValue(N, 0);
|
||||||
}
|
}
|
||||||
@ -4293,7 +4330,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, SDVTList VTList,
|
|||||||
}
|
}
|
||||||
AllNodes.push_back(N);
|
AllNodes.push_back(N);
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
VerifyNode(N);
|
VerifySDNode(N);
|
||||||
#endif
|
#endif
|
||||||
return SDValue(N, 0);
|
return SDValue(N, 0);
|
||||||
}
|
}
|
||||||
@ -4901,7 +4938,7 @@ SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,
|
|||||||
|
|
||||||
AllNodes.push_back(N);
|
AllNodes.push_back(N);
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
VerifyNode(N);
|
VerifyMachineNode(N);
|
||||||
#endif
|
#endif
|
||||||
return N;
|
return N;
|
||||||
}
|
}
|
||||||
|
@ -256,6 +256,12 @@ namespace llvm {
|
|||||||
// WIN_ALLOCA - Windows's _chkstk call to do stack probing.
|
// WIN_ALLOCA - Windows's _chkstk call to do stack probing.
|
||||||
WIN_ALLOCA,
|
WIN_ALLOCA,
|
||||||
|
|
||||||
|
// Memory barrier
|
||||||
|
MEMBARRIER,
|
||||||
|
MFENCE,
|
||||||
|
SFENCE,
|
||||||
|
LFENCE,
|
||||||
|
|
||||||
// ATOMADD64_DAG, ATOMSUB64_DAG, ATOMOR64_DAG, ATOMAND64_DAG,
|
// ATOMADD64_DAG, ATOMSUB64_DAG, ATOMOR64_DAG, ATOMAND64_DAG,
|
||||||
// ATOMXOR64_DAG, ATOMNAND64_DAG, ATOMSWAP64_DAG -
|
// ATOMXOR64_DAG, ATOMNAND64_DAG, ATOMSWAP64_DAG -
|
||||||
// Atomic 64-bit binary operations.
|
// Atomic 64-bit binary operations.
|
||||||
@ -267,12 +273,6 @@ namespace llvm {
|
|||||||
ATOMNAND64_DAG,
|
ATOMNAND64_DAG,
|
||||||
ATOMSWAP64_DAG,
|
ATOMSWAP64_DAG,
|
||||||
|
|
||||||
// Memory barrier
|
|
||||||
MEMBARRIER,
|
|
||||||
MFENCE,
|
|
||||||
SFENCE,
|
|
||||||
LFENCE,
|
|
||||||
|
|
||||||
// LCMPXCHG_DAG, LCMPXCHG8_DAG - Compare and swap.
|
// LCMPXCHG_DAG, LCMPXCHG8_DAG - Compare and swap.
|
||||||
LCMPXCHG_DAG,
|
LCMPXCHG_DAG,
|
||||||
LCMPXCHG8_DAG,
|
LCMPXCHG8_DAG,
|
||||||
|
Loading…
Reference in New Issue
Block a user