Contents

GNU Compiler Collection (GCC) Internals

This file documents the internals of the GNU compilers. Copyright © 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with the Invariant Sections being “GNU General Public License” and “Funding Free Software”, the Front-Cover texts being (a) (see below), and with the Back-Cover Texts being (b) (see below). A copy of the license is included in the section entitled “GNU Free Documentation License”. (a) The FSF's Front-Cover Text is: A GNU Manual (b) The FSF's Back-Cover Text is: You have freedom to copy and modify this GNU Manual, like GNU software. Copies published by the Free Software Foundation raise funds for GNU development.

Short Contents

Introduction

1 Contributing to GCC Development

2 GCC and Portability

3 Interfacing to GCC Output

4 The GCC low-level runtime library

5 Language Front Ends in GCC

6 Source Tree Structure and Build System

7 Passes and Files of the Compiler

8 Trees: The intermediate representation used by the C and C++ front ends

9 Analysis and Optimization of GIMPLE Trees

10 RTL Representation

11 Control Flow Graph

12 Machine Descriptions

13 Target Description Macros and Functions

14 Host Configuration

15 Makefile Fragments

16 collect2

17 Standard Header File Directories

18 Memory Management and Type Information

Funding Free Software

The GNU Project and GNU/Linux

GNU GENERAL PUBLIC LICENSE

GNU Free Documentation License

Contributors to GCC

Option Index

Concept Index

Table of Contents

Introduction

1 Contributing to GCC Development

2 GCC and Portability

3 Interfacing to GCC Output

4 The GCC low-level runtime library

4.1 Routines for integer arithmetic

4.1.1 Arithmetic functions

4.1.2 Comparison functions

4.1.3 Trapping arithmetic functions

4.1.4 Bit operations

4.2 Routines for floating point emulation

4.2.1 Arithmetic functions

4.2.2 Conversion functions

4.2.3 Comparison functions

4.3 Language-independent routines for exception handling

4.4 Miscellaneous runtime library routines

4.4.1 Cache control functions

5 Language Front Ends in GCC

6 Source Tree Structure and Build System

6.1 Configure Terms and History

6.2 Top Level Source Directory

6.3 The gcc Subdirectory

6.3.1 Subdirectories of gcc

6.3.2 Configuration in the gcc Directory

6.3.2.1 Scripts Used by configure

6.3.2.2 The config.build ; config.host ; and config.gcc Files

6.3.2.3 Files Created by configure

6.3.3 Build System in the gcc Directory

6.3.4 Makefile Targets

6.3.5 Library Source Files and Headers under the gcc Directory

6.3.6 Headers Installed by GCC

6.3.7 Building Documentation

6.3.7.1 Texinfo Manuals

6.3.7.2 Man Page Generation

6.3.7.3 Miscellaneous Documentation

6.3.8 Anatomy of a Language Front End

6.3.8.1 The Front End language Directory

6.3.8.2 The Front End config-lang.in File

6.3.9 Anatomy of a Target Back End

6.4 Testsuites

6.4.1 Idioms Used in Testsuite Code

6.4.2 Directives used within DejaGnu tests

6.4.3 Ada Language Testsuites

6.4.4 C Language Testsuites

6.4.5 The Java library testsuites.

6.4.6 Support for testing gcov

6.4.7 Support for testing profile-directed optimizations

6.4.8 Support for testing binary compatibility

7 Passes and Files of the Compiler

7.1 Parsing pass

7.2 Gimplification pass

7.3 Pass manager

7.4 Tree-SSA passes

7.5 RTL passes

8 Trees: The intermediate representation used by the C and C++ front ends

8.1 Deficiencies

8.2 Overview

8.2.1 Trees

8.2.2 Identifiers

8.2.3 Containers

8.3 Types

8.4 Scopes

8.4.1 Namespaces

8.4.2 Classes

8.5 Declarations

8.6 Functions

8.6.1 Function Basics

8.6.2 Function Bodies

8.6.2.1 Statements

8.7 Attributes in trees

8.8 Expressions

9 Analysis and Optimization of GIMPLE Trees

9.1 GENERIC

9.2 GIMPLE

9.2.1 Interfaces

9.2.2 Temporaries

9.2.3 Expressions

9.2.3.1 Compound Expressions

9.2.3.2 Compound Lvalues

9.2.3.3 Conditional Expressions

9.2.3.4 Logical Operators

9.2.4 Statements

9.2.4.1 Blocks

9.2.4.2 Statement Sequences

