Skip to content

Commit b756a0b

Browse files
committed
fix horrible assumptions in clang codegen
1 parent 894fdfa commit b756a0b

File tree

3 files changed

+17
-12
lines changed

3 files changed

+17
-12
lines changed

clang/include/clang/Basic/TargetInfo.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,11 @@ class TargetInfo : public virtual TransferrableTargetInfo,
429429
return PointerWidth;
430430
}
431431

432+
/// Return the maximum width of pointers on this target.
433+
virtual uint64_t getMaxPointerAlign() const {
434+
return PointerAlign;
435+
}
436+
432437
/// Get integer value for null pointer.
433438
/// \param AddrSpace address space of pointee in source language.
434439
virtual uint64_t getNullPointerValue(LangAS AddrSpace) const { return 0; }

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,14 @@ CodeGenModule::CodeGenModule(ASTContext &C, const HeaderSearchOptions &HSO,
121121
PointerWidthInBits = C.getTargetInfo().getPointerWidth(0);
122122
PointerAlignInBytes =
123123
C.toCharUnitsFromBits(C.getTargetInfo().getPointerAlign(0)).getQuantity();
124+
PointerSizeInBytes =
125+
C.toCharUnitsFromBits(C.getTargetInfo().getPointerWidth(0)).getQuantity();
124126
SizeSizeInBytes =
125127
C.toCharUnitsFromBits(C.getTargetInfo().getMaxPointerWidth()).getQuantity();
128+
SizeAlignInBytes =
129+
C.toCharUnitsFromBits(C.getTargetInfo().getMaxPointerAlign()).getQuantity();
130+
IntSizeInBytes =
131+
C.toCharUnitsFromBits(C.getTargetInfo().getIntWidth()).getQuantity();
126132
IntAlignInBytes =
127133
C.toCharUnitsFromBits(C.getTargetInfo().getIntAlign()).getQuantity();
128134
CharTy =

clang/lib/CodeGen/CodeGenTypeCache.h

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,8 @@ struct CodeGenTypeCache {
7777

7878
/// The size and alignment of the builtin C type 'int'. This comes
7979
/// up enough in various ABI lowering tasks to be worth pre-computing.
80-
union {
81-
unsigned char IntSizeInBytes;
82-
unsigned char IntAlignInBytes;
83-
};
80+
unsigned char IntSizeInBytes;
81+
unsigned char IntAlignInBytes;
8482
CharUnits getIntSize() const {
8583
return CharUnits::fromQuantity(IntSizeInBytes);
8684
}
@@ -92,16 +90,12 @@ struct CodeGenTypeCache {
9290
unsigned char PointerWidthInBits;
9391

9492
/// The size and alignment of a pointer into the generic address space.
95-
union {
96-
unsigned char PointerAlignInBytes;
97-
unsigned char PointerSizeInBytes;
98-
};
93+
unsigned char PointerAlignInBytes;
94+
unsigned char PointerSizeInBytes;
9995

10096
/// The size and alignment of size_t.
101-
union {
102-
unsigned char SizeSizeInBytes; // sizeof(size_t)
103-
unsigned char SizeAlignInBytes;
104-
};
97+
unsigned char SizeSizeInBytes; // sizeof(size_t)
98+
unsigned char SizeAlignInBytes;
10599

106100
LangAS ASTAllocaAddressSpace;
107101

0 commit comments

Comments
 (0)