[PATCH] D94854: [Clang] Fix SwiftCallingConv's aggregate lowering for _Atomic(_Bool).

Varun Gandhi via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sat Jan 16 14:28:23 PST 2021


varungandhi-apple added a comment.

> The way you'd test it on the Clang side would be to just write a test case that passes such an aggregate and tests that it's passed as an `i8`.

Ah, I just noticed an attribute `__attribute__((swiftcall))` that is used in some test cases, I can add a test for it.

---

> But I'm not sure it's at all unreasonable to pass this as an i1 rather than an i8; seems like something that Swift should handle correctly in its call-lowering code.

Here is the code in the compiler which is creating the `i8`.

  void addStructField(const clang::FieldDecl *clangField,
                      VarDecl *swiftField) {
    unsigned fieldOffset = ClangLayout.getFieldOffset(clangField->getFieldIndex());
    assert(!clangField->isBitField());
    Size offset(fieldOffset / 8);
  
    // If we have a Swift import of this type, use our lowered information.
    if (swiftField) { /* snip */ }
  
    // Otherwise, add it as an opaque blob.
    auto fieldSize = ClangContext.getTypeSizeInChars(clangField->getType());
    return addOpaqueField(offset, Size(fieldSize.getQuantity()));
  }

>From what I understand, the `i8` is actually correct. (I looked at LLVM IR generated by small examples and those seem to use `i8` for loads, stores and layout.)

That said, there is special handling in `NativeConventionSchema::mapIntoNative` and `NativeConventionSchema::mapFromNative`. Here's the code in `mapIntoNative`.

  if (fromNonNative.size() == 1) {
    auto *elt = fromNonNative.claimNext();
    if (nativeTy != elt->getType()) {
      if (isa<llvm::IntegerType>(nativeTy) &&
          isa<llvm::IntegerType>(elt->getType()))
        elt = IGF.Builder.CreateZExt(elt, nativeTy);

This ends up trying to zext from i8 to i1 and trips over.

Are you suggesting that I change the code in `mapIntoNative`/`mapFromNative` to flip the zext/trunc the other way around based on sizes? Should I be adding the special case to `addStructField`? Something else?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D94854/new/

https://reviews.llvm.org/D94854



More information about the cfe-commits mailing list