Skip to content

Commit 668d73f

Browse files
committed
Address review feedback
1 parent 6b34cff commit 668d73f

File tree

4 files changed

+19
-69
lines changed

4 files changed

+19
-69
lines changed

clang/lib/CIR/CodeGen/CIRGenBuilder.cpp

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "CIRGenBuilder.h"
1010
#include "mlir/IR/BuiltinAttributes.h"
11+
#include "clang/CIR/MissingFeatures.h"
1112
#include "llvm/ADT/ArrayRef.h"
1213
#include "llvm/ADT/TypeSwitch.h"
1314

@@ -132,21 +133,20 @@ void CIRGenBuilderTy::computeGlobalViewIndicesFromFlatOffset(
132133
computeGlobalViewIndicesFromFlatOffset(offset, subType, layout, indices);
133134
}
134135

135-
static mlir::Type getAttributeType(mlir::Attribute attr) {
136-
return mlir::cast<mlir::TypedAttr>(attr).getType();
137-
}
138-
139136
cir::RecordType clang::CIRGen::CIRGenBuilderTy::getCompleteRecordType(
140-
mlir::ArrayAttr fields, bool packed, bool padded, llvm::StringRef name,
141-
const clang::RecordDecl *ast) {
142-
llvm::SmallVector<mlir::Type, 8> members;
137+
mlir::ArrayAttr fields, bool packed, bool padded, llvm::StringRef name) {
138+
assert(!cir::MissingFeatures::astRecordDeclAttr());
139+
llvm::SmallVector<mlir::Type> members;
143140
members.reserve(fields.size());
144-
llvm::transform(fields, std::back_inserter(members), getAttributeType);
141+
llvm::transform(fields, std::back_inserter(members),
142+
[](mlir::Attribute attr) {
143+
return mlir::cast<mlir::TypedAttr>(attr).getType();
144+
});
145145

146146
if (name.empty())
147147
return getAnonRecordTy(members, packed, padded);
148148

149-
return getCompleteRecordTy(members, name, packed, padded);
149+
return getCompleteNamedRecordType(members, packed, padded, name);
150150
}
151151

