|
| 1 | +;; Test if the callee_type metadata attached to indirect call sites adhere to the expected format. |
| 2 | + |
| 3 | +; RUN: not opt -passes=verify < %s 2>&1 | FileCheck %s |
| 4 | +define i32 @_Z13call_indirectPFicEc(ptr %func, i8 signext %x) !type !0 { |
| 5 | +entry: |
| 6 | + %func.addr = alloca ptr, align 8 |
| 7 | + %x.addr = alloca i8, align 1 |
| 8 | + store ptr %func, ptr %func.addr, align 8 |
| 9 | + store i8 %x, ptr %x.addr, align 1 |
| 10 | + %fptr = load ptr, ptr %func.addr, align 8 |
| 11 | + %fptr_val = load i8, ptr %x.addr, align 1 |
| 12 | + ;; No failures expected for this callee_type metdata. |
| 13 | + %call = call i32 %fptr(i8 signext %fptr_val), !callee_type !1 |
| 14 | + ;; callee_type metdata is a type metadata instead of a list of type metadata nodes. |
| 15 | + ; CHECK: The callee_type metadata must be a list of type metadata nodes |
| 16 | + %call2 = call i32 %fptr(i8 signext %fptr_val), !callee_type !0 |
| 17 | + ;; callee_type metdata is a list of non "gneralized" type metadata. |
| 18 | + ; CHECK: Only generalized type metadata can be part of the callee_type metadata list |
| 19 | + %call3 = call i32 %fptr(i8 signext %fptr_val), !callee_type !4 |
| 20 | + ret i32 %call |
| 21 | +} |
| 22 | + |
| 23 | +!0 = !{i64 0, !"_ZTSFiPvcE.generalized"} |
| 24 | +!1 = !{!2} |
| 25 | +!2 = !{i64 0, !"_ZTSFicE.generalized"} |
| 26 | +!3 = !{i64 0, !"_ZTSFicE"} |
| 27 | +!4 = !{!3} |
| 28 | +; CHECK-NEXT: error: input module is broken! |
0 commit comments