blob: 25fe76f8da57a71234693b6b8fc7bfe5a8651568 [file] [log] [blame]
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// This test verifies that assembly snapshot does not contain local labels.
// (labels starting with 'L').
import 'dart:io';
import 'package:expect/expect.dart';
import 'package:path/path.dart' as path;
import 'use_flag_test_helper.dart';
main(List<String> args) async {
if (!isAOTRuntime) {
return; // Running in JIT: AOT binaries not available.
}
if (Platform.isAndroid) {
return; // SDK tree not available on the test device.
}
// These are the tools we need to be available to run on a given platform:
if (!File(platformDill).existsSync()) {
throw "Cannot run test as $platformDill does not exist";
}
if (!await testExecutable(genSnapshot)) {
throw "Cannot run test as $genSnapshot not available";
}
await withTempDir('no-local-labels-test', (String tempDir) async {
final script = path.join(tempDir, 'program.dart');
final scriptDill = path.join(tempDir, 'program.dill');
await File(script).writeAsString('''
class Local {
@pragma('vm:never-inline')
void foo() {
}
@pragma('vm:never-inline')
void bar() {
}
}
void main(List<String> args) {
Local()..foo()..bar();
}
''');
// Compile script to Kernel IR.
await run(genKernel, <String>[
'--aot',
'--platform=$platformDill',
'-o',
scriptDill,
script,
]);
if (Platform.isWindows) {
return; // No assembly generation on Windows.
}
final assembly = path.join(tempDir, 'program.S');
await run(genSnapshot, <String>[
'--snapshot-kind=app-aot-assembly',
'--assembly=$assembly',
scriptDill,
]);
final localLabelRe = RegExp(r'^L[a-zA-Z0-9_\.$]*:$', multiLine: true);
final match = localLabelRe.firstMatch(await File(assembly).readAsString());
if (match != null) {
Expect.isTrue(false, 'unexpected local label found ${match[0]!}');
}
});
}