[PATCH] D152203: [WebAssembly] Error out on invalid personality functions
Heejin Ahn via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 5 15:22:59 PDT 2023
aheejin created this revision.
aheejin added a reviewer: dschuff.
Herald added subscribers: pmatos, asb, wingo, sunfish, hiraditya, jgravelle-google, sbc100.
Herald added a project: All.
aheejin requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Without explicitly checking and erroring out, an invalid personality
function, which is not `__gxx_wasm_personality_v0`, caused
a segmentation fault down the line because `WasmEHFuncInfo` was not
created. This explicitly checks the validity of personality functions in
functions with EH pads and errors out explicitly with a helpful error
message. This also adds some more assertions to ensure `WasmEHFuncInfo`
is correctly created and non-null.
Invalid personality functions wouldn't be generated by our Clang, but
can be present in handwritten ll files, and more often, in files
transformed by passes like `metarenamer`, which is often used with
`bugpoint` to simplify names in `bugpoint`-reduced files.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D152203
Files:
llvm/lib/CodeGen/WasmEHPrepare.cpp
llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.cpp
llvm/test/CodeGen/WebAssembly/wasm-eh-invalid-personality.ll
Index: llvm/test/CodeGen/WebAssembly/wasm-eh-invalid-personality.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/WebAssembly/wasm-eh-invalid-personality.ll
@@ -0,0 +1,26 @@
+; RUN: not --crash llc < %s -wasm-enable-eh -exception-model=wasm -mattr=+exception-handling 2>&1 | FileCheck %s
+
+target triple = "wasm32-unknown-unknown"
+
+; Tests if the compiler correctly errors out when a function having EH pads does
+; not have a correct Wasm personality function.
+
+define void @test() personality ptr @invalid_personality {
+; CHECK: LLVM ERROR: Function 'test' does not have a correct Wasm personality function '__gxx_wasm_personality_v0'
+entry:
+ invoke void @foo()
+ to label %try.cont unwind label %catch.dispatch
+
+catch.dispatch: ; preds = %entry
+ %0 = catchswitch within none [label %catch.start] unwind to caller
+
+catch.start: ; preds = %catch.dispatch
+ %1 = catchpad within %0 [ptr null]
+ catchret from %1 to label %try.cont
+
+try.cont: ; preds = %catch, %entry
+ ret void
+}
+
+declare void @foo()
+declare i32 @invalid_personality(...)
Index: llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.cpp
===================================================================
--- llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.cpp
+++ llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.cpp
@@ -121,6 +121,7 @@
// and A's unwind destination is B and B's is C. When we visit B before A, we
// end up extracting C only out of B but not out of A.
const auto *EHInfo = MF.getWasmEHFuncInfo();
+ assert(EHInfo);
SmallVector<std::pair<WebAssemblyException *, WebAssemblyException *>>
UnwindWEVec;
for (auto *DomNode : depth_first(&MDT)) {
Index: llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
===================================================================
--- llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
+++ llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
@@ -1291,6 +1291,7 @@
// end_try
const auto *EHInfo = MF.getWasmEHFuncInfo();
+ assert(EHInfo);
SmallVector<const MachineBasicBlock *, 8> EHPadStack;
// For EH pads that have catch unwind mismatches, a map of <EH pad, its
// correct unwind destination>.
Index: llvm/lib/CodeGen/WasmEHPrepare.cpp
===================================================================
--- llvm/lib/CodeGen/WasmEHPrepare.cpp
+++ llvm/lib/CodeGen/WasmEHPrepare.cpp
@@ -80,6 +80,7 @@
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/WasmEHFuncInfo.h"
+#include "llvm/IR/EHPersonalities.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/IntrinsicsWebAssembly.h"
#include "llvm/InitializePasses.h"
@@ -209,6 +210,12 @@
if (CatchPads.empty() && CleanupPads.empty())
return false;
+ if (!F.hasPersonalityFn() ||
+ !isScopedEHPersonality(classifyEHPersonality(F.getPersonalityFn()))) {
+ report_fatal_error("Function '" + F.getName() +
+ "' does not have a correct Wasm personality function "
+ "'__gxx_wasm_personality_v0'");
+ }
assert(F.hasPersonalityFn() && "Personality function not found");
// __wasm_lpad_context global variable.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D152203.528601.patch
Type: text/x-patch
Size: 3365 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230605/650740c2/attachment.bin>
More information about the llvm-commits
mailing list