Skip to content

Commit

Permalink
[clang][bytecode] IntPointer::atOffset() should append (#104686)
Browse files Browse the repository at this point in the history
... to current offset. This breaks other tests which this commit also
fixes. Namely, getIndex() should return the integer representation for
non-block pointers.
  • Loading branch information
tbaederr authored Aug 18, 2024
1 parent 07bd3bb commit dac1829
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 2 deletions.
11 changes: 11 additions & 0 deletions clang/lib/AST/ByteCode/Interp.h
Original file line number Diff line number Diff line change
Expand Up @@ -1853,6 +1853,17 @@ bool OffsetHelper(InterpState &S, CodePtr OpPC, const T &Offset,
if (!CheckArray(S, OpPC, Ptr))
return false;

// This is much simpler for integral pointers, so handle them first.
if (Ptr.isIntegralPointer()) {
uint64_t V = Ptr.getIntegerRepresentation();
uint64_t O = static_cast<uint64_t>(Offset) * Ptr.elemSize();
if constexpr (Op == ArithOp::Add)
S.Stk.push<Pointer>(V + O, Ptr.asIntPointer().Desc);
else
S.Stk.push<Pointer>(V - O, Ptr.asIntPointer().Desc);
return true;
}

uint64_t MaxIndex = static_cast<uint64_t>(Ptr.getNumElems());
uint64_t Index;
if (Ptr.isOnePastEnd())
Expand Down
2 changes: 1 addition & 1 deletion clang/lib/AST/ByteCode/Pointer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -654,5 +654,5 @@ IntPointer IntPointer::atOffset(const ASTContext &ASTCtx,
uint64_t FieldOffset =
ASTCtx.toCharUnitsFromBits(Layout.getFieldOffset(FieldIndex))
.getQuantity();
return IntPointer{this->Desc, FieldOffset};
return IntPointer{this->Desc, this->Value + FieldOffset};
}
2 changes: 1 addition & 1 deletion clang/lib/AST/ByteCode/Pointer.h
Original file line number Diff line number Diff line change
Expand Up @@ -571,7 +571,7 @@ class Pointer {
/// Returns the index into an array.
int64_t getIndex() const {
if (!isBlockPointer())
return 0;
return getIntegerRepresentation();

if (isZero())
return 0;
Expand Down
19 changes: 19 additions & 0 deletions clang/test/AST/ByteCode/codegen.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -o - %s | FileCheck %s
// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -o - %s -fexperimental-new-constant-interpreter | FileCheck %s

typedef __INTPTR_TYPE__ intptr_t;

const intptr_t Z1 = (intptr_t)(((char*)-1LL) + 1);
// CHECK: @Z1 = constant i64 0

const intptr_t Z2 = (intptr_t)(((char*)1LL) - 1);
// CHECK: @Z2 = constant i64 0

struct A {
char num_fields;
};
struct B {
char a, b[1];
};
const int A = (char *)(&( (struct B *)(16) )->b[0]) - (char *)(16);
// CHECK: @A = constant i32 1

0 comments on commit dac1829

Please sign in to comment.