9.2.4.3 Empty Statements

9.2.4.4 Loops

9.2.4.5 Selection Statements

9.2.4.6 Jumps

9.2.4.7 Cleanups

9.2.4.8 Exception Handling

9.2.5 GIMPLE Example

9.2.6 Rough GIMPLE Grammar

9.3 Annotations

9.4 Statement Operands

9.4.1 Operand Iterators

9.5 Static Single Assignment

9.5.1 Preserving the SSA form

9.5.2 Examining SSA_NAME nodes

9.5.3 Walking use-def chains

9.5.4 Walking the dominator tree

9.6 Alias analysis

10 RTL Representation

10.1 RTL Object Types

10.2 RTL Classes and Formats

10.3 Access to Operands

10.4 Access to Special Operands

10.5 Flags in an RTL Expression

10.6 Machine Modes

10.7 Constant Expression Types

10.8 Registers and Memory

10.9 RTL Expressions for Arithmetic

10.10 Comparison Operations

10.11 Bit-Fields

10.12 Vector Operations

10.13 Conversions

10.14 Declarations

10.15 Side Effect Expressions

10.16 Embedded Side-Effects on Addresses

10.17 Assembler Instructions as Expressions

10.18 Insns

10.19 RTL Representation of Function-Call Insns

10.20 Structure Sharing Assumptions

10.21 Reading RTL

11 Control Flow Graph

11.1 Basic Blocks

11.2 Edges

11.3 Profile information

11.4 Maintaining the CFG

11.5 Liveness information

12 Machine Descriptions

12.1 Overview of How the Machine Description is Used

12.2 Everything about Instruction Patterns

12.3 Example of define_insn

12.4 RTL Template

12.5 Output Templates and Operand Substitution

12.6 C Statements for Assembler Output

12.7 Predicates

12.7.1 Machine-Independent Predicates

12.7.2 Defining Machine-Specific Predicates

12.8 Operand Constraints

12.8.1 Simple Constraints

12.8.2 Multiple Alternative Constraints

12.8.3 Register Class Preferences

12.8.4 Constraint Modifier Characters

12.8.5 Constraints for Particular Machines

12.9 Standard Pattern Names For Generation

12.10 When the Order of Patterns Matters

12.11 Interdependence of Patterns

12.12 Defining Jump Instruction Patterns

12.13 Defining Looping Instruction Patterns

12.14 Canonicalization of Instructions

12.15 Defining RTL Sequences for Code Generation

12.16 Defining How to Split Instructions

12.17 Including Patterns in Machine Descriptions.

12.17.1 RTL Generation Tool Options for Directory Search

12.18 Machine-Specific Peephole Optimizers

12.18.1 RTL to Text Peephole Optimizers

12.18.2 RTL to RTL Peephole Optimizers

12.19 Instruction Attributes

12.19.1 Defining Attributes and their Values

12.19.2 Attribute Expressions

12.19.3 Assigning Attribute Values to Insns

12.19.4 Example of Attribute Specifications

12.19.5 Computing the Length of an Insn

12.19.6 Constant Attributes

12.19.7 Delay Slot Scheduling

12.19.8 Specifying processor pipeline description

12.20 Conditional Execution

12.21 Constant Definitions

12.22 Macros

12.22.1 Mode Macros

12.22.1.1 Defining Mode Macros

12.22.1.2 String Substitution in Mode Macros

12.22.1.3 Mode Macro Examples

12.22.2 Code Macros

13 Target Description Macros and Functions

13.1 The Global targetm Variable

13.2 Controlling the Compilation Driver, gcc

13.3 Run-time Target Specification

13.4 Defining data structures for per-function information.

13.5 Storage Layout

13.6 Layout of Source Language Data Types

13.7 Register Usage

13.7.1 Basic Characteristics of Registers

13.7.2 Order of Allocation of Registers

13.7.3 How Values Fit in Registers

13.7.4 Handling Leaf Functions

13.7.5 Registers That Form a Stack

13.8 Register Classes

13.9 Stack Layout and Calling Conventions

13.9.1 Basic Stack Layout

13.9.2 Exception Handling Support

13.9.3 Specifying How Stack Checking is Done

13.9.4 Registers That Address the Stack Frame

13.9.5 Eliminating Frame Pointer and Arg Pointer

13.9.6 Passing Function Arguments on the Stack

13.9.7 Passing Arguments in Registers

13.9.8 How Scalar Function Values Are Returned

13.9.9 How Large Values Are Returned

