Skip to content

Phase 22: Extended Codegen — DWARF Debug Info, LTO, PIC - #41

Merged
MarcoFPO merged 2 commits into
mainfrom
feature/phase-22-extended-codegen
Mar 14, 2026
Merged

Phase 22: Extended Codegen — DWARF Debug Info, LTO, PIC#41
MarcoFPO merged 2 commits into
mainfrom
feature/phase-22-extended-codegen

Conversation

@MarcoFPO

Copy link
Copy Markdown
Owner

Summary

  • DWARF Debug Info Unterstützung (--debug-info Flag, DIBuilder)
  • LTO Support (--lto Flag, IPO Passes)
  • Bitcode Output-Format für LTO Pipeline
  • RelocMode::PIC für PIE-kompatibles Linking auf modernem Linux
  • MCP flux_build erweitert um debug_info/lto Parameter

Test plan

  • 7 neue Codegen-Tests (debug info, LTO, bitcode, kombiniert)
  • 3 neue CLI-Tests (build --debug-info, build --lto)
  • 356 Tests bestehen
  • Clippy fehlerfrei
  • CI grün

Closes #35

🤖 Generated with Claude Code

Marco Doehler and others added 2 commits March 14, 2026 19:55
- Add emit_debug_info and lto fields to CodegenConfig (both default false)
- DWARF debug info: module flags (Debug Info Version, Dwarf Version),
  DIBuilder with compile unit, subroutine type, and main subprogram
- LTO: module-level IPO passes (inlining, global DCE, constant merge,
  dead arg elimination, IPSCCP, merge functions, internalize)
- Add Bitcode variant to OutputFormat for LTO pipeline integration
- CLI: --debug-info and --lto flags on build subcommand
- MCP: debug_info and lto parameters on flux_build tool
- Tests: 7 new codegen tests, 3 new CLI tests covering all new features

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
@gemini-code-assist

Copy link
Copy Markdown

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

Dieses Pull Request erweitert die Codegen-Pipeline erheblich, indem es verbesserte Debugging-Funktionen, Leistungsoptimierungen und moderne Linking-Praktiken einführt. Es integriert die Unterstützung für DWARF-Debug-Informationen, was eine bessere Fehlersuche ermöglicht, und implementiert Link-Time Optimization (LTO) für eine effizientere Codegenerierung. Darüber hinaus wird ein Bitcode-Ausgabeformat hinzugefügt und die Erzeugung von Position-Independent Code (PIC) konfiguriert, um die Kompatibilität mit modernen Linux-Systemen zu verbessern.

