This commit is contained in:
2026-02-19 16:49:25 -05:00
parent d147dccbb4
commit 9951907f10
4 changed files with 816 additions and 1 deletions

178
scripts/build.simple.c.ps1 Normal file
View File

@@ -0,0 +1,178 @@
$path_root = split-path -Path $PSScriptRoot -Parent
$misc = join-path $PSScriptRoot 'helpers/misc.ps1'
. $misc
$path_toolchain = join-path $path_root 'toolchain'
$path_rad = join-path $path_toolchain 'rad'
# --- Toolchain Executable Paths ---
$compiler = 'clang'
$optimizer = 'opt.exe'
$linker = 'lld-link.exe'
$archiver = 'llvm-lib.exe'
$radbin = join-path $path_rad 'radbin.exe'
$radlink = join-path $path_rad 'radlink.exe'
# https://clang.llvm.org/docs/ClangCommandLineReference.html
$flag_all_c = @('-x', 'c')
$flag_c11 = '-std=c11'
$flag_c23 = '-std=c23'
$flag_all_cpp = '-x c++'
$flag_charset_utf8 = '-fexec-charset=utf-8'
$flag_compile = '-c'
$flag_color_diagnostics = '-fcolor-diagnostics'
$flag_no_builtin_includes = '-nobuiltininc'
$flag_no_color_diagnostics = '-fno-color-diagnostics'
$flag_debug = '-g'
$flag_debug_codeview = '-gcodeview'
$flag_define = '-D'
$flag_emit_llvm = '-emit-llvm'
$flag_stop_after_gen = '-S'
$flag_exceptions_disabled = '-fno-exceptions'
$flag_rtti_disabled = '-fno-rtti'
$flag_diagnostics_absolute_paths = '-fdiagnostics-absolute-paths'
$flag_preprocess = '-E'
$flag_include = '-I'
$flag_section_data = '-fdata-sections'
$flag_section_functions = '-ffunction-sections'
$flag_library = '-l'
$flag_library_path = '-L'
$flag_linker = '-Wl,'
$flag_link_dll = '/DLL'
$flag_link_mapfile = '/MAP:'
$flag_link_optimize_references = '/OPT:REF'
$flag_link_win_subsystem_console = '/SUBSYSTEM:CONSOLE'
$flag_link_win_subsystem_windows = '/SUBSYSTEM:WINDOWS'
$flag_link_win_machine_32 = '/MACHINE:X86'
$flag_link_win_machine_64 = '/MACHINE:X64'
$flag_link_win_debug = '/DEBUG'
$flag_link_win_pdb = '/PDB:'
$flag_link_win_path_output = '/OUT:'
$flag_link_no_incremental = '/INCREMENTAL:NO'
$flag_no_optimization = '-O0'
$flag_optimize_fast = '-O2'
$flag_optimize_size = '-O1'
$flag_optimize_intrinsics = '-Oi'
$flag_path_output = '-o'
$flag_preprocess_non_intergrated = '-no-integrated-cpp'
$flag_profiling_debug = '-fdebug-info-for-profiling'
$flag_set_stack_size = '-stack='
$flag_syntax_only = '-fsyntax-only'
$flag_target_arch = '-target'
$flag_time_trace = '-ftime-trace'
$flag_verbose = '-v'
$flag_wall = '-Wall'
$flag_warning = '-W'
$flag_warnings_as_errors = '-Werror'
$flag_nologo = '/nologo'
$path_build = join-path $path_root 'build'
if ( -not(test-path -Path $path_build) ) {
new-item -ItemType Directory -Path $path_build
}
push-location $path_build
# --- File Paths ---
$unit_name = "simple"
$unit_source = join-path $path_root "code\C\$unit_name.c"
$ir_unoptimized = join-path $path_build "$unit_name.ll"
$ir_optimized = join-path $path_build "$unit_name.opt.ll"
$object = join-path $path_build "$unit_name.obj"
$binary = join-path $path_build "$unit_name.exe"
$pdb = join-path $path_build "$unit_name.pdb"
$map = join-path $path_build "$unit_name.map"
# --- Stage 1: Compile C to LLVM IR ---
write-host "Stage 1: Compiling C to LLVM IR"
$compiler_args = @()
# $compiler_args += $flag_stop_after_gen
# $compiler_args += $flag_emit_llvm
$compiler_args += ($flag_define + 'BUILD_DEBUG=1')
$compiler_args += $flag_debug
# $compiler_args += $flag_debug_codeview
$compiler_args += $flag_wall
# $compiler_args += $flag_charset_utf8
$compiler_args += $flag_c23
$compiler_args += $flag_no_optimization
# $compiler_args += $flag_no_builtin_includes
$compiler_args += $flag_diagnostics_absolute_paths
$compiler_args += $flag_rtti_disabled
$compiler_args += $flag_exceptions_disabled
$compiler_args += ($flag_include + $path_root)
$compiler_args += $flag_compile
$compiler_args += $flag_path_output, $object
$compiler_args += $unit_source
$compiler_args | ForEach-Object { Write-Host $_ }
$stage1_time = Measure-Command { & $compiler $compiler_args }
write-host "Compilation took $($stage1_time.TotalMilliseconds)ms"
# write-host "IR generation took $($stage1_time.TotalMilliseconds)ms"
write-host
# --- Stage 2: Manually Optimize LLVM IR ---
if ($false) {
write-host "Manually Optimizing LLVM IR with 'opt'"
$optimization_passes = @(
'-sroa', # Scalar Replacement Of Aggregates
'-early-cse', # Early Common Subexpression Elimination
'-instcombine' # Instruction Combining
)
$optimizer_args = @(
$optimization_passes,
$ir_unoptimized,
$flag_path_output,
$ir_optimized
)
$optimizer_args | ForEach-Object { Write-Host $_ }
$stage2_time = Measure-Command { & $optimizer $optimizer_args }
write-host "Optimization took $($stage2_time.TotalMilliseconds)ms"
write-hosts
write-host "Compiling LLVM IR to Object File with 'clang'"
$ir_to_obj_args = @()
$ir_to_obj_args += $flag_compile
$ir_to_obj_args += $flag_path_output, $object
$ir_to_obj_args += $ir_optimized
$ir_to_obj_args | ForEach-Object { Write-Host $_ }
$stage3_time = Measure-Command { & $compiler $ir_to_obj_args }
write-host "Object file generation took $($stage3_time.TotalMilliseconds)ms"
write-host
}
if ($true) {
# write-host "Linking with lld-link"
$linker_args = @()
$linker_args += $flag_nologo
$linker_args += $flag_link_win_machine_64
$linker_args += $flag_link_no_incremental
$linker_args += ($flag_link_win_path_output + $binary)
$linker_args += "$flag_link_win_debug"
$linker_args += $flag_link_win_pdb + $pdb
$linker_args += $flag_link_mapfile + $map
$linker_args += $flag_link_win_subsystem_console
$linker_args += $object
# Diagnoistc print for the args
$linker_args | ForEach-Object { Write-Host $_ }
$linking_time = Measure-Command { & $linker $linker_args }
write-host "Linking took $($linking_time.TotalMilliseconds)ms"
write-host
}
if ($false) {
write-host "Dumping Debug Info"
$rbin_out = '--out:'
$rbin_dump = '--dump'
$rdi = join-path $path_build "$unit_name.rdi"
$rdi_listing = join-path $path_build "$unit_name.rdi.list"
$nargs = @($pdb, ($rbin_out + $rdi))
& $radbin $nargs
$nargs = @($rbin_dump, $rdi)
$dump = & $radbin $nargs
$dump > $rdi_listing
}
Pop-Location