13.9.10 Caller-Saves Register Allocation

13.9.11 Function Entry and Exit

13.9.12 Generating Code for Profiling

13.9.13 Permitting tail calls

13.10 Implementing the Varargs Macros

13.11 Trampolines for Nested Functions

13.12 Implicit Calls to Library Routines

13.13 Addressing Modes

13.14 Condition Code Status

13.15 Describing Relative Costs of Operations

13.16 Adjusting the Instruction Scheduler

13.17 Dividing the Output into Sections (Texts, Data, ... )

13.18 Position Independent Code

13.19 Defining the Output Assembler Language

13.19.1 The Overall Framework of an Assembler File

13.19.2 Output of Data

13.19.3 Output of Uninitialized Variables

13.19.4 Output and Generation of Labels

13.19.5 How Initialization Functions Are Handled

13.19.6 Macros Controlling Initialization Routines

13.19.7 Output of Assembler Instructions

13.19.8 Output of Dispatch Tables

13.19.9 Assembler Commands for Exception Regions

13.19.10 Assembler Commands for Alignment

13.20 Controlling Debugging Information Format

13.20.1 Macros Affecting All Debugging Formats

13.20.2 Specific Options for DBX Output

13.20.3 Open-Ended Hooks for DBX Format

13.20.4 File Names in DBX Format

13.20.5 Macros for SDB and DWARF Output

13.20.6 Macros for VMS Debug Format

13.21 Cross Compilation and Floating Point

13.22 Mode Switching Instructions

13.23 Defining target-specific uses of __attribute__

13.24 Defining coprocessor specifics for MIPS targets.

13.25 Parameters for Precompiled Header Validity Checking

13.26 C++ ABI parameters

13.27 Miscellaneous Parameters

14 Host Configuration

14.1 Host Common

14.2 Host Filesystem

14.3 Host Misc

15 Makefile Fragments

15.1 Target Makefile Fragments

15.2 Host Makefile Fragments

16 collect2

17 Standard Header File Directories

18 Memory Management and Type Information

18.1 The Inside of a GTY(())

18.2 Marking Roots for the Garbage Collector

18.3 Source Files Containing Type Information

Funding Free Software

The GNU Project and GNU/Linux

GNU GENERAL PUBLIC LICENSE

Preamble

How to Apply These Terms to Your New Programs

GNU Free Documentation License

ADDENDUM: How to use this License for your documents

Contributors to GCC

Option Index

Concept Index

Next: Contributing ,
Up: (DIR)

Introduction

This manual documents the internals of the GNU compilers, including how to port them to new targets and some information about how to write front ends for new languages. It corresponds to GCC version 4.0.1. The use of the GNU compilers is documented in a separate manual. See Introduction .

This manual is mainly a reference manual rather than a tutorial. It discusses how to contribute to GCC (see Contributing ), the characteristics of the machines supported by GCC as hosts and targets (see Portability ), how GCC relates to the ABIs on such systems (see Interface ), and the characteristics of the languages for which GCC front ends are written (see Languages ). It then describes the GCC source tree structure and build system, some of the interfaces to GCC front ends, and how support for a target system is implemented in GCC.

Additional tutorial information is linked to from http://gcc.gnu.org/readings.html .

Contributing : How to contribute to testing and developing GCC.

Portability : Goals of GCC's portability features.

Interface : Function-call interface of GCC output.

Libgcc : Low-level runtime library used by GCC.

Languages : Languages for which GCC front ends are written.

Source Tree : GCC source tree structure and build system.

Passes : Order of passes, what they do, and what each file is for.

Trees : The source representation used by the C and C++ front ends.

RTL : The intermediate representation that most passes work on.

Control Flow : Maintaining and manipulating the control flow graph.

Tree SSA : Analysis and optimization of the tree representation.

Machine Desc : How to write machine description instruction patterns.

Target Macros : How to write the machine description C macros and functions.

Host Config : Writing the xm- machine .h file.

Fragments : Writing the t- target and x- host files.

Collect2 : How collect2 works; how it finds ld .

Header Dirs : Understanding the standard header file directories.

Type Information : GCC's memory management; generating type information.

Funding : How to help assure funding for free software.

GNU Project : The GNU Project and GNU/Linux.

Copying : GNU General Public License says how you can copy and share GCC.

GNU Free Documentation License : How you can copy and share this manual.

Contributors : People who have contributed to GCC.

Option Index : Index to command line options.

Concept Index : Index of concepts and symbol names.