================
@@ -377,35 +378,48 @@ callBufferedPrintfArgPush(IRBuilder<> &Builder,
ArrayRef<Value *> Args,
auto StrIt = StringContents.begin();
size_t i = IsConstFmtStr ? 1 : 0;
for (; i < Args.size(); i++) {
- SmallVector<Value *, 32> WhatToStore;
- if ((i == 0) || SpecIsCString.test(i)) {
- if (StrIt->IsConst) {
- processConstantStringArg(StrIt, Builder, WhatToStore);
- StrIt++;
- } else {
- // This copies the contents of the string, however the next offset
- // is at aligned length, the extra space that might be created due
- // to alignment padding is not populated with any specific value
- // here. This would be safe as long as runtime is sync with
- // the offsets.
- Builder.CreateMemCpy(PtrToStore, /*DstAlign*/ Align(1), Args[i],
- /*SrcAlign*/ Args[i]->getPointerAlignment(DL),
- StrIt->RealSize);
-
- PtrToStore =
- Builder.CreateInBoundsGEP(Builder.getInt8Ty(), PtrToStore,
- {StrIt->AlignedSize},
"PrintBuffNextPtr");
- LLVM_DEBUG(dbgs() << "inserting gep to the printf buffer:"
- << *PtrToStore << '\n');
-
- // done with current argument, move to next
- StrIt++;
- continue;
- }
- } else {
- WhatToStore.push_back(processNonStringArg(Args[i], Builder));
+ if (i != 0 && !SpecIsCString.test(i)) {
+ // The runtime reads each non-string argument from a whole number of
+ // 8-byte slots, also when the stored value is smaller.
+ Value *ToStore = processNonStringArg(Args[i], Builder);
+ StoreInst *StBuff = Builder.CreateStore(ToStore, PtrToStore);
+ LLVM_DEBUG(dbgs() << "inserting store to printf buffer:" << *StBuff
+ << '\n');
+ (void)StBuff;
----------------
arsenm wrote:
```suggestion
[[maybe_unused]] StoreInst *StBuff = Builder.CreateStore(ToStore,
PtrToStore);
LLVM_DEBUG(dbgs() << "inserting store to printf buffer:" << *StBuff
<< '\n');
```
https://github.com/llvm/llvm-project/pull/237178
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits