Skip to content

Commit b596096

Browse files
committed
apply suggestions
1 parent b801199 commit b596096

File tree

5 files changed

+185
-117
lines changed

5 files changed

+185
-117
lines changed

clang/lib/CIR/CodeGen/CIRGenExpr.cpp

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -319,24 +319,20 @@ LValue CIRGenFunction::emitLValueForField(LValue base, const FieldDecl *field) {
319319
unsigned recordCVR = base.getVRQualifiers();
320320

321321
llvm::StringRef fieldName = field->getName();
322+
unsigned fieldIndex;
323+
assert(!cir::MissingFeatures::lambdaFieldToName());
322324

323-
if (rec->isUnion()) {
324-
unsigned fieldIndex = field->getFieldIndex();
325-
assert(!cir::MissingFeatures::lambdaFieldToName());
326-
addr = emitAddrOfFieldStorage(addr, field, fieldName, fieldIndex);
327-
328-
} else {
329-
assert(!cir::MissingFeatures::preservedAccessIndexRegion());
330-
325+
if (rec->isUnion())
326+
fieldIndex = field->getFieldIndex();
327+
else {
331328
const CIRGenRecordLayout &layout =
332329
cgm.getTypes().getCIRGenRecordLayout(field->getParent());
333-
unsigned fieldIndex = layout.getCIRFieldNo(field);
334-
335-
assert(!cir::MissingFeatures::lambdaFieldToName());
336-
337-
addr = emitAddrOfFieldStorage(addr, field, fieldName, fieldIndex);
330+
fieldIndex = layout.getCIRFieldNo(field);
338331
}
339332

333+
addr = emitAddrOfFieldStorage(addr, field, fieldName, fieldIndex);
334+
assert(!cir::MissingFeatures::preservedAccessIndexRegion());
335+
340336
// If this is a reference field, load the reference right now.
341337
if (fieldType->isReferenceType()) {
342338
cgm.errorNYI(field->getSourceRange(), "emitLValueForField: reference type");

clang/lib/CIR/CodeGen/CIRGenRecordLayout.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class CIRGenRecordLayout {
3131

3232
/// Map from (non-bit-field) record field to the corresponding cir record type
3333
/// field no. This info is populated by the record builder.
34-
llvm::DenseMap<const clang::FieldDecl *, unsigned> fieldInfo;
34+
llvm::DenseMap<const clang::FieldDecl *, unsigned> fieldIdxMap;
3535

3636
public:
3737
CIRGenRecordLayout(cir::RecordType completeObjectType)
@@ -44,8 +44,8 @@ class CIRGenRecordLayout {
4444
/// Return cir::RecordType element number that corresponds to the field FD.
4545
unsigned getCIRFieldNo(const clang::FieldDecl *fd) const {
4646
fd = fd->getCanonicalDecl();
47-
assert(fieldInfo.count(fd) && "Invalid field for record!");
48-
return fieldInfo.lookup(fd);
47+
assert(fieldIdxMap.count(fd) && "Invalid field for record!");
48+
return fieldIdxMap.lookup(fd);
4949
}
5050
};
5151

clang/lib/CIR/CodeGen/CIRGenRecordLayoutBuilder.cpp

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ struct CIRRecordLowering final {
142142
std::vector<MemberInfo> members;
143143
// Output fields, consumed by CIRGenTypes::computeRecordLayout
144144
llvm::SmallVector<mlir::Type, 16> fieldTypes;
145-
llvm::DenseMap<const FieldDecl *, unsigned> fields;
145+
llvm::DenseMap<const FieldDecl *, unsigned> fieldIdxMap;
146146
cir::CIRDataLayout dataLayout;
147147

148148
LLVM_PREFERRED_TYPE(bool)
@@ -208,7 +208,8 @@ void CIRRecordLowering::fillOutputFields() {
208208
fieldTypes.push_back(member.data);
209209
if (member.kind == MemberInfo::InfoKind::Field) {
210210
if (member.fieldDecl)
211-
fields[member.fieldDecl->getCanonicalDecl()] = fieldTypes.size() - 1;
211+
fieldIdxMap[member.fieldDecl->getCanonicalDecl()] =
212+
fieldTypes.size() - 1;
212213
// A field without storage must be a bitfield.
213214
assert(!cir::MissingFeatures::bitfields());
214215
}
@@ -310,7 +311,7 @@ CIRGenTypes::computeRecordLayout(const RecordDecl *rd, cir::RecordType *ty) {
310311
assert(!cir::MissingFeatures::bitfields());
311312

312313
// Add all the field numbers.
313-
rl->fieldInfo.swap(lowering.fields);
314+
rl->fieldIdxMap.swap(lowering.fieldIdxMap);
314315

315316
// Dump the layout, if requested.
316317
if (getASTContext().getLangOpts().DumpRecordLayouts) {
@@ -327,10 +328,7 @@ void CIRRecordLowering::lowerUnion() {
327328
bool seenNamedMember = false;
328329

329330
// Iterate through the fields setting bitFieldInfo and the Fields array. Also
330-
// locate the "most appropriate" storage type. The heuristic for finding the
331-
// storage type isn't necessary, the first (non-0-length-bitfield) field's
332-
// type would work fine and be simpler but would be different than what we've
333-
// been doing and cause lit tests to change.
331+
// locate the "most appropriate" storage type.
334332
for (const FieldDecl *field : recordDecl->fields()) {
335333
mlir::Type fieldType;
336334
if (field->isBitField())
@@ -339,12 +337,13 @@ void CIRRecordLowering::lowerUnion() {
339337
else
340338
fieldType = getStorageType(field);
341339

342-
fields[field->getCanonicalDecl()] = 0;
340+
// This maps a field to its index. For unions, the index is always 0.
341+
fieldIdxMap[field->getCanonicalDecl()] = 0;
343342

344343
// Compute zero-initializable status.
345344
// This union might not be zero initialized: it may contain a pointer to
346345
// data member which might have some exotic initialization sequence.
347-
// If this is the case, then we aught not to try and come up with a "better"
346+
// If this is the case, then we ought not to try and come up with a "better"
348347
// type, it might not be very easy to come up with a Constant which
349348
// correctly initializes it.
350349
if (!seenNamedMember) {
@@ -380,9 +379,8 @@ void CIRRecordLowering::lowerUnion() {
380379

381380
if (layoutSize < getSize(storageType))
382381
storageType = getByteArrayType(layoutSize);
383-
384-
// NOTE(cir): Defer padding calculations to the lowering process.
385-
appendPaddingBytes(layoutSize - getSize(storageType));
382+
else
383+
appendPaddingBytes(layoutSize - getSize(storageType));
386384

387385
// Set packed if we need it.
388386
if (layoutSize % getAlignment(storageType))

clang/lib/CIR/Dialect/IR/CIRTypes.cpp

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -235,25 +235,18 @@ void RecordType::complete(ArrayRef<Type> members, bool packed, bool padded) {
235235
/// Recurses into union members never returning a union as the largest member.
236236
Type RecordType::getLargestMember(const ::mlir::DataLayout &dataLayout) const {
237237
assert(isUnion() && "Only call getLargestMember on unions");
238-
Type largestMember;
239-
unsigned largestMemberSize = 0;
240-
unsigned numElements = getNumElements();
241-
auto members = getMembers();
242-
if (getPadded())
243-
numElements -= 1; // The last element is padding.
244-
for (unsigned i = 0; i < numElements; ++i) {
245-
Type ty = members[i];
246-
if (!largestMember ||
247-
dataLayout.getTypeABIAlignment(ty) >
248-
dataLayout.getTypeABIAlignment(largestMember) ||
249-
(dataLayout.getTypeABIAlignment(ty) ==
250-
dataLayout.getTypeABIAlignment(largestMember) &&
251-
dataLayout.getTypeSize(ty) > largestMemberSize)) {
252-
largestMember = ty;
253-
largestMemberSize = dataLayout.getTypeSize(largestMember);
254-
}
255-
}
256-
return largestMember;
238+
llvm::ArrayRef<Type> members = getMembers();
239+
// If the union is padded, we need to ignore the last member,
240+
// which is the padding.
241+
return *std::max_element(
242+
members.begin(), getPadded() ? members.end() - 1 : members.end(),
243+
[&](Type lhs, Type rhs) {
244+
return dataLayout.getTypeABIAlignment(lhs) <
245+
dataLayout.getTypeABIAlignment(rhs) ||
246+
(dataLayout.getTypeABIAlignment(lhs) ==
247+
dataLayout.getTypeABIAlignment(rhs) &&
248+
dataLayout.getTypeSize(lhs) < dataLayout.getTypeSize(rhs));
249+
});
257250
}
258251

259252
//===----------------------------------------------------------------------===//

0 commit comments

Comments
 (0)