Skip to content

Commit ad51914

Browse files
committed
Use ptrdiff_t sized offsets for gvars_offsets to allow large sysimages
1 parent 1de5880 commit ad51914

File tree

5 files changed

+13
-12
lines changed

5 files changed

+13
-12
lines changed

src/aotcompile.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#include "platform.h"
55

66
// target support
7+
#include "llvm/IR/Constants.h"
8+
#include "llvm/Support/Debug.h"
79
#include <llvm/TargetParser/Triple.h>
810
#include "llvm/Support/CodeGen.h"
911
#include <llvm/ADT/Statistic.h>
@@ -199,29 +201,28 @@ static inline SmallVector<T*, 0> consume_gv(Module &M, const char *name, bool al
199201
return res;
200202
}
201203

202-
static Constant *get_ptrdiff32(Type *T_size, Constant *ptr, Constant *base)
204+
static Constant *get_ptrdiff(Type *T_size, Constant *ptr, Constant *base)
203205
{
204206
if (ptr->getType()->isPointerTy())
205207
ptr = ConstantExpr::getPtrToInt(ptr, T_size);
206208
auto ptrdiff = ConstantExpr::getSub(ptr, base);
207-
return T_size->getPrimitiveSizeInBits() > 32 ? ConstantExpr::getTrunc(ptrdiff, Type::getInt32Ty(ptr->getContext())) : ptrdiff;
209+
return ptrdiff;
208210
}
209211

210212
static Constant *emit_offset_table(Module &M, Type *T_size, ArrayRef<Constant*> vars,
211213
StringRef name, StringRef suffix)
212214
{
213-
auto T_int32 = Type::getInt32Ty(M.getContext());
214215
uint32_t nvars = vars.size();
215-
ArrayType *vars_type = ArrayType::get(T_int32, nvars + 1);
216+
ArrayType *vars_type = ArrayType::get(T_size, nvars + 1);
216217
auto gv = new GlobalVariable(M, vars_type, true,
217218
GlobalVariable::ExternalLinkage,
218219
nullptr,
219220
name + "_offsets" + suffix);
220221
auto vbase = ConstantExpr::getPtrToInt(gv, T_size);
221222
SmallVector<Constant*, 0> offsets(nvars + 1);
222-
offsets[0] = ConstantInt::get(T_int32, nvars);
223+
offsets[0] = ConstantInt::get(T_size, nvars);
223224
for (uint32_t i = 0; i < nvars; i++)
224-
offsets[i + 1] = get_ptrdiff32(T_size, vars[i], vbase);
225+
offsets[i + 1] = get_ptrdiff(T_size, vars[i], vbase);
225226
gv->setInitializer(ConstantArray::get(vars_type, offsets));
226227
gv->setVisibility(GlobalValue::HiddenVisibility);
227228
gv->setDSOLocal(true);

src/processor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -772,7 +772,7 @@ static inline jl_image_t parse_sysimg(void *hdl, F &&callback)
772772
}
773773

774774
if (!gvars.empty()) {
775-
auto offsets = (int32_t*)malloc(sizeof(int32_t) * gvars.size());
775+
auto offsets = (ptrdiff_t*)malloc(sizeof(ptrdiff_t) * gvars.size());
776776
res.gvars_base = (const char*)pointers->header;
777777
for (size_t i = 0; i < gvars.size(); i++) {
778778
assert(gvars[i] && "Missing global variable pointer!");

src/processor.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ typedef struct _jl_image_fptrs_t {
8585
typedef struct {
8686
uint64_t base;
8787
const char *gvars_base;
88-
const int32_t *gvars_offsets;
88+
const ptrdiff_t *gvars_offsets;
8989
uint32_t ngvars;
9090
jl_image_fptrs_t fptrs;
9191
void **jl_small_typeof;
@@ -126,7 +126,7 @@ typedef struct {
126126
// Similar to fvar_offsets, but for gvars
127127
// This is also the base data pointer
128128
// (all data pointers in this shard are stored as offsets to this address)
129-
const int32_t *gvar_offsets;
129+
const ptrdiff_t *gvar_offsets;
130130
// This is the mapping of shard global variable index -> global global variable index
131131
// Similar to fvar_idxs, but for gvars
132132
const uint32_t *gvar_idxs;

src/staticdata.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,7 @@ typedef struct {
631631
static void *jl_sysimg_handle = NULL;
632632
static jl_image_t sysimage;
633633

634-
static inline uintptr_t *sysimg_gvars(const char *base, const int32_t *offsets, size_t idx)
634+
static inline uintptr_t *sysimg_gvars(const char *base, const ptrdiff_t *offsets, size_t idx)
635635
{
636636
return (uintptr_t*)(base + offsets[idx]);
637637
}

test/llvmpasses/multiversioning-clone-only.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
; RUN: opt --load-pass-plugin=libjulia-codegen%shlibext -passes='JuliaMultiVersioning' -S %s | FileCheck %s --allow-unused-prefixes=false --check-prefixes=CHECK,OPAQUE
44

55
; CHECK: @jl_gvar_base = hidden constant i64 0
6-
; CHECK: @jl_gvar_offsets = hidden constant [0 x i32] zeroinitializer
6+
; CHECK: @jl_gvar_offsets = hidden constant [0 x i64] zeroinitializer
77
; CHECK: @jl_fvar_idxs = hidden constant [1 x i32] zeroinitializer
88
; CHECK: @jl_gvar_idxs = hidden constant [0 x i32] zeroinitializer
99
; OPAQUE: @subtarget_cloned_gv = hidden global ptr null
@@ -18,7 +18,7 @@
1818

1919
@jl_fvars = global [1 x i64*] [i64* bitcast (i32 (i32)* @subtarget_cloned to i64*)], align 8
2020
@jl_gvar_base = hidden constant i64 zeroinitializer, align 8
21-
@jl_gvar_offsets = hidden constant [0 x i32] zeroinitializer, align 8
21+
@jl_gvar_offsets = hidden constant [0 x i64] zeroinitializer, align 8
2222
@jl_fvar_idxs = hidden constant [1 x i32] [i32 0], align 8
2323
@jl_gvar_idxs = hidden constant [0 x i32] zeroinitializer, align 8
2424
@subtarget_cloned_gv = hidden global i64* bitcast (i32 (i32)* @subtarget_cloned to i64*), align 8

0 commit comments

Comments
 (0)