Skip to content

Commit ced51dd

Browse files
committed
Add get_threadlocal_offset intrinsic
This intrinsic will be used in the ThreadLocalLowering pass to bypass a dependency issue with LinearMemoryHelper.
1 parent da0b647 commit ced51dd

File tree

2 files changed

+14
-0
lines changed

2 files changed

+14
-0
lines changed

llvm/include/llvm/IR/IntrinsicsCheerp.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ def int_cheerp_get_thread_pointer : Intrinsic<[llvm_i32_ty]>;
105105
def int_cheerp_set_thread_pointer : Intrinsic<[],
106106
[llvm_i32_ty]>;
107107

108+
def int_cheerp_get_threadlocal_offset : Intrinsic<[llvm_i32_ty],
109+
[llvm_anyptr_ty]>;
110+
108111
def int_cheerp_atomic_wait : Intrinsic<[llvm_i32_ty],
109112
[llvm_ptr_ty, llvm_i32_ty, llvm_i64_ty]>,
110113
ClangBuiltin<"__builtin_cheerp_atomic_wait">;

llvm/lib/CheerpWriter/CheerpWriter.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,6 +1088,17 @@ CheerpWriter::COMPILE_INSTRUCTION_FEEDBACK CheerpWriter::handleBuiltinCall(const
10881088
compileOperand(*it);
10891089
return COMPILE_OK;
10901090
}
1091+
else if(intrinsicId==Intrinsic::threadlocal_address)
1092+
{
1093+
llvm::report_fatal_error("Encountered threadlocal_address in writer");
1094+
}
1095+
else if(intrinsicId==Intrinsic::cheerp_get_threadlocal_offset)
1096+
{
1097+
const GlobalVariable* GV = dyn_cast<GlobalVariable>(callV.getOperand(0));
1098+
int32_t offset = linearHelper.getThreadLocalOffset(GV);
1099+
stream << offset;
1100+
return COMPILE_OK;
1101+
}
10911102
else if(ident=="fmod")
10921103
{
10931104
// Handle this internally, C++ does not have float mod operation

0 commit comments

Comments
 (0)