Convert Figma logo to code with AI

llvm logollvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.

27,844
11,472
27,844
25,895

Top Related Projects

96,644

Empowering everyone to build reliable and efficient software.

67,285

The Swift Programming Language

9,136

Emscripten: An LLVM-to-WebAssembly Compiler

14,915

.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.

Quick Overview

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. It provides a modern source- and target-independent optimizer, along with code generation support for many popular CPUs. LLVM is widely used in both commercial and open source projects for building compilers, static analysis tools, and JIT engines.

Pros

  • Modular design allows for easy integration and customization
  • Supports a wide range of programming languages and target architectures
  • Extensive optimization capabilities for improved code performance
  • Active community and continuous development

Cons

  • Steep learning curve for newcomers
  • Large codebase can be overwhelming
  • Documentation can be inconsistent or outdated in some areas
  • Compilation times can be long for large projects

Code Examples

  1. Basic LLVM IR generation:
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"

llvm::LLVMContext Context;
llvm::IRBuilder<> Builder(Context);
llvm::Module* Module = new llvm::Module("MyModule", Context);

llvm::Function* MainFunc = llvm::Function::Create(
    llvm::FunctionType::get(Builder.getInt32Ty(), false),
    llvm::Function::ExternalLinkage, "main", Module);

llvm::BasicBlock* EntryBB = llvm::BasicBlock::Create(Context, "entry", MainFunc);
Builder.SetInsertPoint(EntryBB);

llvm::Value* Result = Builder.CreateAdd(Builder.getInt32(2), Builder.getInt32(3));
Builder.CreateRet(Result);

This example demonstrates creating a simple LLVM IR module with a main function that adds two integers and returns the result.

  1. Using LLVM's optimization passes:
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/Transforms/IPO.h"
#include "llvm/Transforms/Scalar.h"

llvm::legacy::PassManager PM;
PM.add(llvm::createInstructionCombiningPass());
PM.add(llvm::createReassociatePass());
PM.add(llvm::createGVNPass());
PM.add(llvm::createCFGSimplificationPass());
PM.run(*Module);

This code snippet shows how to apply some common LLVM optimization passes to a module.

  1. JIT compilation with LLVM:
#include "llvm/ExecutionEngine/Orc/LLJIT.h"

auto JIT = llvm::orc::LLJITBuilder().create();
if (!JIT) {
    // Handle error
}

auto M = llvm::orc::ThreadSafeModule(std::move(Module), std::move(Context));
auto Err = JIT->addIRModule(std::move(M));
if (Err) {
    // Handle error
}

auto MainSymbol = JIT->lookup("main");
if (!MainSymbol) {
    // Handle error
}

int (*MainFn)() = (int (*)())(intptr_t)MainSymbol->getAddress();
int Result = MainFn();

This example demonstrates how to use LLVM's ORC JIT compiler to compile and execute a function at runtime.

Getting Started

To get started with LLVM:

  1. Clone the repository:

    git clone https://github.com/llvm/llvm-project.git
    
  2. Build LLVM (example for Unix-like systems):

    mkdir build && cd build
    cmake -G "Unix Makefiles" ../llvm
    make
    
  3. Include LLVM headers and link against LLVM libraries in your project:

    #include "llvm/IR/LLVMContext.h"
    #include "llvm/IR/Module.h"
    // ... other LLVM headers
    
    // Link against LLVM libraries
    // -lLLVMCore -lLLVMIRReader -
    

Competitor Comparisons

96,644

Empowering everyone to build reliable and efficient software.

Pros of Rust

  • Memory safety without garbage collection
  • Modern language features like pattern matching and zero-cost abstractions
  • Strong community support and growing ecosystem

Cons of Rust

  • Steeper learning curve, especially for developers new to systems programming
  • Longer compilation times compared to LLVM-based languages
  • Smaller pool of experienced developers in the job market

Code Comparison

Rust example (error handling):

fn main() -> Result<(), Box<dyn Error>> {
    let file = File::open("example.txt")?;
    // Process file
    Ok(())
}

LLVM-based C++ example (error handling):

int main() {
    std::ifstream file("example.txt");
    if (!file) {
        std::cerr << "Error opening file" << std::endl;
        return 1;
    }
    // Process file
    return 0;
}

The Rust example demonstrates more concise error handling with the ? operator, while the LLVM-based C++ example requires explicit error checking. Rust's approach can lead to more readable and maintainable code in complex scenarios.

Both projects are significant in the programming language landscape, with LLVM-project serving as a foundation for many compilers and Rust offering a modern, safe systems programming language. The choice between them depends on specific project requirements and developer preferences.

67,285

The Swift Programming Language

Pros of Swift

  • Designed specifically for Apple platforms, offering seamless integration with iOS, macOS, etc.
  • More modern language features, including optionals, generics, and protocol-oriented programming
  • Easier to learn and use for beginners compared to C++

