@@ -8,6 +8,7 @@ use std::path::Path;
8
8
use std:: str;
9
9
use std:: thread;
10
10
use wasmtime:: * ;
11
+ use wast:: core:: { EncodeOptions , GenerateDwarf } ;
11
12
use wast:: lexer:: Lexer ;
12
13
use wast:: parser:: { self , ParseBuffer } ;
13
14
use wast:: { QuoteWat , Wast , WastArg , WastDirective , WastExecute , WastInvoke , WastRet , Wat } ;
@@ -24,6 +25,7 @@ pub struct WastContext<T: 'static> {
24
25
component_linker : component:: Linker < T > ,
25
26
pub ( crate ) store : Store < T > ,
26
27
pub ( crate ) async_runtime : Option < tokio:: runtime:: Runtime > ,
28
+ generate_dwarf : bool ,
27
29
}
28
30
29
31
enum Outcome < T = Results > {
@@ -118,6 +120,7 @@ where
118
120
} else {
119
121
None
120
122
} ,
123
+ generate_dwarf : true ,
121
124
}
122
125
}
123
126
@@ -187,20 +190,25 @@ where
187
190
}
188
191
189
192
/// Perform the action portion of a command.
190
- fn perform_execute ( & mut self , exec : WastExecute < ' _ > ) -> Result < Outcome > {
193
+ fn perform_execute (
194
+ & mut self ,
195
+ exec : WastExecute < ' _ > ,
196
+ filename : & str ,
197
+ wast : & str ,
198
+ ) -> Result < Outcome > {
191
199
match exec {
192
200
WastExecute :: Invoke ( invoke) => self . perform_invoke ( invoke) ,
193
- WastExecute :: Wat ( module) => {
194
- Ok ( match self . module_definition ( QuoteWat :: Wat ( module) ) ? {
201
+ WastExecute :: Wat ( module) => Ok (
202
+ match self . module_definition ( QuoteWat :: Wat ( module) , filename , wast ) ? {
195
203
( _, ModuleKind :: Core ( module) ) => self
196
204
. instantiate_module ( & module) ?
197
205
. map ( |_| Results :: Core ( Vec :: new ( ) ) ) ,
198
206
#[ cfg( feature = "component-model" ) ]
199
207
( _, ModuleKind :: Component ( component) ) => self
200
208
. instantiate_component ( & component) ?
201
209
. map ( |_| Results :: Component ( Vec :: new ( ) ) ) ,
202
- } )
203
- }
210
+ } ,
211
+ ) ,
204
212
WastExecute :: Get { module, global, .. } => self . get ( module. map ( |s| s. name ( ) ) , global) ,
205
213
}
206
214
}
@@ -325,14 +333,25 @@ where
325
333
fn module_definition < ' a > (
326
334
& mut self ,
327
335
mut wat : QuoteWat < ' a > ,
336
+ filename : & str ,
337
+ wast : & str ,
328
338
) -> Result < ( Option < & ' a str > , ModuleKind ) > {
329
339
let ( is_module, name) = match & wat {
330
340
QuoteWat :: Wat ( Wat :: Module ( m) ) => ( true , m. id ) ,
331
341
QuoteWat :: QuoteModule ( ..) => ( true , None ) ,
332
342
QuoteWat :: Wat ( Wat :: Component ( m) ) => ( false , m. id ) ,
333
343
QuoteWat :: QuoteComponent ( ..) => ( false , None ) ,
334
344
} ;
335
- let bytes = wat. encode ( ) ?;
345
+ let bytes = match & mut wat {
346
+ QuoteWat :: Wat ( wat) => {
347
+ let mut opts = EncodeOptions :: new ( ) ;
348
+ if self . generate_dwarf {
349
+ opts. dwarf ( filename. as_ref ( ) , wast, GenerateDwarf :: Lines ) ;
350
+ }
351
+ opts. encode_wat ( wat) ?
352
+ }
353
+ _ => wat. encode ( ) ?,
354
+ } ;
336
355
if is_module {
337
356
let module = Module :: new ( self . store . engine ( ) , & bytes) ?;
338
357
Ok ( ( name. map ( |n| n. name ( ) ) , ModuleKind :: Core ( module) ) )
@@ -451,7 +470,8 @@ where
451
470
452
471
let mut lexer = Lexer :: new ( wast) ;
453
472
lexer. allow_confusing_unicode ( filename. ends_with ( "names.wast" ) ) ;
454
- let buf = ParseBuffer :: new_with_lexer ( lexer) . map_err ( adjust_wast) ?;
473
+ let mut buf = ParseBuffer :: new_with_lexer ( lexer) . map_err ( adjust_wast) ?;
474
+ buf. track_instr_spans ( self . generate_dwarf ) ;
455
475
let ast = parser:: parse :: < Wast > ( & buf) . map_err ( adjust_wast) ?;
456
476
457
477
self . run_directives ( ast. directives , filename, wast)
@@ -506,11 +526,11 @@ where
506
526
507
527
match directive {
508
528
Module ( module) => {
509
- let ( name, module) = self . module_definition ( module) ?;
529
+ let ( name, module) = self . module_definition ( module, filename , wast ) ?;
510
530
self . module ( name, & module) ?;
511
531
}
512
532
ModuleDefinition ( module) => {
513
- let ( name, module) = self . module_definition ( module) ?;
533
+ let ( name, module) = self . module_definition ( module, filename , wast ) ?;
514
534
if let Some ( name) = name {
515
535
self . modules . insert ( name. to_string ( ) , module. clone ( ) ) ;
516
536
}
@@ -541,15 +561,15 @@ where
541
561
exec,
542
562
results,
543
563
} => {
544
- let result = self . perform_execute ( exec) ?;
564
+ let result = self . perform_execute ( exec, filename , wast ) ?;
545
565
self . assert_return ( result, & results) ?;
546
566
}
547
567
AssertTrap {
548
568
span : _,
549
569
exec,
550
570
message,
551
571
} => {
552
- let result = self . perform_execute ( exec) ?;
572
+ let result = self . perform_execute ( exec, filename , wast ) ?;
553
573
self . assert_trap ( result, message) ?;
554
574
}
555
575
AssertExhaustion {
@@ -565,7 +585,7 @@ where
565
585
module,
566
586
message,
567
587
} => {
568
- let err = match self . module_definition ( module) {
588
+ let err = match self . module_definition ( module, filename , wast ) {
569
589
Ok ( _) => bail ! ( "expected module to fail to build" ) ,
570
590
Err ( e) => e,
571
591
} ;
@@ -583,7 +603,7 @@ where
583
603
span : _,
584
604
message : _,
585
605
} => {
586
- if let Ok ( _) = self . module_definition ( module) {
606
+ if let Ok ( _) = self . module_definition ( module, filename , wast ) {
587
607
bail ! ( "expected malformed module to fail to instantiate" ) ;
588
608
}
589
609
}
@@ -592,7 +612,8 @@ where
592
612
module,
593
613
message,
594
614
} => {
595
- let ( name, module) = self . module_definition ( QuoteWat :: Wat ( module) ) ?;
615
+ let ( name, module) =
616
+ self . module_definition ( QuoteWat :: Wat ( module) , filename, wast) ?;
596
617
let err = match self . module ( name, & module) {
597
618
Ok ( _) => bail ! ( "expected module to fail to link" ) ,
598
619
Err ( e) => e,
@@ -632,6 +653,7 @@ where
632
653
. build ( )
633
654
. unwrap ( )
634
655
} ) ,
656
+ generate_dwarf : self . generate_dwarf ,
635
657
} ;
636
658
let name = thread. name . name ( ) ;
637
659
let child =
@@ -662,6 +684,13 @@ where
662
684
std:: fs:: read ( path) . with_context ( || format ! ( "failed to read `{}`" , path. display( ) ) ) ?;
663
685
self . run_buffer ( path. to_str ( ) . unwrap ( ) , & bytes)
664
686
}
687
+
688
+ /// Whether or not to generate DWARF debugging information in custom
689
+ /// sections in modules being tested.
690
+ pub fn generate_dwarf ( & mut self , enable : bool ) -> & mut Self {
691
+ self . generate_dwarf = enable;
692
+ self
693
+ }
665
694
}
666
695
667
696
fn is_matching_assert_invalid_error_message ( test : & str , expected : & str , actual : & str ) -> bool {
0 commit comments