| ▲ | pizlonator 10 hours ago | ||||||||||||||||||||||||||||||||||||||||
> like the union of different languages No. Here are two good ways to think about it: 1. It's the C programming language represented as SSA form and with some of the UB in the C spec given a strict definition. 2. It's a low level representation. It's suitable for lowering other languages to. Theoretically, you could lower anything to it since it's Turing-complete. Practically, it's only suitable for lowering sufficiently statically-typed languages to it. > Every tool and component in the LLVM universe had its own set of rules and requirements for the LLVM IR that it understands. Definitely not. All of those tools have a shared understanding of what happens when LLVM executes on a particular target and data layout. The only flexibility is that you're allowed to alter some of the semantics on a per-target and per-datalayout basis. Targets have limited power to change semantics (for example, they cannot change what "add" means). Data layout is its own IR, and that IR has its own semantics - and everything that deals with LLVM IR has to deal with the data layout "IR" and has to understand it the same way. > My bewilderment about LLVM IR not being stable between versions had given way to understanding that this freedom was necessary. Not parsing this statement very well, but bottom line: LLVM IR is remarkably stable because of Hyrum's law within the LLVM project's repository. There's a TON of code in LLVM that deals with LLVM IR. So, it's super hard to change even the smallest things about how LLVM IR works or what it means, because any such change would surely break at least one of the many things in the LLVM project's repo. | |||||||||||||||||||||||||||||||||||||||||
| ▲ | jcranmer 10 hours ago | parent | next [-] | ||||||||||||||||||||||||||||||||||||||||
> 1. It's the C programming language represented as SSA form and with some of the UB in the C spec given a strict definition. This is becoming steadily less true over time, as LLVM IR is growing somewhat more divorced from C/C++, but that's probably a good way to start thinking about it if you're comfortable with C's corner case semantics. (In terms of frontends, I've seen "Rust needs/wants this" as much as Clang these days, and Flang and Julia are also pretty relevant for some things.) There's currently a working group in LLVM on building better, LLVM-based semantics, and the current topic du jour of that WG is a byte type proposal. | |||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||
| ▲ | weinzierl 9 hours ago | parent | prev [-] | ||||||||||||||||||||||||||||||||||||||||
Thanks for your detailed answer. You encouraged me to give it another try and have closer look this time. | |||||||||||||||||||||||||||||||||||||||||