Cons of Swift

  • Limited cross-platform support compared to LLVM's broader ecosystem
  • Smaller community and fewer third-party libraries than LLVM
  • Less mature and stable compared to LLVM's long-standing development history

Code Comparison

Swift:

func greet(person: String) -> String {
    return "Hello, \(person)!"
}
print(greet(person: "World"))

LLVM (C++):

#include <iostream>
#include <string>

std::string greet(const std::string& person) {
    return "Hello, " + person + "!";
}
int main() {
    std::cout << greet("World") << std::endl;
    return 0;
}

The Swift code is more concise and uses string interpolation, while the LLVM (C++) code requires more boilerplate and explicit string concatenation. Swift's syntax is generally more readable and beginner-friendly, whereas LLVM's C++ offers more low-level control and performance optimizations.

9,136

Pros of GCC

  • Longer history and more mature codebase, potentially leading to better stability
  • Wider range of supported architectures and platforms
  • Stronger focus on backward compatibility

Cons of GCC

  • Generally slower compilation times compared to LLVM
  • Less modular architecture, making it harder to reuse components
  • Steeper learning curve for new contributors due to complex codebase

Code Comparison

LLVM (C++):

Value *EmitVAArgFromMemory(Value *VAListAddr, Type *Ty,
                           IRBuilder<> &Builder) {
  Value *VAListAddrAsByte = Builder.CreateBitCast(VAListAddr, 
                                                  Type::getInt8PtrTy(Ty->getContext()));
  return Builder.CreateLoad(Ty, VAListAddrAsByte);
}

GCC (C):

rtx
expand_builtin_va_arg (tree valist, tree type)
{
  enum machine_mode arg_mode, pad_mode;
  tree arg_size, pad_size;
  rtx addr, arg;
  // ... (additional implementation)
}

The code snippets demonstrate differences in language (C++ vs C) and overall structure between LLVM and GCC. LLVM's code tends to be more modern and object-oriented, while GCC's code is often more procedural and C-style.

Emscripten: An LLVM-to-WebAssembly Compiler

Pros of Emscripten

  • Specialized for compiling C/C++ to WebAssembly, making it easier to port existing codebases to the web
  • Provides a complete toolchain with built-in optimizations for web-specific use cases
  • Includes a compatibility layer (Emscripten API) for easier integration with web technologies

Cons of Emscripten

  • More limited scope compared to LLVM, focusing primarily on web-related compilation
  • Smaller community and ecosystem, potentially leading to fewer resources and third-party tools
  • May introduce additional overhead due to its web-specific abstractions and compatibility layers

Code Comparison

LLVM (C++):

#include <llvm/IR/LLVMContext.h>
#include <llvm/IR/Module.h>

LLVMContext Context;
std::unique_ptr<Module> M = std::make_unique<Module>("my_module", Context);

Emscripten (C++):

#include <emscripten.h>

EMSCRIPTEN_KEEPALIVE
extern "C" int my_function(int x, int y) {
    return x + y;
}

The LLVM example shows basic module creation, while the Emscripten example demonstrates a function exported for use in JavaScript.

14,915

.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.

Pros of runtime

  • More focused scope, specifically targeting .NET development
  • Easier to contribute for developers familiar with C# and .NET ecosystem
  • Faster compilation and runtime performance for .NET applications

Cons of runtime

  • Less versatile compared to LLVM's multi-language support
  • Smaller community and ecosystem compared to LLVM
  • Limited use outside of .NET development

Code Comparison

runtime (C#):

public static int Main(string[] args)
{
    Console.WriteLine("Hello, World!");
    return 0;
}

llvm-project (C++):

#include <iostream>

int main(int argc, char** argv) {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

The code examples show the difference in syntax and language between the two projects. runtime focuses on C# and .NET, while llvm-project supports multiple languages, including C++.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

The LLVM Compiler Infrastructure

OpenSSF Scorecard OpenSSF Best Practices libc++

Welcome to the LLVM project!

This repository contains the source code for LLVM, a toolkit for the construction of highly optimized compilers, optimizers, and run-time environments.

The LLVM project has multiple components. The core of the project is itself called "LLVM". This contains all of the tools, libraries, and header files needed to process intermediate representations and convert them into object files. Tools include an assembler, disassembler, bitcode analyzer, and bitcode optimizer.

C-like languages use the Clang frontend. This component compiles C, C++, Objective-C, and Objective-C++ code into LLVM bitcode -- and from there into object files, using LLVM.

Other components include: the libc++ C++ standard library, the LLD linker, and more.

Getting the Source Code and Building LLVM

Consult the Getting Started with LLVM page for information on building and running LLVM.

For information on how to contribute to the LLVM project, please take a look at the Contributing to LLVM guide.

Getting in touch

Join the LLVM Discourse forums, Discord chat, LLVM Office Hours or Regular sync-ups.

The LLVM project has adopted a code of conduct for participants to all modes of communication within the project.