67
scripts/helpers/misc.ps1 Normal file
View File

@@ -0,0 +1,67 @@
function clone-gitrepo { param( [string] $path, [string] $url )
if (test-path $path) {
# git -C $path pull
}
else {
Write-Host "Cloning $url ..."
git clone --recursive $url $path
}
}
function Update-GitRepo
{
param( [string] $path, [string] $url, [string] $build_command )
if ( $build_command -eq $null ) {
write-host "Attempted to call Update-GitRepo without build_command specified"
return
}
$repo_name = $url.Split('/')[-1].Replace('.git', '')
$last_built_commit = join-path $path_build "last_built_commit_$repo_name.txt"
if ( -not(test-path -Path $path))
{
write-host "Cloining repo from $url to $path"
git clone $url $path
write-host "Building $url"
push-location $path
& "$build_command"
pop-location
git -C $path rev-parse HEAD | out-file $last_built_commit
$script:binaries_dirty = $true
write-host
return
}
git -C $path fetch
$latest_commit_hash = git -C $path rev-parse '@{u}'
$last_built_hash = if (Test-Path $last_built_commit) { Get-Content $last_built_commit } else { "" }
if ( $latest_commit_hash -eq $last_built_hash ) {
write-host
return
}
write-host "Build out of date for: $path, updating"
write-host 'Pulling...'
git -C $path pull
write-host "Building $url"
push-location $path
& $build_command
pop-location
$latest_commit_hash | out-file $last_built_commit
$script:binaries_dirty = $true
write-host
}
function verify-path { param( $path )
if (test-path $path) {return $true}
new-item -ItemType Directory -Path $path
return $false
}