Highlights

  • DWARF Debug Info Unterstützung: Es wurde Unterstützung für DWARF Debug Informationen hinzugefügt, aktivierbar über das --debug-info Flag, inklusive der Nutzung des DIBuilders.
  • LTO Support: Link-Time Optimization (LTO) wurde implementiert, nutzbar über das --lto Flag, und beinhaltet die Anwendung von IPO Passes.
  • Bitcode Output-Format: Ein neues Bitcode Output-Format wurde für die LTO Pipeline eingeführt.
  • RelocMode::PIC: Der RelocMode wurde auf PIC (Position-Independent Code) umgestellt, um PIE-kompatibles Linking auf modernen Linux-Systemen zu ermöglichen.
  • MCP flux_build Erweiterung: Der flux_build Befehl im MCP wurde um die Parameter debug_info und lto erweitert.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • flux-ftl/src/bin/flux-mcp.rs
    • Die Schema-Definition für den flux_build Befehl wurde um debug_info und lto Boolean-Parameter erweitert.
    • Die Argumente debug_info und lto werden nun aus den flux_build Befehlsargumenten extrahiert.
    • Die debug_info und lto Flags werden an die Codegen-Konfiguration übergeben.
  • flux-ftl/src/codegen.rs
    • Notwendige Inkwell-Module für Debug-Informationen und Pass-Manager wurden importiert.
    • Die CodegenConfig Struktur wurde um die Felder emit_debug_info und lto erweitert.
    • Ein neues OutputFormat::Bitcode wurde hinzugefügt.
    • Die Standardinitialisierung und die new_for_target Methode von CodegenConfig wurden aktualisiert, um emit_debug_info und lto auf false zu setzen.
    • Die Haupt-codegen Funktion wurde um die Aufrufe von setup_debug_info, finalize_debug_info und run_lto_passes erweitert, abhängig von den Konfigurationsflags.
    • Der RelocMode für die Erstellung der Target Machine wurde von Default auf PIC geändert.
    • Die Methode setup_debug_info wurde implementiert, um DWARF-Debug-Info-Modul-Flags zu setzen.
    • Die Methode finalize_debug_info wurde implementiert, um ein Debug-Subprogramm für die main-Funktion zu erstellen und die Debug-Informationen abzuschließen.
    • Die Methode run_lto_passes wurde implementiert, um verschiedene Modul-Level-LTO-Optimierungspässe anzuwenden.
    • Die Behandlung für OutputFormat::Bitcode wurde hinzugefügt, um LLVM-Bitcode in den Speicher zu schreiben.
    • Der RelocMode in der emit_machine_code Methode wurde von Default auf PIC geändert.
  • flux-ftl/src/main.rs
    • Die CLI-Befehlsdefinition für build wurde um die Argumente debug_info und lto erweitert.
    • Die Signatur der Funktion cmd_build wurde angepasst, um die neuen debug_info und lto Parameter zu akzeptieren.
    • Die debug_info und lto Flags werden nun an die Codegen-Konfiguration innerhalb von cmd_build übergeben.
    • Der match-Arm für den build-Befehl in der main-Funktion wurde aktualisiert, um die neuen debug_info und lto Argumente zu übergeben.
  • flux-ftl/tests/cli_tests.rs
    • Neue CLI-Tests wurden hinzugefügt, um die Funktionalität von build --debug-info, build --lto und die korrekte Anzeige dieser Flags in der build --help Ausgabe zu überprüfen.
  • flux-ftl/tests/codegen_tests.rs
    • Neue Codegen-Tests wurden hinzugefügt, um die Kompilierung mit Debug-Informationen zu überprüfen.
    • Ein Test wurde hinzugefügt, um die Erzeugung von Objektdateien mit Debug-Informationen zu validieren.
    • Tests wurden hinzugefügt, um die Kompilierung mit LTO zu überprüfen.
    • Ein Test wurde hinzugefügt, um die Erzeugung von Objektdateien mit LTO zu validieren.
    • Ein Test wurde hinzugefügt, um die korrekte Ausgabe von Bitcode zu überprüfen.
    • Ein kombinierter Test wurde hinzugefügt, um die Codegenerierung mit Debug-Informationen und LTO zu validieren.
Activity
  • Der Autor, MarcoFPO, hat diesen Pull Request erstellt.
  • Die PR-Beschreibung enthält eine detaillierte Zusammenfassung der Änderungen und einen Testplan.
  • Der Testplan listet 7 neue Codegen-Tests, 3 neue CLI-Tests, 356 bestandene Tests und fehlerfreie Clippy-Prüfungen auf.
  • Der CI-Status ist noch ausstehend ('CI grün').
  • Dieser Pull Request schließt das Issue Phase 22: Extended Codegen — DWARF Debug Info, LTO, PGO #35.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@MarcoFPO
MarcoFPO merged commit 5b65461 into main Mar 14, 2026
1 check passed
@MarcoFPO
MarcoFPO deleted the feature/phase-22-extended-codegen branch March 14, 2026 20:00

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

Dieser Pull Request erweitert den Codegen-Prozess um wichtige Funktionen: DWARF-Debuginformationen, Link-Time Optimization (LTO) und Position-Independent Code (PIC). Die Änderungen sind gut strukturiert und umfassen die notwendigen Anpassungen an der CLI, der Codegen-Konfiguration und der LLVM-Pass-Logik. Die neuen Funktionen werden durch umfangreiche Unit- und Integrationstests abgedeckt.
Meine Review-Kommentare enthalten zwei Vorschläge zur Verbesserung der Wartbarkeit und Robustheit des Codes: einer betrifft ein Refactoring zur Vermeidung einer langen Argumentenliste und der andere die Verwendung des tempfile-Crates in den Tests für eine zuverlässigere Handhabung temporärer Dateien.

