diff options
author | John Brawn <john.brawn@arm.com> | 2024-06-17 12:01:08 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-17 12:01:08 +0100 |
commit | f84056c38f1fd14881b23ace521a403e52ed7405 (patch) | |
tree | 8325f174fe2613cffd7fc7d5ac065ec7ce5b7864 /llvm/lib/Transforms/Utils/Local.cpp | |
parent | 7e4f7fcd9c0622270269d9e01031c5059cb41dae (diff) | |
download | llvm-f84056c38f1fd14881b23ace521a403e52ed7405.zip llvm-f84056c38f1fd14881b23ace521a403e52ed7405.tar.gz llvm-f84056c38f1fd14881b23ace521a403e52ed7405.tar.bz2 |
[DebugInfo] Handle DW_OP_LLVM_extract_bits in SROA (#94638)
This doesn't need any work to be done in SROA itself, but rather in
functions that it uses. Specifically:
* DIExpression::createFragmentExpression is made to understand
DW_OP_LLVM_extract_bits
* valueCoversEntireFragment is made to check the active bits instead of
the fragment size, so that it handles extract_bits correctly
Diffstat (limited to 'llvm/lib/Transforms/Utils/Local.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/Local.cpp | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index 1222912..e6e5c39 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -1603,7 +1603,8 @@ static bool PhiHasDebugValue(DILocalVariable *DIVar, static bool valueCoversEntireFragment(Type *ValTy, DbgVariableIntrinsic *DII) { const DataLayout &DL = DII->getModule()->getDataLayout(); TypeSize ValueSize = DL.getTypeAllocSizeInBits(ValTy); - if (std::optional<uint64_t> FragmentSize = DII->getFragmentSizeInBits()) + if (std::optional<uint64_t> FragmentSize = + DII->getExpression()->getActiveBits(DII->getVariable())) return TypeSize::isKnownGE(ValueSize, TypeSize::getFixed(*FragmentSize)); // We can't always calculate the size of the DI variable (e.g. if it is a @@ -1629,7 +1630,8 @@ static bool valueCoversEntireFragment(Type *ValTy, DbgVariableIntrinsic *DII) { static bool valueCoversEntireFragment(Type *ValTy, DbgVariableRecord *DVR) { const DataLayout &DL = DVR->getModule()->getDataLayout(); TypeSize ValueSize = DL.getTypeAllocSizeInBits(ValTy); - if (std::optional<uint64_t> FragmentSize = DVR->getFragmentSizeInBits()) + if (std::optional<uint64_t> FragmentSize = + DVR->getExpression()->getActiveBits(DVR->getVariable())) return TypeSize::isKnownGE(ValueSize, TypeSize::getFixed(*FragmentSize)); // We can't always calculate the size of the DI variable (e.g. if it is a |