diff options
| author | Guanzhong Chen <gzchen@google.com> | 2019-07-18 17:53:22 +0000 |
|---|---|---|
| committer | Guanzhong Chen <gzchen@google.com> | 2019-07-18 17:53:22 +0000 |
| commit | 801fa8e6b9eb2398a051752bb0e9d81279360d14 (patch) | |
| tree | 85dbbbc175c054a527d970f9ea819f05abd0880c /llvm | |
| parent | 05be1da24cd947187a8b750e9eca45e80d2e7414 (diff) | |
| download | bcm5719-llvm-801fa8e6b9eb2398a051752bb0e9d81279360d14.tar.gz bcm5719-llvm-801fa8e6b9eb2398a051752bb0e9d81279360d14.zip | |
[WebAssembly] Implement __builtin_wasm_tls_base intrinsic
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
llvm-svn: 366475
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/IR/IntrinsicsWebAssembly.td | 5 | ||||
| -rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp | 17 | ||||
| -rw-r--r-- | llvm/test/CodeGen/WebAssembly/tls-general-dynamic.ll | 10 |
3 files changed, 32 insertions, 0 deletions
diff --git a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td index 1b892727547..0dc68a5e0c0 100644 --- a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td +++ b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td @@ -133,4 +133,9 @@ def int_wasm_tls_size : [], [IntrNoMem, IntrSpeculatable]>; +def int_wasm_tls_base : + Intrinsic<[llvm_ptr_ty], + [], + [IntrReadMem]>; + } // TargetPrefix = "wasm" diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp index 26339eaef37..e57e194fdde 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp @@ -227,6 +227,23 @@ void WebAssemblyDAGToDAGISel::Select(SDNode *Node) { } break; } + case ISD::INTRINSIC_W_CHAIN: { + unsigned IntNo = cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue(); + switch (IntNo) { + case Intrinsic::wasm_tls_base: { + MVT PtrVT = TLI->getPointerTy(CurDAG->getDataLayout()); + assert(PtrVT == MVT::i32 && "only wasm32 is supported for now"); + + MachineSDNode *TLSBase = CurDAG->getMachineNode( + WebAssembly::GLOBAL_GET_I32, DL, MVT::i32, + CurDAG->getTargetExternalSymbol("__tls_base", PtrVT), + Node->getOperand(0)); + ReplaceNode(Node, TLSBase); + return; + } + } + break; + } default: break; diff --git a/llvm/test/CodeGen/WebAssembly/tls-general-dynamic.ll b/llvm/test/CodeGen/WebAssembly/tls-general-dynamic.ll index 3f6d9d325c6..975e2ce5569 100644 --- a/llvm/test/CodeGen/WebAssembly/tls-general-dynamic.ll +++ b/llvm/test/CodeGen/WebAssembly/tls-general-dynamic.ll @@ -75,6 +75,15 @@ define i32 @tls_size() { ret i32 %1 } +; CHECK-LABEL: tls_base: +; CHECK-NEXT: .functype tls_base () -> (i32) +define i8* @tls_base() { +; CHECK-NEXT: global.get __tls_base +; CHECK-NEXT: return + %1 = call i8* @llvm.wasm.tls.base() + ret i8* %1 +} + ; CHECK: .type tls,@object ; TLS-NEXT: .section .tbss.tls,"",@ ; NO-TLS-NEXT: .section .bss.tls,"",@ @@ -84,3 +93,4 @@ define i32 @tls_size() { @tls = internal thread_local global i32 0 declare i32 @llvm.wasm.tls.size.i32() +declare i8* @llvm.wasm.tls.base() |

