]> granicus.if.org Git - clang/commitdiff
[WebAssembly] Implement __builtin_wasm_tls_base intrinsic
authorGuanzhong Chen <gzchen@google.com>
Thu, 18 Jul 2019 17:53:22 +0000 (17:53 +0000)
committerGuanzhong Chen <gzchen@google.com>
Thu, 18 Jul 2019 17:53:22 +0000 (17:53 +0000)
Summary:
Add `__builtin_wasm_tls_base` so that LeakSanitizer can find the thread-local
block and scan through it for memory leaks.

Reviewers: tlively, aheejin, sbc100

Subscribers: dschuff, jgravelle-google, hiraditya, sunfish, cfe-commits, llvm-commits

Tags: #clang, #llvm

Differential Revision: https://reviews.llvm.org/D64900

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@366475 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/BuiltinsWebAssembly.def
lib/CodeGen/CGBuiltin.cpp
test/CodeGen/builtins-wasm.c

index 63177f016ac7708f7a94c07fc4e3abab61ec952a..68cecdf63094d817ec9a0fdfc6af48d7d7819efa 100644 (file)
@@ -31,6 +31,7 @@ TARGET_BUILTIN(__builtin_wasm_data_drop, "vIUi", "", "bulk-memory")
 
 // Thread-local storage
 TARGET_BUILTIN(__builtin_wasm_tls_size, "z", "nc", "bulk-memory")
+TARGET_BUILTIN(__builtin_wasm_tls_base, "v*", "n", "bulk-memory")
 
 // Floating point min/max
 BUILTIN(__builtin_wasm_min_f32, "fff", "nc")
index a300bab49f9c86a71c0b2bfebca8f7540c4136ba..8c7411fc30567150be19c27c52f81164093eed36 100644 (file)
@@ -13924,6 +13924,10 @@ Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID,
     Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_tls_size, ResultType);
     return Builder.CreateCall(Callee);
   }
+  case WebAssembly::BI__builtin_wasm_tls_base: {
+    Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_tls_base);
+    return Builder.CreateCall(Callee);
+  }
   case WebAssembly::BI__builtin_wasm_throw: {
     Value *Tag = EmitScalarExpr(E->getArg(0));
     Value *Obj = EmitScalarExpr(E->getArg(1));
index 8a17fb39641b3ed2e034007b3a2720610c1fb620..8f8e7a9e4d0aa69f791fc06de3e87174a3e8f67d 100644 (file)
@@ -44,6 +44,11 @@ __SIZE_TYPE__ tls_size() {
   // WEBASSEMBLY64: call i64 @llvm.wasm.tls.size.i64()
 }
 
+void *tls_base() {
+  return __builtin_wasm_tls_base();
+  // WEBASSEMBLY: call i8* @llvm.wasm.tls.base()
+}
+
 void throw(void *obj) {
   return __builtin_wasm_throw(0, obj);
   // WEBASSEMBLY32: call void @llvm.wasm.throw(i32 0, i8* %{{.*}})