152152
mlir::Attribute clang::CIRGen::CIRGenBuilderTy::getConstRecordOrZeroAttr(
@@ -155,11 +155,7 @@ mlir::Attribute clang::CIRGen::CIRGenBuilderTy::getConstRecordOrZeroAttr(
155155

156156
// Record type not specified: create anon record type from members.
157157
if (!recordTy) {
158-
llvm::SmallVector<mlir::Type, 8> members;
159-
members.reserve(arrayAttr.size());
160-
llvm::transform(arrayAttr, std::back_inserter(members), getAttributeType);
161-
recordTy = getType<cir::RecordType>(members, packed, padded,
162-
cir::RecordType::Struct);
158+
recordTy = getCompleteRecordType(arrayAttr, packed, padded);
163159
}
164160

165161
// Return zero or anonymous constant record.

clang/lib/CIR/CodeGen/CIRGenBuilder.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,9 @@ class CIRGenBuilderTy : public cir::CIRBaseBuilderTy {
138138
///
139139
/// If a record already exists and is complete, but the client tries to fetch
140140
/// it with a different set of attributes, this method will crash.
141-
cir::RecordType getCompleteRecordTy(llvm::ArrayRef<mlir::Type> members,
142-
llvm::StringRef name, bool packed,
143-
bool padded) {
141+
cir::RecordType getCompleteNamedRecordType(llvm::ArrayRef<mlir::Type> members,
142+
bool packed, bool padded,
143+
llvm::StringRef name) {
144144
const auto nameAttr = getStringAttr(name);
145145
auto kind = cir::RecordType::RecordKind::Struct;
146146
assert(!cir::MissingFeatures::astRecordDeclAttr());
@@ -165,8 +165,7 @@ class CIRGenBuilderTy : public cir::CIRBaseBuilderTy {
165165
cir::RecordType getCompleteRecordType(mlir::ArrayAttr fields,
166166
bool packed = false,
167167
bool padded = false,
168-
llvm::StringRef name = "",
169-
const clang::RecordDecl *ast = nullptr);
168+
llvm::StringRef name = "");
170169

171170
/// Get an incomplete CIR struct type. If we have a complete record
172171
/// declaration, we may create an incomplete type and then add the

clang/lib/CIR/CodeGen/CIRGenExprConstant.cpp

Lines changed: 2 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,6 @@ class ConstantAggregateBuilder : private ConstantAggregateBuilderUtils {
109109
/// non-packed LLVM struct will give the correct layout.
110110
bool naturalLayout = true;
111111

112-
std::optional<size_t> splitAt(CharUnits pos);
113-
114112
static mlir::Attribute
115113
buildFrom(CIRGenModule &cgm, ArrayRef<mlir::TypedAttr> elems,
116114
ArrayRef<CharUnits> offsets, CharUnits startOffset, CharUnits size,
@@ -167,51 +165,8 @@ bool ConstantAggregateBuilder::add(mlir::TypedAttr typedAttr, CharUnits offset,
167165
}
168166

169167
// Uncommon case: constant overlaps what we've already created.
170-
std::optional<size_t> firstElemToReplace = splitAt(offset);
171-
if (!firstElemToReplace)
172-
return false;
173-
174-
CharUnits cSize = getSize(typedAttr);
175-
std::optional<size_t> lastElemToReplace = splitAt(offset + cSize);
176-
if (!lastElemToReplace)
177-
return false;
178-
179-
assert((firstElemToReplace == lastElemToReplace || allowOverwrite) &&
180-
"unexpectedly overwriting field");
181-
182-
replace(elems, *firstElemToReplace, *lastElemToReplace, {typedAttr});
183-
replace(offsets, *firstElemToReplace, *lastElemToReplace, {offset});
184-
size = std::max(size, offset + cSize);
185-
naturalLayout = false;
186-
return true;
187-
}
188-
189-
/// Returns a position within Elems and Offsets such that all elements
190-
/// before the returned index end before Pos and all elements at or after
191-
/// the returned index begin at or after Pos. Splits elements as necessary
192-
/// to ensure this. Returns None if we find something we can't split.
193-
std::optional<size_t> ConstantAggregateBuilder::splitAt(CharUnits pos) {
194-
if (pos >= size)
195-
return offsets.size();
196-
197-
clang::CharUnits *firstAfterPos = llvm::upper_bound(offsets, pos);
198-
if (firstAfterPos == offsets.begin())
199-
return 0;
200-
201-
// If we already have an element starting at Pos, we're done.
202-
size_t lastAtOrBeforePosIndex = firstAfterPos - offsets.begin() - 1;
203-
if (offsets[lastAtOrBeforePosIndex] == pos)
204-
return lastAtOrBeforePosIndex;
205-
206-
// We found an element starting before Pos. Check for overlap.
207-
mlir::TypedAttr c =
208-
mlir::cast<mlir::TypedAttr>(elems[lastAtOrBeforePosIndex]);
209-
if (offsets[lastAtOrBeforePosIndex] + getSize(c) <= pos)
210-
return lastAtOrBeforePosIndex + 1;
211-
212-
// Try to decompose it into smaller constants.
213-
cgm.errorNYI("split into smaller constants");
214-
return std::nullopt;
168+
cgm.errorNYI("overlapping constants");
169+
return false;
215170
}
216171

217172
mlir::Attribute ConstantAggregateBuilder::buildFrom(

clang/lib/CIR/CodeGen/CIRGenRecordLayoutBuilder.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -627,9 +627,9 @@ CIRGenTypes::computeRecordLayout(const RecordDecl *rd, cir::RecordType *ty) {
627627
CIRRecordLowering baseLowering(*this, rd, /*Packed=*/lowering.packed);
628628
baseLowering.lower(/*NonVirtualBaseType=*/true);
629629
std::string baseIdentifier = getRecordTypeName(rd, ".base");
630-
baseTy =
631-
builder.getCompleteRecordTy(baseLowering.fieldTypes, baseIdentifier,
632-
baseLowering.packed, baseLowering.padded);
630+
baseTy = builder.getCompleteNamedRecordType(
631+
baseLowering.fieldTypes, baseLowering.packed, baseLowering.padded,
632+
baseIdentifier);
633633
// TODO(cir): add something like addRecordTypeName
634634

635635
// BaseTy and Ty must agree on their packedness for getCIRFieldNo to work

0 commit comments

Comments
 (0)