Author: djg Date: Tue Jan 23 09:04:04 2018 New Revision: 323224 URL: http://llvm.org/viewvc/llvm-project?rev=323224&view=rev Log: [WebAssembly] Add mem.* builtin functions.
This corresponds to r323222 in LLVM. The new names are not yet finalized, so use them at your own risk. Modified: cfe/trunk/include/clang/Basic/BuiltinsWebAssembly.def cfe/trunk/lib/CodeGen/CGBuiltin.cpp cfe/trunk/test/CodeGen/builtins-wasm.c cfe/trunk/test/CodeGen/wasm-arguments.c Modified: cfe/trunk/include/clang/Basic/BuiltinsWebAssembly.def URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/BuiltinsWebAssembly.def?rev=323224&r1=323223&r2=323224&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/BuiltinsWebAssembly.def (original) +++ cfe/trunk/include/clang/Basic/BuiltinsWebAssembly.def Tue Jan 23 09:04:04 2018 @@ -16,8 +16,16 @@ // The format of this database matches clang/Basic/Builtins.def. -// Note that current_memory is not "c" (readnone) because it must be sequenced +// Query the current memory size, and increase the current memory size. +// Note that mem.size is not "c" (readnone) because it must be sequenced // with respect to grow_memory calls. +// These are the new proposed names, which aren't yet official. Use at your own +// risk. +BUILTIN(__builtin_wasm_mem_size, "zIi", "n") +BUILTIN(__builtin_wasm_mem_grow, "zIiz", "n") + +// These are the existing names, which are currently official, but expected +// to be deprecated in the future. They also lack the immediate field. BUILTIN(__builtin_wasm_current_memory, "z", "n") BUILTIN(__builtin_wasm_grow_memory, "zz", "n") Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=323224&r1=323223&r2=323224&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original) +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Tue Jan 23 09:04:04 2018 @@ -10495,6 +10495,21 @@ Value *CodeGenFunction::EmitNVPTXBuiltin Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID, const CallExpr *E) { switch (BuiltinID) { + case WebAssembly::BI__builtin_wasm_mem_size: { + llvm::Type *ResultType = ConvertType(E->getType()); + Value *I = EmitScalarExpr(E->getArg(0)); + Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_mem_size, ResultType); + return Builder.CreateCall(Callee, I); + } + case WebAssembly::BI__builtin_wasm_mem_grow: { + llvm::Type *ResultType = ConvertType(E->getType()); + Value *Args[] = { + EmitScalarExpr(E->getArg(0)), + EmitScalarExpr(E->getArg(1)) + }; + Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_mem_grow, ResultType); + return Builder.CreateCall(Callee, Args); + } case WebAssembly::BI__builtin_wasm_current_memory: { llvm::Type *ResultType = ConvertType(E->getType()); Value *Callee = CGM.getIntrinsic(Intrinsic::wasm_current_memory, ResultType); Modified: cfe/trunk/test/CodeGen/builtins-wasm.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/builtins-wasm.c?rev=323224&r1=323223&r2=323224&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/builtins-wasm.c (original) +++ cfe/trunk/test/CodeGen/builtins-wasm.c Tue Jan 23 09:04:04 2018 @@ -3,25 +3,37 @@ // RUN: %clang_cc1 -triple wasm64-unknown-unknown -O3 -emit-llvm -o - %s \ // RUN: | FileCheck %s -check-prefix=WEBASSEMBLY64 -__SIZE_TYPE__ f1(void) { +__SIZE_TYPE__ f0(void) { + return __builtin_wasm_mem_size(0); +// WEBASSEMBLY32: call {{i.*}} @llvm.wasm.mem.size.i32(i32 0) +// WEBASSEMBLY64: call {{i.*}} @llvm.wasm.mem.size.i64(i32 0) +} + +__SIZE_TYPE__ f1(__SIZE_TYPE__ delta) { + return __builtin_wasm_mem_grow(0, delta); +// WEBASSEMBLY32: call i32 @llvm.wasm.mem.grow.i32(i32 0, i32 %{{.*}}) +// WEBASSEMBLY64: call i64 @llvm.wasm.mem.grow.i64(i32 0, i64 %{{.*}}) +} + +__SIZE_TYPE__ f2(void) { return __builtin_wasm_current_memory(); // WEBASSEMBLY32: call {{i.*}} @llvm.wasm.current.memory.i32() // WEBASSEMBLY64: call {{i.*}} @llvm.wasm.current.memory.i64() } -__SIZE_TYPE__ f2(__SIZE_TYPE__ delta) { +__SIZE_TYPE__ f3(__SIZE_TYPE__ delta) { return __builtin_wasm_grow_memory(delta); // WEBASSEMBLY32: call i32 @llvm.wasm.grow.memory.i32(i32 %{{.*}}) // WEBASSEMBLY64: call i64 @llvm.wasm.grow.memory.i64(i64 %{{.*}}) } -void f3(unsigned int tag, void *obj) { +void f4(unsigned int tag, void *obj) { return __builtin_wasm_throw(tag, obj); // WEBASSEMBLY32: call void @llvm.wasm.throw(i32 %{{.*}}, i8* %{{.*}}) // WEBASSEMBLY64: call void @llvm.wasm.throw(i32 %{{.*}}, i8* %{{.*}}) } -void f4() { +void f5(void) { return __builtin_wasm_rethrow(); // WEBASSEMBLY32: call void @llvm.wasm.rethrow() // WEBASSEMBLY64: call void @llvm.wasm.rethrow() Modified: cfe/trunk/test/CodeGen/wasm-arguments.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/wasm-arguments.c?rev=323224&r1=323223&r2=323224&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/wasm-arguments.c (original) +++ cfe/trunk/test/CodeGen/wasm-arguments.c Tue Jan 23 09:04:04 2018 @@ -24,7 +24,7 @@ typedef struct { // Single-element structs should be returned as the one element. // WEBASSEMBLY32: define i32 @f2() // WEBASSEMBLY64: define i32 @f2() -s2 f2() { +s2 f2(void) { s2 foo; return foo; } @@ -36,7 +36,7 @@ typedef struct { // Structs should be returned sret and not simplified by the frontend. // WEBASSEMBLY32: define void @f3(%struct.s3* noalias sret %agg.result) // WEBASSEMBLY64: define void @f3(%struct.s3* noalias sret %agg.result) -s3 f3() { +s3 f3(void) { s3 foo; return foo; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits