# REQUIRES: aarch64 # Generate a large test case and check that the output is deterministic. # RUN: %python %s %t.s %t.proftext # RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %t.s -o %t.o # RUN: llvm-profdata merge %t.proftext -o %t.profdata # RUN: %no-fatal-warnings-lld -arch arm64 -lSystem -e _main --icf=all -o - %t.o --irpgo-profile-sort=%t.profdata --compression-sort-startup-functions --compression-sort=both | llvm-nm --numeric-sort --format=just-symbols - > %t.order1.txt # RUN: %no-fatal-warnings-lld -arch arm64 -lSystem -e _main --icf=all -o - %t.o --irpgo-profile-sort=%t.profdata --compression-sort-startup-functions --compression-sort=both | llvm-nm --numeric-sort --format=just-symbols - > %t.order2.txt # RUN: diff %t.order1.txt %t.order2.txt # RUN: %lld -arch arm64 -lSystem -e _main --icf=all -o - %t.o --irpgo-profile=%t.profdata --bp-startup-sort=function --bp-compression-sort-startup-functions --bp-compression-sort=both | llvm-nm --numeric-sort --format=just-symbols - > %t.order1.txt # RUN: %lld -arch arm64 -lSystem -e _main --icf=all -o - %t.o --irpgo-profile=%t.profdata --bp-startup-sort=function --bp-compression-sort-startup-functions --bp-compression-sort=both | llvm-nm --numeric-sort --format=just-symbols - > %t.order2.txt # RUN: diff %t.order1.txt %t.order2.txt import random import sys assembly_filepath = sys.argv[1] proftext_filepath = sys.argv[2] random.seed(1234) num_functions = 1000 num_data = 100 num_traces = 10 function_names = [f"f{n}" for n in range(num_functions)] data_names = [f"d{n}" for n in range(num_data)] profiled_functions = function_names[: int(num_functions / 2)] function_contents = [ f""" {name}: add w0, w0, #{i % 4096} add w1, w1, #{i % 10} add w2, w0, #{i % 20} adrp x3, {name}@PAGE ret """ for i, name in enumerate(function_names) ] data_contents = [ f""" {name}: .ascii "s{i % 2}-{i % 3}-{i % 5}" .xword {name} """ for i, name in enumerate(data_names) ] trace_contents = [ f""" # Weight 1 {", ".join(random.sample(profiled_functions, len(profiled_functions)))} """ for i in range(num_traces) ] profile_contents = [ f""" {name} # Func Hash: {i} # Num Counters: 1 # Counter Values: 1 """ for i, name in enumerate(profiled_functions) ] with open(assembly_filepath, "w") as f: f.write( f""" .text .globl _main _main: ret {"".join(function_contents)} .data {"".join(data_contents)} .subsections_via_symbols """ ) with open(proftext_filepath, "w") as f: f.write( f""" :ir :temporal_prof_traces # Num Traces {num_traces} # Trace Stream Size: {num_traces} {"".join(trace_contents)} {"".join(profile_contents)} """ )