1*33224b22SAlex Crichton //! extra-files = ['dwarf_generic_satellite.cc']
2*33224b22SAlex Crichton 
3*33224b22SAlex Crichton // clang-format off
4*33224b22SAlex Crichton // clang -o generic.wasm -target wasm32-unknown-wasip1 -g generic.cpp generic-satellite.cpp
5*33224b22SAlex Crichton // clang-format on
6*33224b22SAlex Crichton //
7*33224b22SAlex Crichton #include "dwarf_generic.h"
8*33224b22SAlex Crichton 
MainDefinedFunction()9*33224b22SAlex Crichton int SomeClass::MainDefinedFunction() {
10*33224b22SAlex Crichton   int x = HIDE_FROM_CHECKER(1);
11*33224b22SAlex Crichton   debug_break();
12*33224b22SAlex Crichton   int y = SatelliteFunction(x);
13*33224b22SAlex Crichton   return x + y;
14*33224b22SAlex Crichton }
15*33224b22SAlex Crichton 
TestClassDefinitionSpreadAcrossCompileUnits()16*33224b22SAlex Crichton int TestClassDefinitionSpreadAcrossCompileUnits() {
17*33224b22SAlex Crichton   int result = SomeClass::MainDefinedFunction();
18*33224b22SAlex Crichton   return result != 3 ? 1 : 0;
19*33224b22SAlex Crichton }
20*33224b22SAlex Crichton 
21*33224b22SAlex Crichton struct BaseType {
22*33224b22SAlex Crichton   int BaseValue = 1;
23*33224b22SAlex Crichton };
24*33224b22SAlex Crichton struct DerivedType : BaseType {
25*33224b22SAlex Crichton   long long DerivedValue = 2;
26*33224b22SAlex Crichton 
InstanceMethodDerivedType27*33224b22SAlex Crichton   int InstanceMethod() {
28*33224b22SAlex Crichton     debug_break();
29*33224b22SAlex Crichton     return BaseValue + DerivedValue;
30*33224b22SAlex Crichton   }
31*33224b22SAlex Crichton 
ConstInstanceMethodDerivedType32*33224b22SAlex Crichton   int ConstInstanceMethod() const {
33*33224b22SAlex Crichton     debug_break();
34*33224b22SAlex Crichton     return BaseValue + DerivedValue;
35*33224b22SAlex Crichton   }
36*33224b22SAlex Crichton };
37*33224b22SAlex Crichton 
TestInheritance()38*33224b22SAlex Crichton int TestInheritance() {
39*33224b22SAlex Crichton   DerivedType inst;
40*33224b22SAlex Crichton   debug_break();
41*33224b22SAlex Crichton   return inst.BaseValue + inst.DerivedValue != 3 ? 1 : 0;
42*33224b22SAlex Crichton }
43*33224b22SAlex Crichton 
TestInstanceMethod()44*33224b22SAlex Crichton int TestInstanceMethod() {
45*33224b22SAlex Crichton   debug_break();
46*33224b22SAlex Crichton 
47*33224b22SAlex Crichton   DerivedType inst;
48*33224b22SAlex Crichton   inst.BaseValue = 2;
49*33224b22SAlex Crichton   inst.DerivedValue = 4;
50*33224b22SAlex Crichton   if (inst.InstanceMethod() != 6)
51*33224b22SAlex Crichton     return 1;
52*33224b22SAlex Crichton 
53*33224b22SAlex Crichton   inst.BaseValue++;
54*33224b22SAlex Crichton   volatile DerivedType volatileInst = inst;
55*33224b22SAlex Crichton   if (inst.InstanceMethod() != 7)
56*33224b22SAlex Crichton     return 2;
57*33224b22SAlex Crichton 
58*33224b22SAlex Crichton   inst.DerivedValue++;
59*33224b22SAlex Crichton   const DerivedType constInst = inst;
60*33224b22SAlex Crichton   if (inst.ConstInstanceMethod() != 8)
61*33224b22SAlex Crichton     return 3;
62*33224b22SAlex Crichton 
63*33224b22SAlex Crichton   return 0;
64*33224b22SAlex Crichton }
65*33224b22SAlex Crichton 
66*33224b22SAlex Crichton __asm("FunctionWithoutWasmDWARF:\n"
67*33224b22SAlex Crichton       ".global	FunctionWithoutWasmDWARF\n"
68*33224b22SAlex Crichton       ".functype	FunctionWithoutWasmDWARF (i32, i32) -> (i32)\n"
69*33224b22SAlex Crichton       "local.get	0\n"
70*33224b22SAlex Crichton       "local.get	1\n"
71*33224b22SAlex Crichton       "i32.div_u\n"
72*33224b22SAlex Crichton       "end_function\n");
73*33224b22SAlex Crichton extern "C" int FunctionWithoutWasmDWARF(int a, int b);
74*33224b22SAlex Crichton 
TestFunctionWithoutWasmDWARF()75*33224b22SAlex Crichton int TestFunctionWithoutWasmDWARF() {
76*33224b22SAlex Crichton   debug_break();
77*33224b22SAlex Crichton   int x = FunctionWithoutWasmDWARF(9, 10);
78*33224b22SAlex Crichton   return x == 0 ? 0 : 4;
79*33224b22SAlex Crichton }
80*33224b22SAlex Crichton 
main()81*33224b22SAlex Crichton int main() {
82*33224b22SAlex Crichton   int exitCode = 0;
83*33224b22SAlex Crichton   exitCode += TestClassDefinitionSpreadAcrossCompileUnits();
84*33224b22SAlex Crichton   exitCode += TestInheritance();
85*33224b22SAlex Crichton   exitCode += TestInstanceMethod();
86*33224b22SAlex Crichton   exitCode += TestFunctionWithoutWasmDWARF();
87*33224b22SAlex Crichton   return exitCode;
88*33224b22SAlex Crichton }
89