|
36 | 36 | #include "llvm/Support/ConvertUTF.h" |
37 | 37 | #include "llvm/Support/ScopedPrinter.h" |
38 | 38 | #include <algorithm> |
| 39 | +#include <deque> |
39 | 40 | #include <optional> |
40 | 41 | #include <utility> |
41 | | -#include <deque> |
42 | 42 | #include <vector> |
43 | 43 |
|
44 | 44 | using namespace clang; |
@@ -2597,7 +2597,6 @@ static RValue EmitHipStdParUnsupportedBuiltin(CodeGenFunction *CGF, |
2597 | 2597 |
|
2598 | 2598 | namespace { |
2599 | 2599 |
|
2600 | | - |
2601 | 2600 | // PaddingClearer is a utility class that clears padding bits in a |
2602 | 2601 | // c++ type. It traverses the type recursively, collecting occupied |
2603 | 2602 | // bit intervals, and then compute the padding intervals. |
@@ -2698,7 +2697,7 @@ struct PaddingClearer { |
2698 | 2697 |
|
2699 | 2698 | Queue.push_back( |
2700 | 2699 | Data{StartBitOffset + ArrIndex * Offset.getQuantity() * CharWidth, |
2701 | | - ElementQualType, /*VisitVirtualBase*/true}); |
| 2700 | + ElementQualType, /*VisitVirtualBase*/ true}); |
2702 | 2701 | } |
2703 | 2702 | } |
2704 | 2703 |
|
@@ -2754,12 +2753,10 @@ struct PaddingClearer { |
2754 | 2753 | if (Field->isBitField()) { |
2755 | 2754 | llvm::dbgs() << "clear_padding found bit field. Adding Interval [" |
2756 | 2755 | << StartBitOffset + FieldOffset << " , " |
2757 | | - << FieldOffset + Field->getBitWidthValue() |
2758 | | - << ")\n"; |
2759 | | - OccuppiedIntervals.push_back( |
2760 | | - BitInterval{StartBitOffset + FieldOffset, |
2761 | | - StartBitOffset + FieldOffset + |
2762 | | - Field->getBitWidthValue()}); |
| 2756 | + << FieldOffset + Field->getBitWidthValue() << ")\n"; |
| 2757 | + OccuppiedIntervals.push_back(BitInterval{ |
| 2758 | + StartBitOffset + FieldOffset, |
| 2759 | + StartBitOffset + FieldOffset + Field->getBitWidthValue()}); |
2763 | 2760 | } else { |
2764 | 2761 | Queue.push_back(Data{StartBitOffset + FieldOffset, Field->getType(), |
2765 | 2762 | /*VisitVirtualBase*/ true}); |
@@ -2831,75 +2828,72 @@ struct PaddingClearer { |
2831 | 2828 | return Results; |
2832 | 2829 | } |
2833 | 2830 |
|
| 2831 | + void ClearPadding(Value *Ptr, const BitInterval &PaddingInterval) { |
| 2832 | + auto *I8Ptr = CGF.Builder.CreateBitCast(Ptr, CGF.Int8PtrTy); |
| 2833 | + auto *Zero = ConstantInt::get(CGF.Int8Ty, 0); |
2834 | 2834 |
|
| 2835 | + // Calculate byte indices and bit positions |
| 2836 | + auto StartByte = PaddingInterval.First / CharWidth; |
| 2837 | + auto StartBit = PaddingInterval.First % CharWidth; |
| 2838 | + auto EndByte = PaddingInterval.Last / CharWidth; |
| 2839 | + auto EndBit = PaddingInterval.Last % CharWidth; |
2835 | 2840 |
|
2836 | | - void ClearPadding(Value *Ptr, const BitInterval &PaddingInterval) { |
2837 | | - auto *I8Ptr = CGF.Builder.CreateBitCast(Ptr, CGF.Int8PtrTy); |
2838 | | - auto *Zero = ConstantInt::get(CGF.Int8Ty, 0); |
2839 | | - |
2840 | | - // Calculate byte indices and bit positions |
2841 | | - auto StartByte = PaddingInterval.First / CharWidth; |
2842 | | - auto StartBit = PaddingInterval.First % CharWidth; |
2843 | | - auto EndByte = PaddingInterval.Last / CharWidth; |
2844 | | - auto EndBit = PaddingInterval.Last % CharWidth; |
2845 | | - |
2846 | | - if (StartByte == EndByte) { |
2847 | | - // Interval is within a single byte |
2848 | | - auto *Index = ConstantInt::get(CGF.IntTy, StartByte); |
2849 | | - auto *Element = CGF.Builder.CreateGEP(CGF.Int8Ty, I8Ptr, Index); |
2850 | | - Address ElementAddr(Element, CGF.Int8Ty, CharUnits::One()); |
2851 | | - |
2852 | | - auto *Value = CGF.Builder.CreateLoad(ElementAddr); |
2853 | | - |
2854 | | - // Create mask to clear bits within the byte |
2855 | | - uint8_t mask = ((1 << EndBit) - 1) & ~((1 << StartBit) - 1); |
2856 | | - auto *MaskValue = ConstantInt::get(CGF.Int8Ty, mask); |
2857 | | - auto *NewValue = CGF.Builder.CreateAnd(Value, MaskValue); |
2858 | | - |
2859 | | - CGF.Builder.CreateStore(NewValue, ElementAddr); |
2860 | | - } else { |
2861 | | - // Handle the start byte |
2862 | | - if (StartBit != 0) { |
2863 | | - auto *Index = ConstantInt::get(CGF.IntTy, StartByte); |
2864 | | - auto *Element = CGF.Builder.CreateGEP(CGF.Int8Ty, I8Ptr, Index); |
2865 | | - Address ElementAddr(Element, CGF.Int8Ty, CharUnits::One()); |
2866 | | - |
2867 | | - auto *Value = CGF.Builder.CreateLoad(ElementAddr); |
2868 | | - |
2869 | | - uint8_t startMask = ((1 << (CharWidth - StartBit)) - 1) << StartBit; |
2870 | | - auto *MaskValue = ConstantInt::get(CGF.Int8Ty, ~startMask); |
2871 | | - auto *NewValue = CGF.Builder.CreateAnd(Value, MaskValue); |
2872 | | - |
2873 | | - CGF.Builder.CreateStore(NewValue, ElementAddr); |
2874 | | - ++StartByte; |
2875 | | - } |
2876 | | - |
2877 | | - // Handle full bytes in the middle |
2878 | | - for (auto Offset = StartByte; Offset < EndByte; ++Offset) { |
2879 | | - auto *Index = ConstantInt::get(CGF.IntTy, Offset); |
2880 | | - auto *Element = CGF.Builder.CreateGEP(CGF.Int8Ty, I8Ptr, Index); |
2881 | | - Address ElementAddr(Element, CGF.Int8Ty, CharUnits::One()); |
2882 | | - |
2883 | | - CGF.Builder.CreateStore(Zero, ElementAddr); |
2884 | | - } |
2885 | | - |
2886 | | - // Handle the end byte |
2887 | | - if (EndBit != 0) { |
2888 | | - auto *Index = ConstantInt::get(CGF.IntTy, EndByte); |
2889 | | - auto *Element = CGF.Builder.CreateGEP(CGF.Int8Ty, I8Ptr, Index); |
2890 | | - Address ElementAddr(Element, CGF.Int8Ty, CharUnits::One()); |
2891 | | - |
2892 | | - auto *Value = CGF.Builder.CreateLoad(ElementAddr); |
2893 | | - |
2894 | | - uint8_t endMask = (1 << EndBit) - 1; |
2895 | | - auto *MaskValue = ConstantInt::get(CGF.Int8Ty, endMask); |
2896 | | - auto *NewValue = CGF.Builder.CreateAnd(Value, MaskValue); |
2897 | | - |
2898 | | - CGF.Builder.CreateStore(NewValue, ElementAddr); |
2899 | | - } |
| 2841 | + if (StartByte == EndByte) { |
| 2842 | + // Interval is within a single byte |
| 2843 | + auto *Index = ConstantInt::get(CGF.IntTy, StartByte); |
| 2844 | + auto *Element = CGF.Builder.CreateGEP(CGF.Int8Ty, I8Ptr, Index); |
| 2845 | + Address ElementAddr(Element, CGF.Int8Ty, CharUnits::One()); |
| 2846 | + |
| 2847 | + auto *Value = CGF.Builder.CreateLoad(ElementAddr); |
| 2848 | + |
| 2849 | + // Create mask to clear bits within the byte |
| 2850 | + uint8_t mask = ((1 << EndBit) - 1) & ~((1 << StartBit) - 1); |
| 2851 | + auto *MaskValue = ConstantInt::get(CGF.Int8Ty, mask); |
| 2852 | + auto *NewValue = CGF.Builder.CreateAnd(Value, MaskValue); |
| 2853 | + |
| 2854 | + CGF.Builder.CreateStore(NewValue, ElementAddr); |
| 2855 | + } else { |
| 2856 | + // Handle the start byte |
| 2857 | + if (StartBit != 0) { |
| 2858 | + auto *Index = ConstantInt::get(CGF.IntTy, StartByte); |
| 2859 | + auto *Element = CGF.Builder.CreateGEP(CGF.Int8Ty, I8Ptr, Index); |
| 2860 | + Address ElementAddr(Element, CGF.Int8Ty, CharUnits::One()); |
| 2861 | + |
| 2862 | + auto *Value = CGF.Builder.CreateLoad(ElementAddr); |
| 2863 | + |
| 2864 | + uint8_t startMask = ((1 << (CharWidth - StartBit)) - 1) << StartBit; |
| 2865 | + auto *MaskValue = ConstantInt::get(CGF.Int8Ty, ~startMask); |
| 2866 | + auto *NewValue = CGF.Builder.CreateAnd(Value, MaskValue); |
| 2867 | + |
| 2868 | + CGF.Builder.CreateStore(NewValue, ElementAddr); |
| 2869 | + ++StartByte; |
| 2870 | + } |
| 2871 | + |
| 2872 | + // Handle full bytes in the middle |
| 2873 | + for (auto Offset = StartByte; Offset < EndByte; ++Offset) { |
| 2874 | + auto *Index = ConstantInt::get(CGF.IntTy, Offset); |
| 2875 | + auto *Element = CGF.Builder.CreateGEP(CGF.Int8Ty, I8Ptr, Index); |
| 2876 | + Address ElementAddr(Element, CGF.Int8Ty, CharUnits::One()); |
| 2877 | + |
| 2878 | + CGF.Builder.CreateStore(Zero, ElementAddr); |
2900 | 2879 | } |
2901 | | - } |
2902 | 2880 |
|
| 2881 | + // Handle the end byte |
| 2882 | + if (EndBit != 0) { |
| 2883 | + auto *Index = ConstantInt::get(CGF.IntTy, EndByte); |
| 2884 | + auto *Element = CGF.Builder.CreateGEP(CGF.Int8Ty, I8Ptr, Index); |
| 2885 | + Address ElementAddr(Element, CGF.Int8Ty, CharUnits::One()); |
| 2886 | + |
| 2887 | + auto *Value = CGF.Builder.CreateLoad(ElementAddr); |
| 2888 | + |
| 2889 | + uint8_t endMask = (1 << EndBit) - 1; |
| 2890 | + auto *MaskValue = ConstantInt::get(CGF.Int8Ty, endMask); |
| 2891 | + auto *NewValue = CGF.Builder.CreateAnd(Value, MaskValue); |
| 2892 | + |
| 2893 | + CGF.Builder.CreateStore(NewValue, ElementAddr); |
| 2894 | + } |
| 2895 | + } |
| 2896 | + } |
2903 | 2897 |
|
2904 | 2898 | CodeGenFunction &CGF; |
2905 | 2899 | const uint64_t CharWidth; |
|
0 commit comments