Comment thread flux-ftl/src/main.rs
Comment on lines +207 to +208
#[allow(clippy::too_many_arguments)]
fn cmd_build(file: &str, output: Option<&str>, opt_level: u8, target_str: &str, bmc: bool, bmc_depth: u32, debug_info: bool, lto: bool) -> ExitCode {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Hallo! Um die Notwendigkeit von #[allow(clippy::too_many_arguments)] zu vermeiden und die Wartbarkeit zu verbessern, könnten Sie die Argumente für den build-Befehl in einer eigenen Struktur zusammenfassen. Dies würde die cmd_build-Funktion übersichtlicher machen und die Kopplung reduzieren.

Sie könnten eine BuildArgs-Struktur definieren und diese im Commands::Build-Enum verwenden:

#[derive(clap::Args, Debug)]
struct BuildArgs {
    file: String,
    #[arg(short, long)]
    output: Option<String>,
    #[arg(long, default_value = "2")]
    opt_level: u8,
    #[arg(long, default_value = "host")]
    target: String,
    #[arg(long)]
    bmc: bool,
    #[arg(long, default_value = "10")]
    bmc_depth: u32,
    /// Emit DWARF debug information
    #[arg(long)]
    debug_info: bool,
    /// Enable Link-Time Optimization
    #[arg(long)]
    lto: bool,
}

#[derive(clap::Subcommand, Debug)]
enum Commands {
    // ... andere Befehle
    Build(BuildArgs),
    // ...
}

Die cmd_build-Funktion würde dann eine Referenz auf BuildArgs entgegennehmen:

fn cmd_build(args: &BuildArgs) -> ExitCode {
    // Verwenden Sie hier args.file, args.opt_level etc.
    // ...
}

Und der Aufruf in main würde entsprechend angepasst werden:

// in main()
match cli.command {
    // ...
    Some(Commands::Build(ref build_args)) => cmd_build(build_args),
    // ...
}

Comment on lines +255 to +256
let out_path = std::env::temp_dir().join("flux_cli_test_dbg");
let _ = std::fs::remove_file(&out_path);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Hallo! Für eine robustere Handhabung von temporären Dateien in Tests empfehle ich die Verwendung des tempfile-Crates. NamedTempFile oder tempdir stellen sicher, dass die temporären Dateien auch im Falle eines Panics zuverlässig gelöscht werden, was die Tests stabiler macht.

Dies würde den Code vereinfachen und die manuelle Erstellung und Löschung von Dateipfaden überflüssig machen.

Ein Beispiel, wie dieser Test mit tempfile aussehen könnte:

use tempfile::NamedTempFile;

#[test]
fn build_with_debug_info() {
    let out_file = NamedTempFile::new().expect("failed to create temp file");
    let out_path = out_file.path();

    let output = flux_cmd()
        .args([
            "build",
            "testdata/hello_world.ftl",
            "--debug-info",
            "-o",
            out_path.to_str().unwrap(),
        ])
        .output()
        .expect("failed to execute");

    assert!(
        output.status.success(),
        "build --debug-info failed: {}",
        String::from_utf8_lossy(&output.stderr)
    );
    assert!(out_path.exists(), "executable was not created with --debug-info");

    // Run the built executable to verify it still works
    let run_output = Command::new(&out_path)
        .output()
        .expect("failed to run built binary");
    let stdout = String::from_utf8_lossy(&run_output.stdout);
    assert_eq!(stdout, "Hello World\n");

    // out_file und die zugehörige temporäre Datei werden hier automatisch entfernt.
}

Diese Empfehlung gilt auch für den build_with_lto-Test.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Phase 22: Extended Codegen — DWARF Debug Info, LTO, PGO

1 participant