Skip to content

Instantly share code, notes, and snippets.

View certik's full-sized avatar

Ondřej Čertík certik

View GitHub Profile

Design: Explicit Self Argument in Call Args

Problem Statement

In the current LFortran ASR, type-bound procedure calls with PASS semantics store the self/pass argument separately from the explicit call arguments:

SubroutineCall(name, original_name, args, dt, strict_bounds_checking)
FunctionCall(name, original_name, args, type, value, dt)

Switching to Byte-Based Strides in LFortran's Array Descriptor

Background

LFortran's internal array descriptor is designed to be compatible with CFI_cdesc_t (the ISO_Fortran_binding descriptor), but it currently stores strides in element units rather than byte units. This mismatch requires conversion at every bind(c) boundary.

This document summarizes why switching to byte-based strides is the right move.

Plan: Align LFortran Descriptor with Fortran Standard / Flang

Problem

LFortran's array descriptor (CFI_cdesc_t) diverges from the Fortran standard and from both GFortran and Flang in several ways. This causes ABI incompatibility with any C code compiled against a standard-compliant ISO_Fortran_binding.h.

Current LFortran descriptor (48 + rank×24 bytes):

@certik
certik / plan.md
Created March 12, 2026 23:11
LFortran Quadruple Precision Plan

Plan for Implementing Quadruple Precision (REAL(KIND=16)) in LFortran

Overview

LFortran will support full IEEE 754 binary128 quadruple precision (REAL(KIND=16) and COMPLEX(KIND=16)) using LLVM’s native fp128 type for all arithmetic and most operations. This provides exact binary128 semantics (15-bit exponent, 113-bit mantissa) on every target LLVM supports.

Transcendental intrinsics will be provided through an optional, thin runtime wrapper that can link to libquadmath (or the platform’s _Float128 / long-double functions when available). Basic operations, array intrinsics, and most language features will work with zero extra dependencies.

The implementation is designed to be incremental, portable, and consistent with existing LFortran infrastructure (ASR → LLVM IR lowering, runtime library, multiple backends, JIT).

#!/usr/bin/env python3
"""
Compute PR-per-person statistics from LFortran release notes.
Usage:
python pr_stats.py [VERSION]
VERSION e.g. "0.61.0" or "v0.61.0". Omit for the latest release.
Looks up each contributor's real name via the GitHub API.
module ring_mod
! this module isolates all of the modulo ring arithmetic associated
! with the Euler conjecture search code.
implicit none
private
public :: ik, ring_modulo_t, jloop, kloop, lloop
(gfortran) ~/repos/fpm(main)$ fpm --compiler=$FC test
+ mkdir -p build/dependencies
Initialized empty Git repository in /Users/ondrej/repos/fpm/build/dependencies/toml-f/.git/
remote: Enumerating objects: 289, done.
remote: Counting objects: 100% (289/289), done.
remote: Compressing objects: 100% (236/236), done.
remote: Total 289 (delta 54), reused 171 (delta 20), pack-reused 0 (from 0)
Receiving objects: 100% (289/289), 463.43 KiB | 2.09 MiB/s, done.
Resolving deltas: 100% (54/54), done.
From https://github.com/toml-f/toml-f
~/repos/fpm(lf-21)$ fpm --compiler=$FC test --flag "--cpp --realloc-lhs-arrays --use-loop-variable-after-loop"
Project is up to date
<INFO>TEST help SUBCOMMAND STARTED
<INFO>check fpm for NAME SYNOPSIS DESCRIPTION
STOP
<INFO>CMD=build/lfortran_B32920A010424AF1/test//../app/fpm help fpm >fpm_scratch_help.txt EXITSTAT=0 CMDSTAT=0 MESSAGE=
<INFO>have completed 4 tests
<INFO>check new for NAME SYNOPSIS DESCRIPTION
STOP
<INFO>CMD=build/lfortran_B32920A010424AF1/test//../app/fpm help new >fpm_scratch_help.txt EXITSTAT=0 CMDSTAT=0 MESSAGE=
@certik
certik / a.ll
Created September 11, 2025 14:48
; ModuleID = 'a.cpp'
source_filename = "a.cpp"
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128-Fn32"
target triple = "arm64-apple-macosx15.0.0"
%"class.std::__1::unique_ptr" = type { %"class.std::__1::__compressed_pair" }
%"class.std::__1::__compressed_pair" = type { %"struct.std::__1::__compressed_pair_elem" }
%"struct.std::__1::__compressed_pair_elem" = type { ptr }
%"struct.std::__1::__value_init_tag" = type { i8 }
$ ./chess
Choose your color (White/Black):
White
You play as White.
+---+---+---+---+---+---+---+---+
8 | r | n | b | q | k | b | n | r |
+---+---+---+---+---+---+---+---+
7 | p | p | p | p | p | p | p | p |
+---+---+---+---+---+---+---+---+
6 | | | | | | | | |