From gaeke at cs.uiuc.edu Mon Nov 24 11:04:01 2003 From: gaeke at cs.uiuc.edu (Brian Gaeke) Date: Mon Nov 24 11:04:01 2003 Subject: [llvm-commits] CVS: llvm/docs/Stacker.html Message-ID: <200311241703.LAA09428@zion.cs.uiuc.edu> Changes in directory llvm/docs: Stacker.html updated: 1.1 -> 1.2 --- Log message: Apply doc patch from PR136. --- Diffs of the changes: (+348 -60) Index: llvm/docs/Stacker.html diff -u llvm/docs/Stacker.html:1.1 llvm/docs/Stacker.html:1.2 --- llvm/docs/Stacker.html:1.1 Sun Nov 23 20:52:51 2003 +++ llvm/docs/Stacker.html Mon Nov 24 11:03:38 2003 @@ -6,9 +6,21 @@
Stacker: An Example Of Using LLVM
+
  1. Abstract
  2. Introduction
  3. +
  4. Lessons I Learned About LLVM +
      +
    1. Everything's a Value!
    2. +
    3. Terminate Those Blocks!
    4. +
    5. Concrete Blocks
    6. +
    7. push_back Is Your Friend
    8. +
    9. The Wily GetElementPtrInst
    10. +
    11. Getting Linkage Types Right
    12. +
    13. Constants Are Easier Than That!
    14. +
    +
  5. The Stacker Lexicon
    1. The Stack @@ -18,12 +30,24 @@
    2. Built-Ins
  6. -
  7. The Directory Structure +
  8. Prime: A Complete Example
  9. +
  10. Internal Code Details +
      +
    1. The Directory Structure
    2. +
    3. The Lexer
    4. +
    5. The Parser
    6. +
    7. The Compiler
    8. +
    9. The Runtime
    10. +
    11. Compiler Driver
    12. +
    13. Test Programs
    14. +
    +

Written by Reid Spencer

+
Abstract
@@ -80,31 +104,266 @@

Exercise for the reader: how could you make this a one line program?

-
Lessons Learned About LLVM
+
Lessons I Learned About LLVM

Stacker was written for two purposes: (a) to get the author over the learning curve and (b) to provide a simple example of how to write a compiler using LLVM. During the development of Stacker, many lessons about LLVM were learned. Those lessons are described in the following subsections.

+ +
Everything's a Value!
+
+

Although I knew that LLVM used a Single Static Assignment (SSA) format, +it wasn't obvious to me how prevalent this idea was in LLVM until I really +started using it. Reading the Programmer's Manual and Language Reference I +noted that most of the important LLVM IR (Intermediate Representation) C++ +classes were derived from the Value class. The full power of that simple +design only became fully understood once I started constructing executable +expressions for Stacker.

+

This really makes your programming go faster. Think about compiling code +for the following C/C++ expression: (a|b)*((x+1)/(y+1)). You could write a +function using LLVM that does exactly that, this way:

+

+Value* 
+expression(BasicBlock*bb, Value* a, Value* b, Value* x, Value* y )
+{
+    Instruction* tail = bb->getTerminator();
+    ConstantSInt* one = ConstantSInt::get( Type::IntTy, 1);
+    BinaryOperator* or1 = 
+	new BinaryOperator::create( Instruction::Or, a, b, "", tail );
+    BinaryOperator* add1 = 
+	new BinaryOperator::create( Instruction::Add, x, one, "", tail );
+    BinaryOperator* add2 =
+	new BinaryOperator::create( Instruction::Add, y, one, "", tail );
+    BinaryOperator* div1 = 
+	new BinaryOperator::create( Instruction::Div, add1, add2, "", tail);
+    BinaryOperator* mult1 = 
+	new BinaryOperator::create( Instruction::Mul, or1, div1, "", tail );
+
+    return mult1;
+}
+
+

"Okay, big deal," you say. It is a big deal. Here's why. Note that I didn't +have to tell this function which kinds of Values are being passed in. They could be +instructions, Constants, Global Variables, etc. Furthermore, if you specify Values +that are incorrect for this sequence of operations, LLVM will either notice right +away (at compilation time) or the LLVM Verifier will pick up the inconsistency +when the compiler runs. In no case will you make a type error that gets passed +through to the generated program. This really helps you write a compiler +that always generates correct code!

+

The second point is that we don't have to worry about branching, registers, +stack variables, saving partial results, etc. The instructions we create +are the values we use. Note that all that was created in the above +code is a Constant value and five operators. Each of the instructions is +the resulting value of that instruction.

+

The lesson is this: SSA form is very powerful: there is no difference + between a value and the instruction that created it. This is fully +enforced by the LLVM IR. Use it to your best advantage.

+
+ +
Terminate Those Blocks!
+
+

I had to learn about terminating blocks the hard way: using the debugger +to figure out what the LLVM verifier was trying to tell me and begging for +help on the LLVMdev mailing list. I hope you avoid this experience.

+

Emblazon this rule in your mind:

+ +

Terminating instructions are a semantic requirement of the LLVM IR. There +is no facility for implicitly chaining together blocks placed into a function +in the order they occur. Indeed, in the general case, blocks will not be +added to the function in the order of execution because of the recursive +way compilers are written.

+

Furthermore, if you don't terminate your blocks, your compiler code will +compile just fine. You won't find out about the problem until you're running +the compiler and the module you just created fails on the LLVM Verifier.

+
+ +
Concrete Blocks
+
+

After a little initial fumbling around, I quickly caught on to how blocks +should be constructed. The use of the standard template library really helps +simply the interface. In general, here's what I learned: +

    +
  1. Create your blocks early. While writing your compiler, you + will encounter several situations where you know apriori that you will + need several blocks. For example, if-then-else, switch, while and for + statements in C/C++ all need multiple blocks for expression in LVVM. + The rule is, create them early.
  2. +
  3. Terminate your blocks early. This just reduces the chances + that you forget to terminate your blocks which is required (go + here for more). +
  4. Use getTerminator() for instruction insertion. I noticed early on + that many of the constructors for the Instruction classes take an optional + insert_before argument. At first, I thought this was a mistake + because clearly the normal mode of inserting instructions would be one at + a time after some other instruction, not before. However, + if you hold on to your terminating instruction (or use the handy dandy + getTerminator() method on a BasicBlock), it can + always be used as the insert_before argument to your instruction + constructors. This causes the instruction to automatically be inserted in + the RightPlace&tm; place, just before the terminating instruction. The + nice thing about this design is that you can pass blocks around and insert + new instructions into them without ever known what instructions came + before. This makes for some very clean compiler design.
  5. +
+

The foregoing is such an important principal, its worth making an idiom:

+
+
+BasicBlock* bb = new BasicBlock();
+bb->getInstList().push_back( new Branch( ... ) );
+new Instruction(..., bb->getTerminator() );
+
+
+

To make this clear, consider the typical if-then-else statement +(see StackerCompiler::handle_if() method). We can set this up +in a single function using LLVM in the following way:

+
+using namespace llvm;
+BasicBlock*
+MyCompiler::handle_if( BasicBlock* bb, SetCondInst* condition )
+{
+    // Create the blocks to contain code in the structure of if/then/else
+    BasicBlock* then = new BasicBlock(); 
+    BasicBlock* else = new BasicBlock();
+    BasicBlock* exit = new BasicBlock();
+
+    // Insert the branch instruction for the "if"
+    bb->getInstList().push_back( new BranchInst( then, else, condition ) );
+
+    // Set up the terminating instructions
+    then->getInstList().push_back( new BranchInst( exit ) );
+    else->getInstList().push_back( new BranchInst( exit ) );
+
+    // Fill in the then part .. details excised for brevity
+    this->fill_in( then );
+
+    // Fill in the else part .. details excised for brevity
+    this->fill_in( else );
+
+    // Return a block to the caller that can be filled in with the code
+    // that follows the if/then/else construct.
+    return exit;
+}
+
+

Presumably in the foregoing, the calls to the "fill_in" method would add +the instructions for the "then" and "else" parts. They would use the third part +of the idiom almost exclusively (inserting new instructions before the +terminator). Furthermore, they could even recurse back to handle_if +should they encounter another if/then/else statement and it will all "just work". +

+

Note how cleanly this all works out. In particular, the push_back methods on +the BasicBlock's instruction list. These are lists of type +Instruction which also happen to be Values. To create +the "if" branch we merely instantiate a BranchInst that takes as +arguments the blocks to branch to and the condition to branch on. The blocks +act like branch labels! This new BranchInst terminates +the BasicBlock provided as an argument. To give the caller a way +to keep inserting after calling handle_if we create an "exit" block +which is returned to the caller. Note that the "exit" block is used as the +terminator for both the "then" and the "else" blocks. This gaurantees that no +matter what else "handle_if" or "fill_in" does, they end up at the "exit" block. +

+
+ +
push_back Is Your Friend
+
+

+One of the first things I noticed is the frequent use of the "push_back" +method on the various lists. This is so common that it is worth mentioning. +The "push_back" inserts a value into an STL list, vector, array, etc. at the +end. The method might have also been named "insert_tail" or "append". +Althought I've used STL quite frequently, my use of push_back wasn't very +high in other programs. In LLVM, you'll use it all the time. +

+
+ +
The Wily GetElementPtrInst
+
+

+It took a little getting used to and several rounds of postings to the LLVM +mail list to wrap my head around this instruction correctly. Even though I had +read the Language Reference and Programmer's Manual a couple times each, I still +missed a few very key points: +

+ +

This means that when you look up an element in the global variable (assuming +its a struct or array), you must deference the pointer first! For many +things, this leads to the idiom: +

+

+std::vector index_vector;
+index_vector.push_back( ConstantSInt::get( Type::LongTy, 0 );
+// ... push other indices ...
+GetElementPtrInst* gep = new GetElementPtrInst( ptr, index_vector );
+
+

For example, suppose we have a global variable whose type is [24 x int]. The +variable itself represents a pointer to that array. To subscript the +array, we need two indices, not just one. The first index (0) dereferences the +pointer. The second index subscripts the array. If you're a "C" programmer, this +will run against your grain because you'll naturally think of the global array +variable and the address of its first element as the same. That tripped me up +for a while until I realized that they really do differ .. by type. +Remember that LLVM is a strongly typed language itself. Absolutely everything +has a type. The "type" of the global variable is [24 x int]*. That is, its +a pointer to an array of 24 ints. When you dereference that global variable with +a single index, you now have a " [24 x int]" type, the pointer is gone. Although +the pointer value of the dereferenced global and the address of the zero'th element +in the array will be the same, they differ in their type. The zero'th element has +type "int" while the pointer value has type "[24 x int]".

+

Get this one aspect of LLVM right in your head and you'll save yourself +a lot of compiler writing headaches down the road.

+
+
Getting Linkage Types Right
-

To be completed.

-
Everything's a Value!
-

To be completed.

-
The Wily GetElementPtrInst
-

To be completed.

-
Constants Are Easier Than That!
-

To be completed.

-
Terminate Those Blocks!
-

To be completed.

-
new,get,create .. Its All The Same
-

To be completed.

-
Utility Functions To The Rescue
-

To be completed.

-
push_back Is Your Friend
-

To be completed.

-
Block Heads Come First
-

To be completed.

+
+

Linkage types in LLVM can be a little confusing, especially if your compiler +writing mind has affixed very hard concepts to particular words like "weak", +"external", "global", "linkonce", etc. LLVM does not use the precise +definitions of say ELF or GCC even though they share common terms. To be fair, +the concepts are related and similar but not precisely the same. This can lead +you to think you know what a linkage type represents but in fact it is slightly +different. I recommend you read the + Language Reference on this topic very +carefully.

+

Here are some handy tips that I discovered along the way:

+ +
+ +
Constants Are Easier Than That!
+
+

+Constants in LLVM took a little getting used to until I discovered a few utility +functions in the LLVM IR that make things easier. Here's what I learned:

+ +
The Stacker Lexicon
The Stack
@@ -184,7 +443,7 @@ their operands.
The words are: ABS NEG + - * / MOD */ ++ -- MIN MAX
  • StackThese words manipulate the stack directly by moving its elements around.
    The words are: DROP DUP SWAP OVER ROT DUP2 DROP2 PICK TUCK
  • -
  • Memory>These words allocate, free and manipulate memory +
  • MemoryThese words allocate, free and manipulate memory areas outside the stack.
    The words are: MALLOC FREE GET PUT
  • ControlThese words alter the normal left to right flow of execution.
    The words are: IF ELSE ENDIF WHILE END RETURN EXIT RECURSE
  • @@ -696,39 +955,19 @@ -
    Directory Structure
    -
    -

    The source code, test programs, and sample programs can all be found -under the LLVM "projects" directory. You will need to obtain the LLVM sources -to find it (either via anonymous CVS or a tarball. See the -Getting Started document).

    -

    Under the "projects" directory there is a directory named "stacker". That -directory contains everything, as follows:

    -
    - -
    Prime: A Complete Example
    +
    Prime: A Complete Example
    -

    The following fully documented program highlights many of features of both -the Stacker language and what is possible with LLVM. The program simply -prints out the prime numbers until it reaches +

    The following fully documented program highlights many features of both +the Stacker language and what is possible with LLVM. The program has two modes +of operations. If you provide numeric arguments to the program, it checks to see +if those arguments are prime numbers, prints out the results. Without any +aruments, the program prints out any prime numbers it finds between 1 and one +million (there's a log of them!). The source code comments below tell the +remainder of the story.

    -

    - ################################################################################ # # Brute force prime number generator @@ -964,24 +1203,73 @@ ENDIF 0 ( push return code ) ; -]]> -

    +
    -
    Internals
    -

    To be completed.

    -
    The Lexer
    -
    The Parser
    -
    The Compiler
    -
    The Stack
    -
    Definitions Are Functions
    -
    Words Are BasicBlocks
    +
    Internals
    +
    +

    This section is under construction. +

    In the mean time, you can always read the code! It has comments!

    +
    + +
    Directory Structure
    +
    +

    The source code, test programs, and sample programs can all be found +under the LLVM "projects" directory. You will need to obtain the LLVM sources +to find it (either via anonymous CVS or a tarball. See the +Getting Started document).

    +

    Under the "projects" directory there is a directory named "stacker". That +directory contains everything, as follows:

    +
    + +
    The Lexer
    +
    +

    See projects/Stacker/lib/compiler/Lexer.l

    +

    + +
    The Parser
    +
    +

    See projects/Stacker/lib/compiler/StackerParser.y

    +

    + +
    The Compiler
    +
    +

    See projects/Stacker/lib/compiler/StackerCompiler.cpp

    +

    + +
    The Runtime
    +
    +

    See projects/Stacker/lib/runtime/stacker_rt.c

    +

    + +
    Compiler Driver
    +
    +

    See projects/Stacker/tools/stkrc/stkrc.cpp

    +

    + +
    Test Programs
    +
    +

    See projects/Stacker/test/*.st

    +


    +
    Last modified: $Date: 2003/11/24 17:03:38 $ From criswell at cs.uiuc.edu Mon Nov 24 12:32:02 2003 From: criswell at cs.uiuc.edu (John Criswell) Date: Mon Nov 24 12:32:02 2003 Subject: [llvm-commits] CVS: llvm/Makefile.rules Message-ID: <200311241831.MAA08216@choi.cs.uiuc.edu> Changes in directory llvm: Makefile.rules updated: 1.158 -> 1.159 --- Log message: Modified directory building rules so that using the cd program/alias is not necessary. --- Diffs of the changes: (+3 -3) Index: llvm/Makefile.rules diff -u llvm/Makefile.rules:1.158 llvm/Makefile.rules:1.159 --- llvm/Makefile.rules:1.158 Mon Nov 10 18:05:29 2003 +++ llvm/Makefile.rules Mon Nov 24 12:31:01 2003 @@ -395,7 +395,7 @@ ifdef DIRS all install clean test bytecode :: $(VERB) for dir in ${DIRS}; do \ - (cd $$dir; $(MAKE) $@) || exit 1; \ + ($(MAKE) -C $$dir $@) || exit 1; \ done endif @@ -408,7 +408,7 @@ bytecode :: $(addsuffix /.makebytecode, $(PARALLEL_DIRS)) %/.makeall %/.makeinstall %/.makeclean %/.maketest %/.makebytecode: - $(VERB) cd $(@D); $(MAKE) $(subst $(@D)/.make,,$@) + $(VERB) $(MAKE) -C $(@D) $(subst $(@D)/.make,,$@) endif # Handle directories that may or may not exist @@ -417,7 +417,7 @@ $(VERB) for dir in ${OPTIONAL_DIRS}; do \ if [ -d $$dir ]; \ then\ - (cd $$dir; $(MAKE) $@) || exit 1; \ + ($(MAKE) -C$$dir $@) || exit 1; \ fi \ done endif From brukman at cs.uiuc.edu Mon Nov 24 16:04:01 2003 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Mon Nov 24 16:04:01 2003 Subject: [llvm-commits] CVS: llvm-www/safecode/index.html Message-ID: <200311242203.QAA15309@zion.cs.uiuc.edu> Changes in directory llvm-www/safecode: index.html updated: 1.7 -> 1.8 --- Log message: * DO NOT use server-absolute URLs to images! That goes double when the file is in the SAME directory as the HTML file that references it. * While we're at it, wrap long lines to fit in 80 columns. --- Diffs of the changes: (+6 -4) Index: llvm-www/safecode/index.html diff -u llvm-www/safecode/index.html:1.7 llvm-www/safecode/index.html:1.8 --- llvm-www/safecode/index.html:1.7 Tue Jun 10 19:25:21 2003 +++ llvm-www/safecode/index.html Mon Nov 24 16:03:48 2003 @@ -6,7 +6,11 @@

    Static Analysis For safe Execution of Code


    -To enable program safety without runtime checks and garbage collection, through 100% or near-100% static enforcement of program safety properties. SAFECode defines a code representation with minimal semantic restrictions designed to enable static enforcement of safety, using aggressive compiler techniques developed in this project.


    +To enable program safety without runtime checks and garbage collection, through +100% or near-100% static enforcement of program safety properties. SAFECode +defines a code representation with minimal semantic restrictions designed to +enable static enforcement of safety, using aggressive compiler techniques +developed in this project.


    Project Members :

    @@ -40,9 +44,7 @@

    Implementation :

    - - IMPLEmentation 
-picture + IMPLEmentation picture

    Download :

    From brukman at cs.uiuc.edu Mon Nov 24 16:23:01 2003 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Mon Nov 24 16:23:01 2003 Subject: [llvm-commits] CVS: llvm-www/safecode/safecode.css index.html Message-ID: <200311242222.QAA20254@zion.cs.uiuc.edu> Changes in directory llvm-www/safecode: safecode.css added (r1.1) index.html updated: 1.8 -> 1.9 --- Log message: * Fixed up the intro/description paragraph, it was actually just a sentence fragment. * Cleaned up the layout, removed extraneous space (in the rendered HTML) * Removed extraneous space around link strings * Stylesheet-enabled the webpage * It now conforms to HTML 4.01 Strict, so I added images to that effect. --- Diffs of the changes: (+79 -46) Index: llvm-www/safecode/safecode.css diff -c /dev/null llvm-www/safecode/safecode.css:1.1 *** /dev/null Mon Nov 24 16:22:43 2003 --- llvm-www/safecode/safecode.css Mon Nov 24 16:22:33 2003 *************** *** 0 **** --- 1,17 ---- + /* + * Safecode website style sheet + */ + + /* Common styles */ + .body { color: black; background: white; margin: 0 0 0 0 } + + /* No borders on image links */ + a:link img, a:visited img {border-style: none} + + address img { float: right; width: 88px; height: 31px; } + address { clear: right; } + + /* Page headers, sections */ + .www_title { font-family: "Verdana, Arial, Sans serif"; + font-size: 24pt; text-align: center; + font-weight: bold } Index: llvm-www/safecode/index.html diff -u llvm-www/safecode/index.html:1.8 llvm-www/safecode/index.html:1.9 --- llvm-www/safecode/index.html:1.8 Mon Nov 24 16:03:48 2003 +++ llvm-www/safecode/index.html Mon Nov 24 16:22:33 2003 @@ -1,68 +1,84 @@ - -SAFE Code - -
    SAFECode
    -
    - -

    Static Analysis For safe Execution of Code


    - -To enable program safety without runtime checks and garbage collection, through -100% or near-100% static enforcement of program safety properties. SAFECode -defines a code representation with minimal semantic restrictions designed to -enable static enforcement of safety, using aggressive compiler techniques -developed in this project.


    + + + + SAFE Code + + + + +
    SAFECode
    + +
    + +

    Static Analysis For safe Execution of Code

    + +

    The purpose of the SAFECode project is to enable program safety without +runtime checks and garbage collection, through 100% or near-100% static +enforcement of program safety properties. SAFECode defines a code +representation with minimal semantic restrictions designed to enable static +enforcement of safety, using aggressive compiler techniques developed in this +project.

    -

    Project Members :

    +

    Project Members

    + +

    Faculty

    -

    Faculty :

    -

    Graduate Students :

    + +

    Graduate Students

    + -
    - -

    Publications :

    +

    Publications

    -

    Implementation :

    +

    Implementation

    + +

    Implementation picture

    - IMPLEmentation picture +

    Download

    -

    Download :

    +

    Not in public domain for now. Check this page later.

    -Not in public domain for now. Check this page later. +

    Funding

    -

    Funding :

    -This project is sponsored -by the NSF Embedded Systems program under award CCR-02-09202 -and in part by an NSF CAREER award, EIA-0093426 and ONR, -N0004-02-0102. +

    This project is sponsored by the NSF Embedded Systems program under award +CCR-02-09202 and in part by an NSF CAREER award, EIA-0093426 and ONR, +N0004-02-0102.

    -

    Links :

    +

    Links

    +
    +
    + Valid CSS! + Valid HTML 4.01! + + Dinakar Dhurjati +
    -
    -
    Dinakar Dhurjati
    From lattner at cs.uiuc.edu Mon Nov 24 19:04:03 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon Nov 24 19:04:03 2003 Subject: [llvm-commits] CVS: llvm/docs/LangRef.html ProgrammersManual.html llvm.css Message-ID: <200311250103.TAA22486@zion.cs.uiuc.edu> Changes in directory llvm/docs: LangRef.html updated: 1.40 -> 1.41 ProgrammersManual.html updated: 1.50 -> 1.51 llvm.css updated: 1.9 -> 1.10 --- Log message: checkin reid's docpatch --- Diffs of the changes: (+2720 -3501) Index: llvm/docs/LangRef.html diff -u llvm/docs/LangRef.html:1.40 llvm/docs/LangRef.html:1.41 --- llvm/docs/LangRef.html:1.40 Fri Nov 21 11:42:22 2003 +++ llvm/docs/LangRef.html Mon Nov 24 19:02:51 2003 @@ -1,582 +1,508 @@ - + LLVM Assembly Language Reference Manual - -
    - LLVM Language Reference Manual -
    - +
    LLVM Language Reference Manual
    1. Abstract
    2. Introduction
    3. Identifiers
    4. Type System
        -
      1. Primitive Types -
          +
        1. Primitive Types +
          1. Type Classifications
          2. -
        2. +
        +
      2. Derived Types
          -
        1. Array Type
        2. +
        3. Array Type
        4. Function Type
        5. Pointer Type
        6. -
        7. Structure Type
        8. - -
      3. -
    5. +
    6. Structure Type
    7. + +
    + + +
  • High Level Structure
    1. Module Structure
    2. Global Variables
    3. Function Structure
    4. -
  • + +
  • Instruction Reference
    1. Terminator Instructions
        -
      1. 'ret' Instruction
      2. -
      3. 'br' Instruction
      4. +
      5. 'ret' Instruction
      6. +
      7. 'br' Instruction
      8. 'switch' Instruction
      9. 'invoke' Instruction
      10. -
      11. 'unwind' Instruction
      12. -
    2. +
    3. 'unwind' Instruction
    4. +
    +
  • Binary Operations
      -
    1. 'add' Instruction
    2. -
    3. 'sub' Instruction
    4. -
    5. 'mul' Instruction
    6. -
    7. 'div' Instruction
    8. -
    9. 'rem' Instruction
    10. +
    11. 'add' Instruction
    12. +
    13. 'sub' Instruction
    14. +
    15. 'mul' Instruction
    16. +
    17. 'div' Instruction
    18. +
    19. 'rem' Instruction
    20. 'setcc' Instructions
    21. -
  • + +
  • Bitwise Binary Operations
    1. 'and' Instruction
    2. -
    3. 'or' Instruction
    4. +
    5. 'or' Instruction
    6. 'xor' Instruction
    7. 'shl' Instruction
    8. 'shr' Instruction
    9. -
  • + +
  • Memory Access Operations
      -
    1. 'malloc' Instruction
    2. -
    3. 'free' Instruction
    4. -
    5. 'alloca' Instruction
    6. -
    7. 'load' Instruction
    8. -
    9. 'store' Instruction
    10. -
    11. 'getelementptr' Instruction
    12. -
  • +
  • 'malloc' Instruction
  • +
  • 'free' Instruction
  • +
  • 'alloca' Instruction
  • +
  • 'load' Instruction
  • +
  • 'store' Instruction
  • +
  • 'getelementptr' Instruction
  • + +
  • Other Operations
      -
    1. 'phi' Instruction
    2. +
    3. 'phi' Instruction
    4. 'cast .. to' Instruction
    5. -
    6. 'call' Instruction
    7. +
    8. 'call' Instruction
    9. 'vanext' Instruction
    10. -
    11. 'vaarg' Instruction
    12. +
    13. 'vaarg' Instruction
    +
  • +
  • Intrinsic Functions -
      -
    1. Variable Argument Handling Intrinsics
        -
      1. 'llvm.va_start' Intrinsic
      2. -
      3. 'llvm.va_end' Intrinsic
      4. -
      5. 'llvm.va_copy' Intrinsic
      6. -
    2. -
  • - +
  • Variable Argument Handling Intrinsics +
      +
    1. 'llvm.va_start' Intrinsic
    2. +
    3. 'llvm.va_end' Intrinsic
    4. +
    5. 'llvm.va_copy' Intrinsic
    6. +
    +
  • + + -
    -

    Written by Chris Lattner and Vikram Adve

    +

    Written by Chris Lattner +and Vikram Adve

    +

    - - + -
    - -

    This document is a reference manual for the LLVM assembly language. LLVM is -an SSA based representation that provides type safety, low-level operations, -flexibility, and the capability of representing 'all' high-level languages -cleanly. It is the common code representation used throughout all phases of the -LLVM compilation strategy.

    - +

    This document is a reference manual for the LLVM assembly language. +LLVM is an SSA based representation that provides type safety, +low-level operations, flexibility, and the capability of representing +'all' high-level languages cleanly. It is the common code +representation used throughout all phases of the LLVM compilation +strategy.

    - - + - -
    - -

    The LLVM code representation is designed to be used in three different forms: -as an in-memory compiler IR, as an on-disk bytecode representation (suitable for -fast loading by a Just-In-Time compiler), and as a human readable assembly -language representation. This allows LLVM to provide a powerful intermediate -representation for efficient compiler transformations and analysis, while -providing a natural means to debug and visualize the transformations. The three -different forms of LLVM are all equivalent. This document describes the human -readable representation and notation.

    - -

    The LLVM representation aims to be a light-weight and low-level while being -expressive, typed, and extensible at the same time. It aims to be a "universal -IR" of sorts, by being at a low enough level that high-level ideas may be -cleanly mapped to it (similar to how microprocessors are "universal IR's", -allowing many source languages to be mapped to them). By providing type -information, LLVM can be used as the target of optimizations: for example, -through pointer analysis, it can be proven that a C automatic variable is never -accessed outside of the current function... allowing it to be promoted to a -simple SSA value instead of a memory location.

    - -
    - - - -
    - -

    It is important to note that this document describes 'well formed' LLVM -assembly language. There is a difference between what the parser accepts and -what is considered 'well formed'. For example, the following instruction is -syntactically okay, but not well formed:

    - -
    -  %x = add int 1, %x
    -
    - -

    ...because the definition of %x does not dominate all of its uses. -The LLVM infrastructure provides a verification pass that may be used to verify -that an LLVM module is well formed. This pass is automatically run by the -parser after parsing input assembly, and by the optimizer before it outputs -bytecode. The violations pointed out by the verifier pass indicate bugs in -transformation passes or input to the parser.

    - - - -
    - +

    The LLVM code representation is designed to be used in three +different forms: as an in-memory compiler IR, as an on-disk bytecode +representation (suitable for fast loading by a Just-In-Time compiler), +and as a human readable assembly language representation. This allows +LLVM to provide a powerful intermediate representation for efficient +compiler transformations and analysis, while providing a natural means +to debug and visualize the transformations. The three different forms +of LLVM are all equivalent. This document describes the human readable +representation and notation.

    +

    The LLVM representation aims to be a light-weight and low-level +while being expressive, typed, and extensible at the same time. It +aims to be a "universal IR" of sorts, by being at a low enough level +that high-level ideas may be cleanly mapped to it (similar to how +microprocessors are "universal IR's", allowing many source languages to +be mapped to them). By providing type information, LLVM can be used as +the target of optimizations: for example, through pointer analysis, it +can be proven that a C automatic variable is never accessed outside of +the current function... allowing it to be promoted to a simple SSA +value instead of a memory location.

    + + + +
    +

    It is important to note that this document describes 'well formed' +LLVM assembly language. There is a difference between what the parser +accepts and what is considered 'well formed'. For example, the +following instruction is syntactically okay, but not well formed:

    +
      %x = add int 1, %x
    +

    ...because the definition of %x does not dominate all of +its uses. The LLVM infrastructure provides a verification pass that may +be used to verify that an LLVM module is well formed. This pass is +automatically run by the parser after parsing input assembly, and by +the optimizer before it outputs bytecode. The violations pointed out +by the verifier pass indicate bugs in transformation passes or input to +the parser.

    +
    - + -
    - -

    LLVM uses three different forms of identifiers, for different purposes:

    - +

    LLVM uses three different forms of identifiers, for different +purposes:

      - -
    1. Numeric constants are represented as you would expect: 12, -3 123.421, - etc. Floating point constants have an optional hexidecimal notation.
    2. - -
    3. Named values are represented as a string of characters with a '%' prefix. - For example, %foo, %DivisionByZero, %a.really.long.identifier. The actual - regular expression used is '%[a-zA-Z$._][a-zA-Z$._0-9]*'. - Identifiers which require other characters in their names can be surrounded - with quotes. In this way, anything except a " character can be used - in a name.
    4. - -
    5. Unnamed values are represented as an unsigned numeric value with a '%' - prefix. For example, %12, %2, %44.
    6. - +
    7. Numeric constants are represented as you would expect: 12, -3 +123.421, etc. Floating point constants have an optional hexidecimal +notation.
    8. +
    9. Named values are represented as a string of characters with a '%' +prefix. For example, %foo, %DivisionByZero, +%a.really.long.identifier. The actual regular expression used is '%[a-zA-Z$._][a-zA-Z$._0-9]*'. +Identifiers which require other characters in their names can be +surrounded with quotes. In this way, anything except a " +character can be used in a name.
    10. +
    11. Unnamed values are represented as an unsigned numeric value with +a '%' prefix. For example, %12, %2, %44.
    - -

    LLVM requires the values start with a '%' sign for two reasons: Compilers -don't need to worry about name clashes with reserved words, and the set of -reserved words may be expanded in the future without penalty. Additionally, -unnamed identifiers allow a compiler to quickly come up with a temporary -variable without having to avoid symbol table conflicts.

    - -

    Reserved words in LLVM are very similar to reserved words in other languages. -There are keywords for different opcodes ('add', -'cast', 'ret', -etc...), for primitive type names ('void', -'uint', etc...), and others. These reserved -words cannot conflict with variable names, because none of them start with a '%' -character.

    - -

    Here is an example of LLVM code to multiply the integer variable -'%X' by 8:

    - +

    LLVM requires the values start with a '%' sign for two reasons: +Compilers don't need to worry about name clashes with reserved words, +and the set of reserved words may be expanded in the future without +penalty. Additionally, unnamed identifiers allow a compiler to quickly +come up with a temporary variable without having to avoid symbol table +conflicts.

    +

    Reserved words in LLVM are very similar to reserved words in other +languages. There are keywords for different opcodes ('add', 'cast', 'ret', etc...), for primitive type names ('void', 'uint', +etc...), and others. These reserved words cannot conflict with +variable names, because none of them start with a '%' character.

    +

    Here is an example of LLVM code to multiply the integer variable '%X' +by 8:

    The easy way:

    - -
    -  %result = mul uint %X, 8
    -
    - +
      %result = mul uint %X, 8

    After strength reduction:

    - -
    -  %result = shl uint %X, ubyte 3
    -
    - +
      %result = shl uint %X, ubyte 3

    And the hard way:

    - -
    -  add uint %X, %X           ; yields {uint}:%0
    -  add uint %0, %0           ; yields {uint}:%1
    -  %result = add uint %1, %1
    -
    - -

    This last way of multiplying %X by 8 illustrates several important -lexical features of LLVM:

    - +
      add uint %X, %X           ; yields {uint}:%0
    +  add uint %0, %0           ; yields {uint}:%1
    +  %result = add uint %1, %1
    +

    This last way of multiplying %X by 8 illustrates several +important lexical features of LLVM:

      -
    1. Comments are delimited with a ';' and go until the end of - line.
    2. - -
    3. Unnamed temporaries are created when the result of a computation is not - assigned to a named value.
    4. - +
    5. Comments are delimited with a ';' and go until the end +of line.
    6. +
    7. Unnamed temporaries are created when the result of a computation +is not assigned to a named value.
    8. Unnamed temporaries are numbered sequentially
    - -

    ...and it also show a convention that we follow in this document. When -demonstrating instructions, we will follow an instruction with a comment that -defines the type and name of value produced. Comments are shown in italic -text.

    - -

    The one non-intuitive notation for constants is the optional hexidecimal form -of floating point constants. For example, the form 'double +

    ...and it also show a convention that we follow in this document. +When demonstrating instructions, we will follow an instruction with a +comment that defines the type and name of value produced. Comments are +shown in italic text.

    +

    The one non-intuitive notation for constants is the optional +hexidecimal form of floating point constants. For example, the form 'double 0x432ff973cafa8000' is equivalent to (but harder to read than) 'double -4.5e+15' which is also supported by the parser. The only time hexadecimal -floating point constants are useful (and the only time that they are generated -by the disassembler) is when an FP constant has to be emitted that is not -representable as a decimal floating point number exactly. For example, NaN's, -infinities, and other special cases are represented in their IEEE hexadecimal -format so that assembly and disassembly do not cause any bits to change in the -constants.

    - +4.5e+15
    ' which is also supported by the parser. The only time +hexadecimal floating point constants are useful (and the only time that +they are generated by the disassembler) is when an FP constant has to +be emitted that is not representable as a decimal floating point number +exactly. For example, NaN's, infinities, and other special cases are +represented in their IEEE hexadecimal format so that assembly and +disassembly do not cause any bits to change in the constants.

    - - + -
    -

    The LLVM type system is one of the most important features of the -intermediate representation. Being typed enables a number of optimizations to -be performed on the IR directly, without having to do extra analyses on the side -before the transformation. A strong type system makes it easier to read the -generated code and enables novel analyses and transformations that are not -feasible to perform on normal three address code representations.

    - +intermediate representation. Being typed enables a number of +optimizations to be performed on the IR directly, without having to do +extra analyses on the side before the transformation. A strong type +system makes it easier to read the generated code and enables novel +analyses and transformations that are not feasible to perform on normal +three address code representations.

    - -
    - +href="#rw_stroustrup">1.

    --> -

    - +
    - -

    The primitive types are the fundemental building blocks of the LLVM system. -The current set of primitive types are as follows:

    - +

    The primitive types are the fundemental building blocks of the LLVM +system. The current set of primitive types are as follows:

    - - - + + + + + +
    - - - - - - - - - -
    void No value
    ubyte Unsigned 8 bit value
    ushortUnsigned 16 bit value
    uint Unsigned 32 bit value
    ulong Unsigned 64 bit value
    float 32 bit floating point value
    label Branch destination
    - -
    - - - - - - - - -
    bool True or False value
    sbyte Signed 8 bit value
    short Signed 16 bit value
    int Signed 32 bit value
    long Signed 64 bit value
    double64 bit floating point value
    - -
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    voidNo value
    ubyteUnsigned 8 bit value
    ushortUnsigned 16 bit value
    uintUnsigned 32 bit value
    ulongUnsigned 64 bit value
    float32 bit floating point value
    labelBranch destination
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    boolTrue or False value
    sbyteSigned 8 bit value
    shortSigned 16 bit value
    intSigned 32 bit value
    longSigned 64 bit value
    double64 bit floating point value
    +

    -
    - - - +
    - -

    These different primitive types fall into a few useful classifications:

    - +

    These different primitive types fall into a few useful +classifications:

    - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + +
    signedsbyte, short, int, long, float, double
    unsignedubyte, ushort, uint, ulong
    integerubyte, sbyte, ushort, short, uint, int, ulong, long
    integralbool, ubyte, sbyte, ushort, short, uint, int, ulong, long
    floating pointfloat, double
    first classbool, ubyte, sbyte, ushort, short,
    - uint, int, ulong, long, float, double, - pointer
    signedsbyte, short, int, long, float, double
    unsignedubyte, ushort, uint, ulong
    integerubyte, sbyte, ushort, short, uint, int, ulong, long
    integralbool, ubyte, sbyte, ushort, short, uint, int, ulong, long
    floating pointfloat, double
    first classbool, ubyte, sbyte, ushort, short,
    +uint, int, ulong, long, float, double, pointer

    - -

    The first class types are perhaps the most -important. Values of these types are the only ones which can be produced by -instructions, passed as arguments, or used as operands to instructions. This -means that all structures and arrays must be manipulated either by pointer or by -component.

    - +

    The first class types are perhaps the +most important. Values of these types are the only ones which can be +produced by instructions, passed as arguments, or used as operands to +instructions. This means that all structures and arrays must be +manipulated either by pointer or by component.

    - - - +
    - -

    The real power in LLVM comes from the derived types in the system. This is -what allows a programmer to represent arrays, functions, pointers, and other -useful types. Note that these derived types may be recursive: For example, it -is possible to have a two dimensional array.

    - +

    The real power in LLVM comes from the derived types in the system. +This is what allows a programmer to represent arrays, functions, +pointers, and other useful types. Note that these derived types may be +recursive: For example, it is possible to have a two dimensional array.

    - - - +
    -
    Overview:
    -

    The array type is a very simple derived type that arranges elements -sequentially in memory. The array type requires a size (number of elements) and -an underlying data type.

    - +sequentially in memory. The array type requires a size (number of +elements) and an underlying data type.

    Syntax:
    - -
    -  [<# elements> x <elementtype>]
    -
    - -

    The number of elements is a constant integer value, elementtype may be any -type with a size.

    - +
      [<# elements> x <elementtype>]
    +

    The number of elements is a constant integer value, elementtype may +be any type with a size.

    Examples:
    - -

    - [40 x int ]: Array of 40 integer values.
    - [41 x int ]: Array of 41 integer values.
    - [40 x uint]: Array of 40 unsigned integer values.

    -

    - +

    [40 x int ]: Array of 40 integer values.
    +[41 x int ]: Array of 41 integer values.
    +[40 x uint]: Array of 40 unsigned integer values.

    +

    Here are some examples of multidimensional arrays:

    -

    - - - - - - - - - - - - + + + + + + + + + + + + + +
    [3 x [4 x int]]: 3x4 array integer values.
    [12 x [10 x float]]: 12x10 array of single precision floating point values.
    [2 x [3 x [4 x uint]]]: 2x3x4 array of unsigned integer values.
    [3 x [4 x int]]: 3x4 array integer values.
    [12 x [10 x float]]: 12x10 array of single precision floating point values.
    [2 x [3 x [4 x uint]]]: 2x3x4 array of unsigned integer values.

    -
    - - - +
    -
    Overview:
    - -

    The function type can be thought of as a function signature. It consists of -a return type and a list of formal parameter types. Function types are usually -used when to build virtual function tables (which are structures of pointers to -functions), for indirect function calls, and when defining a function.

    - -
    Syntax:
    - -
    -  <returntype> (<parameter list>)
    -
    - -

    Where '<parameter list>' is a comma-separated list of type -specifiers. Optionally, the parameter list may include a type ..., +

    The function type can be thought of as a function signature. It +consists of a return type and a list of formal parameter types. +Function types are usually used when to build virtual function tables +(which are structures of pointers to functions), for indirect function +calls, and when defining a function.

    +
    Syntax:
    +
      <returntype> (<parameter list>)
    +

    Where '<parameter list>' is a comma-separated list of +type specifiers. Optionally, the parameter list may include a type ..., which indicates that the function takes a variable number of arguments. Variable argument functions can access their arguments with the variable argument handling intrinsic functions.

    - + href="#int_varargs">variable argument handling intrinsic functions.

    Examples:
    -

    - - - - - - - - - - - - - + + + + + + + + + + + + + +
    int (int): function taking an int, returning an int
    float (int, int *) *: Pointer to a function that takes an - int and a pointer to int, - returning float.
    int (sbyte *, ...): A vararg function that takes at least one pointer to sbyte (signed char in C), which - returns an integer. This is the signature for printf in - LLVM.
    int (int): function taking an int, returning an int
    float (int, int *) *: Pointer to a function that takes +an int and a pointer to int, +returning float.
    int (sbyte *, ...): A vararg function that takes at least one pointer to sbyte (signed char in C), +which returns an integer. This is the signature for printf +in LLVM.

    -
    - - - +
    -
    Overview:
    - -

    The structure type is used to represent a collection of data members together -in memory. The packing of the field types is defined to match the ABI of the -underlying processor. The elements of a structure may be any type that has a -size.

    - -

    Structures are accessed using 'load and -'store' by getting a pointer to a field with the -'getelementptr' instruction.

    - +

    The structure type is used to represent a collection of data members +together in memory. The packing of the field types is defined to match +the ABI of the underlying processor. The elements of a structure may +be any type that has a size.

    +

    Structures are accessed using 'load +and 'store' by getting a pointer to a +field with the 'getelementptr' +instruction.

    Syntax:
    - -
    -  { <type list> }
    -
    - +
      { <type list> }
    Examples:
    -

    - - - - - - - - + + + + + + + + + +
    { int, int, int }: a triple of three int values
    { float, int (int) * }: A pair, where the first element is a float and the second - element is a pointer to a function that takes an int, returning an - int.
    { int, int, int }: a triple of three int values
    { float, int (int) * }: A pair, where the first element is a float and the +second element is a pointer to a function that takes an int, returning +an int.

    -
    - - - +
    -
    Overview:
    - -

    As in many languages, the pointer type represents a pointer or reference to -another object, which must live in memory.

    - +

    As in many languages, the pointer type represents a pointer or +reference to another object, which must live in memory.

    Syntax:
    -
    -  <type> *
    -
    - +
      <type> *
    Examples:
    -

    - - - - - - - - + + + + + + + + + +
    [4x int]*: pointer to array of four - int values
    int (int *) *: A pointer to a function that takes an int, returning an - int.
    [4x int]*: pointer to array +of four int values
    int (int *) *: A pointer to a function that takes an int, returning +an int.

    -
    - - - - - - - - - - - - - -
    - -

    LLVM programs are composed of "Module"s, each of which is a translation unit -of the input programs. Each module consists of functions, global variables, and -symbol table entries. Modules may be combined together with the LLVM linker, -which merges function (and global variable) definitions, resolves forward -declarations, and merges symbol table entries. Here is an example of the "hello -world" module:

    - -
    -; Declare the string constant as a global constant...
    -%.LC0 = internal constant [13 x sbyte] c"hello world\0A\00"          ; [13 x sbyte]*
    +-->
    +
    +
    +
    +
    +

    LLVM programs are composed of "Module"s, each of which is a +translation unit of the input programs. Each module consists of +functions, global variables, and symbol table entries. Modules may be +combined together with the LLVM linker, which merges function (and +global variable) definitions, resolves forward declarations, and merges +symbol table entries. Here is an example of the "hello world" module:

    +
    ; Declare the string constant as a global constant...
    +%.LC0 = internal constant [13 x sbyte] c"hello world\0A\00"          ; [13 x sbyte]*
     
     ; External declaration of the puts function
     declare int %puts(sbyte*)                                            ; int(sbyte*)* 
    @@ -623,307 +536,223 @@
     ; Definition of main function
     int %main() {                                                        ; int()* 
             ; Convert [13x sbyte]* to sbyte *...
    -        %cast210 = getelementptr [13 x sbyte]* %.LC0, long 0, long 0 ; sbyte*
    +        %cast210 = getelementptr [13 x sbyte]* %.LC0, long 0, long 0 ; sbyte*
     
             ; Call puts function to write out the string to stdout...
    -        call int %puts(sbyte* %cast210)                              ; int
    -        ret int 0
    -}
    -
    - -

    This example is made up of a global variable named -".LC0", an external declaration of the "puts" function, and a -function definition for "main".

    - - -In general, a module is made up of a list of global values, where both functions -and global variables are global values. Global values are represented by a -pointer to a memory location (in this case, a pointer to an array of char, and a -pointer to a function), and have one of the following linkage types:

    - + call int %puts(sbyte* %cast210) ; int + ret int 0
    }

    +

    This example is made up of a global variable +named ".LC0", an external declaration of the "puts" +function, and a function definition +for "main".

    + In general, a module is made up of a list of global +values, where both functions and global variables are global values. +Global values are represented by a pointer to a memory location (in +this case, a pointer to an array of char, and a pointer to a function), +and have one of the following linkage types: +

    - -
    internal - -
    Global values with internal linkage are only directly accessible by objects -in the current module. In particular, linking code into a module with an -internal global value may cause the internal to be renamed as necessary to avoid -collisions. Because the symbol is internal to the module, all references can be -updated. This corresponds to the notion of the 'static' keyword in C, -or the idea of "anonymous namespaces" in C++.

    - - -

    linkonce: - -
    "linkonce" linkage is similar to internal linkage, with -the twist that linking together two modules defining the same linkonce -globals will cause one of the globals to be discarded. This is typically used -to implement inline functions. Unreferenced linkonce globals are -allowed to be discarded.

    - - -

    weak: - -
    "weak" linkage is exactly the same as linkonce linkage, -except that unreferenced weak globals may not be discarded. This is -used to implement constructs in C such as "int X;" at global scope.

    - - -

    appending: - -
    "appending" linkage may only be applied to global variables of -pointer -to array type. When two global variables with appending linkage are linked -together, the two global arrays are appended together. This is the LLVM, -typesafe, equivalent of having the system linker append together "sections" with -identical names when .o files are linked.

    - - -

    externally visible: - -
    If none of the above identifiers are used, the global is externally visible, -meaning that it participates in linkage and can be used to resolve external -symbol references.

    - -

    - -

    For example, since the ".LC0" variable is defined to be internal, if -another module defined a ".LC0" variable and was linked with this one, -one of the two would be renamed, preventing a collision. Since "main" -and "puts" are external (i.e., lacking any linkage declarations), they -are accessible outside of the current module. It is illegal for a function -declaration to have any linkage type other than "externally visible".

    - +
    internal
    +
    Global values with internal linkage are only directly accessible +by objects in the current module. In particular, linking code into a +module with an internal global value may cause the internal to be +renamed as necessary to avoid collisions. Because the symbol is +internal to the module, all references can be updated. This +corresponds to the notion of the 'static' keyword in C, or the +idea of "anonymous namespaces" in C++. +

    +
    +
    linkonce:
    +
    "linkonce" linkage is similar to internal +linkage, with the twist that linking together two modules defining the +same linkonce globals will cause one of the globals to be +discarded. This is typically used to implement inline functions. +Unreferenced linkonce globals are allowed to be discarded. +

    +
    +
    weak:
    +
    "weak" linkage is exactly the same as linkonce +linkage, except that unreferenced weak globals may not be +discarded. This is used to implement constructs in C such as "int +X;" at global scope. +

    +
    +
    appending:
    +
    "appending" linkage may only be applied to global +variables of pointer to array type. When two global variables with +appending linkage are linked together, the two global arrays are +appended together. This is the LLVM, typesafe, equivalent of having +the system linker append together "sections" with identical names when +.o files are linked. +

    +
    +
    externally visible:
    +
    If none of the above identifiers are used, the global is +externally visible, meaning that it participates in linkage and can be +used to resolve external symbol references. +

    +
    +
    + +

    +

    For example, since the ".LC0" +variable is defined to be internal, if another module defined a ".LC0" +variable and was linked with this one, one of the two would be renamed, +preventing a collision. Since "main" and "puts" are +external (i.e., lacking any linkage declarations), they are accessible +outside of the current module. It is illegal for a function declaration +to have any linkage type other than "externally visible".

    - - - +
    - -

    Global variables define regions of memory allocated at compilation time -instead of run-time. Global variables may optionally be initialized. A -variable may be defined as a global "constant", which indicates that the -contents of the variable will never be modified (opening options for -optimization). Constants must always have an initial value.

    - -

    As SSA values, global variables define pointer values that are in scope -(i.e. they dominate) for all basic blocks in the program. Global variables -always define a pointer to their "content" type because they describe a region -of memory, and all memory objects in LLVM are accessed through pointers.

    - +

    Global variables define regions of memory allocated at compilation +time instead of run-time. Global variables may optionally be +initialized. A variable may be defined as a global "constant", which +indicates that the contents of the variable will never be modified +(opening options for optimization). Constants must always have an +initial value.

    +

    As SSA values, global variables define pointer values that are in +scope (i.e. they dominate) for all basic blocks in the program. Global +variables always define a pointer to their "content" type because they +describe a region of memory, and all memory objects in LLVM are +accessed through pointers.

    - - - +
    - -

    LLVM function definitions are composed of a (possibly empty) argument list, -an opening curly brace, a list of basic blocks, and a closing curly brace. LLVM -function declarations are defined with the "declare" keyword, a -function name, and a function signature.

    - -

    A function definition contains a list of basic blocks, forming the CFG for -the function. Each basic block may optionally start with a label (giving the -basic block a symbol table entry), contains a list of instructions, and ends -with a terminator instruction (such as a branch or -function return).

    - -

    The first basic block in program is special in two ways: it is immediately -executed on entrance to the function, and it is not allowed to have predecessor -basic blocks (i.e. there can not be any branches to the entry block of a -function). Because the block can have no predecessors, it also cannot have any -PHI nodes.

    - +

    LLVM function definitions are composed of a (possibly empty) +argument list, an opening curly brace, a list of basic blocks, and a +closing curly brace. LLVM function declarations are defined with the "declare" +keyword, a function name, and a function signature.

    +

    A function definition contains a list of basic blocks, forming the +CFG for the function. Each basic block may optionally start with a +label (giving the basic block a symbol table entry), contains a list of +instructions, and ends with a terminator +instruction (such as a branch or function return).

    +

    The first basic block in program is special in two ways: it is +immediately executed on entrance to the function, and it is not allowed +to have predecessor basic blocks (i.e. there can not be any branches to +the entry block of a function). Because the block can have no +predecessors, it also cannot have any PHI nodes.

    - - + -
    - -

    The LLVM instruction set consists of several different classifications of -instructions: terminator instructions, binary instructions, memory -instructions, and other instructions.

    - +

    The LLVM instruction set consists of several different +classifications of instructions: terminator +instructions, binary instructions, memory instructions, and other +instructions.

    - - - +
    - -

    As mentioned previously, every basic block -in a program ends with a "Terminator" instruction, which indicates which block -should be executed after the current block is finished. These terminator -instructions typically yield a 'void' value: they produce control flow, -not values (the one exception being the 'invoke' instruction).

    - +

    As mentioned previously, every +basic block in a program ends with a "Terminator" instruction, which +indicates which block should be executed after the current block is +finished. These terminator instructions typically yield a 'void' +value: they produce control flow, not values (the one exception being +the 'invoke' instruction).

    There are five different terminator instructions: the 'ret' instruction, the 'br' instruction, the 'switch' instruction, the 'invoke' instruction, and the 'unwind' instruction.

    - + href="#i_ret">ret' instruction, the 'br' +instruction, the 'switch' instruction, +the 'invoke' instruction, and the 'unwind' instruction.

    - - - +
    -
    Syntax:
    -
    -  ret <type> <value>       ; Return a value from a non-void function
    +
      ret <type> <value>       ; Return a value from a non-void function
       ret void                 ; Return from void function
     
    -
    Overview:
    - -

    The 'ret' instruction is used to return control flow (and a value) -from a function, back to the caller.

    - -

    There are two forms of the 'ret' instructruction: one that returns a -value and then causes control flow, and one that just causes control flow to -occur.

    - -
    Arguments:
    - -

    The 'ret' instruction may return any 'first -class' type. Notice that a function is not well -formed if there exists a 'ret' instruction inside of the function -that returns a value that does not match the return type of the function.

    - -
    Semantics:
    - -

    When the 'ret' instruction is executed, control flow returns back to -the calling function's context. If the caller is a "call instruction, execution continues at the -instruction after the call. If the caller was an "invoke" instruction, execution continues at the -beginning "normal" of the destination block. If the instruction returns a -value, that value shall set the call or invoke instruction's return value.

    - +

    The 'ret' instruction is used to return control flow (and a +value) from a function, back to the caller.

    +

    There are two forms of the 'ret' instructruction: one that +returns a value and then causes control flow, and one that just causes +control flow to occur.

    +
    Arguments:
    +

    The 'ret' instruction may return any 'first class' type. Notice that a function is +not well formed if there exists a 'ret' +instruction inside of the function that returns a value that does not +match the return type of the function.

    +
    Semantics:
    +

    When the 'ret' instruction is executed, control flow +returns back to the calling function's context. If the caller is a "call instruction, execution continues at +the instruction after the call. If the caller was an "invoke" instruction, execution continues +at the beginning "normal" of the destination block. If the instruction +returns a value, that value shall set the call or invoke instruction's +return value.

    Example:
    -
    -  ret int 5                       ; Return an integer value of 5
    +
      ret int 5                       ; Return an integer value of 5
       ret void                        ; Return from a void function
     
    -
    - - - +
    -
    Syntax:
    - -
    -  br bool <cond>, label <iftrue>, label <iffalse>
    -  br label <dest>          ; Unconditional branch
    +
      br bool <cond>, label <iftrue>, label <iffalse>
    br label <dest> ; Unconditional branch
    -
    Overview:
    - -

    The 'br' instruction is used to cause control flow to transfer to a -different basic block in the current function. There are two forms of this -instruction, corresponding to a conditional branch and an unconditional -branch.

    - +

    The 'br' instruction is used to cause control flow to +transfer to a different basic block in the current function. There are +two forms of this instruction, corresponding to a conditional branch +and an unconditional branch.

    Arguments:
    - -

    The conditional branch form of the 'br' instruction takes a single -'bool' value and two 'label' values. The unconditional form -of the 'br' instruction takes a single 'label' value as a -target.

    - +

    The conditional branch form of the 'br' instruction takes a +single 'bool' value and two 'label' values. The +unconditional form of the 'br' instruction takes a single 'label' +value as a target.

    Semantics:
    - -

    Upon execution of a conditional 'br' instruction, the -'bool' argument is evaluated. If the value is true, control -flows to the 'iftrue' label argument. If "cond" is -false, control flows to the 'iffalse' label -argument.

    - +

    Upon execution of a conditional 'br' instruction, the 'bool' +argument is evaluated. If the value is true, control flows +to the 'iftrue' label argument. If "cond" is false, +control flows to the 'iffalse' label argument.

    Example:
    - -
    -Test:
    -  %cond = seteq int %a, %b
    -  br bool %cond, label %IfEqual, label %IfUnequal
    -IfEqual:
    -  ret int 1
    -IfUnequal:
    -  ret int 0
    -
    - +
    Test:
    %cond = seteq int %a, %b
    br bool %cond, label %IfEqual, label %IfUnequal
    IfEqual:
    ret int 1
    IfUnequal:
    ret int 0
    - - - +
    -
    Syntax:
    - -
    -  switch uint <value>, label <defaultdest> [ int <val>, label &dest>, ... ]
    -
    - +
      switch uint <value>, label <defaultdest> [ int <val>, label &dest>, ... ]
    Overview:
    - -

    The 'switch' instruction is used to transfer control flow to one of -several different places. It is a generalization of the 'br' +

    The 'switch' instruction is used to transfer control flow +to one of several different places. It is a generalization of the 'br' instruction, allowing a branch to occur to one of many possible destinations.

    -
    Arguments:
    -

    The 'switch' instruction uses three parameters: a 'uint' -comparison value 'value', a default 'label' destination, and -an array of pairs of comparison value constants and 'label's.

    - +comparison value 'value', a default 'label' +destination, and an array of pairs of comparison value constants and 'label's.

    Semantics:
    - -

    The switch instruction specifies a table of values and destinations. -When the 'switch' instruction is executed, this table is searched for -the given value. If the value is found, the corresponding destination is -branched to, otherwise the default value it transfered to.

    - +

    The switch instruction specifies a table of values and +destinations. When the 'switch' instruction is executed, this +table is searched for the given value. If the value is found, the +corresponding destination is branched to, otherwise the default value +it transfered to.

    Implementation:
    - -

    Depending on properties of the target machine and the particular -switch instruction, this instruction may be code generated as a series -of chained conditional branches, or with a lookup table.

    - -
    Example:
    - -
    -  ; Emulate a conditional br instruction
    -  %Val = cast bool %value to uint
    -  switch uint %Val, label %truedest [int 0, label %falsedest ]
    -
    -  ; Emulate an unconditional br instruction
    +

    Depending on properties of the target machine and the particular switch +instruction, this instruction may be code generated as a series of +chained conditional branches, or with a lookup table.

    +
    Example:
    +
      ; Emulate a conditional br instruction
    +  %Val = cast bool %value to uint
    switch uint %Val, label %truedest [int 0, label %falsedest ]

    ; Emulate an unconditional br instruction switch uint 0, label %dest [ ] ; Implement a jump table: @@ -931,934 +760,647 @@ int 1, label %onone, int 2, label %ontwo ]
    -
    - - - +
    -
    Syntax:
    - -
    -  <result> = invoke <ptr to function ty> %<function ptr val>(<function args>)
    -                 to label <normal label> except label <exception label>
    -
    - +
      <result> = invoke <ptr to function ty> %<function ptr val>(<function args>)
    to label <normal label> except label <exception label>
    Overview:
    - -

    The 'invoke' instruction causes control to transfer to a specified -function, with the possibility of control flow transfer to either the -'normal' label label or the 'exception' -label. If the callee function returns with the "ret" instruction, control flow will return to the -"normal" label. If the callee (or any indirect callees) returns with the "unwind" instruction, control is interrupted, and -continued at the dynamically nearest "except" label.

    - +

    The 'invoke' instruction causes control to transfer to a +specified function, with the possibility of control flow transfer to +either the 'normal' label label or the 'exception'label. +If the callee function returns with the "ret" +instruction, control flow will return to the "normal" label. If the +callee (or any indirect callees) returns with the "unwind" +instruction, control is interrupted, and continued at the dynamically +nearest "except" label.

    Arguments:
    -

    This instruction requires several arguments:

    -
      - -
    1. 'ptr to function ty': shall be the signature of the pointer to -function value being invoked. In most cases, this is a direct function -invocation, but indirect invokes are just as possible, branching off -an arbitrary pointer to function value. - -
    2. 'function ptr val': An LLVM value containing a pointer to a -function to be invoked. - -
    3. 'function args': argument list whose types match the function -signature argument types. If the function signature indicates the function -accepts a variable number of arguments, the extra arguments can be specified. - -
    4. 'normal label': the label reached when the called function executes -a 'ret' instruction. - -
    5. 'exception label': the label reached when a callee returns with the -unwind instruction. +
    6. 'ptr to function ty': shall be the signature of the +pointer to function value being invoked. In most cases, this is a +direct function invocation, but indirect invokes are just as +possible, branching off an arbitrary pointer to function value.
    7. +
    8. 'function ptr val': An LLVM value containing a pointer +to a function to be invoked.
    9. +
    10. 'function args': argument list whose types match the +function signature argument types. If the function signature indicates +the function accepts a variable number of arguments, the extra +arguments can be specified.
    11. +
    12. 'normal label': the label reached when the called +function executes a 'ret' instruction.
    13. +
    14. 'exception label': the label reached when a callee +returns with the unwind instruction.
    -
    Semantics:
    -

    This instruction is designed to operate as a standard 'call' instruction in most regards. The primary -difference is that it establishes an association with a label, which is used by the runtime library to unwind the stack.

    - -

    This instruction is used in languages with destructors to ensure that proper -cleanup is performed in the case of either a longjmp or a thrown -exception. Additionally, this is important for implementation of -'catch' clauses in high-level languages that support them.

    - + href="#i_call">call' instruction in most regards. The +primary difference is that it establishes an association with a label, +which is used by the runtime library to unwind the stack.

    +

    This instruction is used in languages with destructors to ensure +that proper cleanup is performed in the case of either a longjmp +or a thrown exception. Additionally, this is important for +implementation of 'catch' clauses in high-level languages that +support them.

    Example:
    - -
    -  %retval = invoke int %Test(int 15)
    -              to label %Continue
    -              except label %TestCleanup     ; {int}:retval set
    +
      %retval = invoke int %Test(int 15)
    to label %Continue
    except label %TestCleanup ; {int}:retval set
    -
    - - - +
    -
    Syntax:
    - -
    -  unwind
    -
    - +
      unwind
    Overview:
    - -

    The 'unwind' instruction unwinds the stack, continuing control flow -at the first callee in the dynamic call stack which used an invoke instruction to perform the call. This is -primarily used to implement exception handling.

    - +

    The 'unwind' instruction unwinds the stack, continuing +control flow at the first callee in the dynamic call stack which used +an invoke instruction to perform the +call. This is primarily used to implement exception handling.

    Semantics:
    - -

    The 'unwind' intrinsic causes execution of the current function to -immediately halt. The dynamic call stack is then searched for the first invoke instruction on the call stack. Once found, -execution continues at the "exceptional" destination block specified by the -invoke instruction. If there is no invoke instruction in the -dynamic call chain, undefined behavior results.

    - +

    The 'unwind' intrinsic causes execution of the current +function to immediately halt. The dynamic call stack is then searched +for the first invoke instruction on +the call stack. Once found, execution continues at the "exceptional" +destination block specified by the invoke instruction. If +there is no invoke instruction in the dynamic call chain, +undefined behavior results.

    - - - +
    - -

    Binary operators are used to do most of the computation in a program. They -require two operands, execute an operation on them, and produce a single value. -The result value of a binary operator is not necessarily the same type as its -operands.

    - +

    Binary operators are used to do most of the computation in a +program. They require two operands, execute an operation on them, and +produce a single value. The result value of a binary operator is not +necessarily the same type as its operands.

    There are several different binary operators:

    -
    - - - +
    -
    Syntax:
    - -
    -  <result> = add <ty> <var1>, <var2>   ; yields {ty}:result
    +
      <result> = add <ty> <var1>, <var2>   ; yields {ty}:result
     
    -
    Overview:
    -

    The 'add' instruction returns the sum of its two operands.

    -
    Arguments:
    -

    The two arguments to the 'add' instruction must be either integer or floating point -values. Both arguments must have identical types.

    - + href="#t_integer">integer or floating point +values. Both arguments must have identical types.

    Semantics:
    -

    The value produced is the integer or floating point sum of the two operands.

    -
    Example:
    - -
    -  <result> = add int 4, %var          ; yields {int}:result = 4 + %var
    +
      <result> = add int 4, %var          ; yields {int}:result = 4 + %var
     
    -
    - - - +
    -
    Syntax:
    - -
    -  <result> = sub <ty> <var1>, <var2>   ; yields {ty}:result
    +
      <result> = sub <ty> <var1>, <var2>   ; yields {ty}:result
     
    -
    Overview:
    -

    The 'sub' instruction returns the difference of its two operands.

    - -

    Note that the 'sub' instruction is used to represent the -'neg' instruction present in most other intermediate -representations.

    - +

    Note that the 'sub' instruction is used to represent the 'neg' +instruction present in most other intermediate representations.

    Arguments:
    -

    The two arguments to the 'sub' instruction must be either integer or floating point -values. Both arguments must have identical types.

    - + href="#t_integer">integer or floating point +values. Both arguments must have identical types.

    Semantics:
    - -

    The value produced is the integer or floating point difference of the two -operands.

    - +

    The value produced is the integer or floating point difference of +the two operands.

    Example:
    - -
    -  <result> = sub int 4, %var          ; yields {int}:result = 4 - %var
    +
      <result> = sub int 4, %var          ; yields {int}:result = 4 - %var
       <result> = sub int 0, %val          ; yields {int}:result = -%var
     
    -
    - - - +
    -
    Syntax:
    - -
    -  <result> = mul <ty> <var1>, <var2>   ; yields {ty}:result
    +
      <result> = mul <ty> <var1>, <var2>   ; yields {ty}:result
     
    -
    Overview:
    - -

    The 'mul' instruction returns the product of its two operands.

    - +

    The 'mul' instruction returns the product of its two +operands.

    Arguments:
    -

    The two arguments to the 'mul' instruction must be either integer or floating point -values. Both arguments must have identical types.

    - + href="#t_integer">integer or floating point +values. Both arguments must have identical types.

    Semantics:
    - -

    The value produced is the integer or floating point product of the two -operands.

    - -

    There is no signed vs unsigned multiplication. The appropriate action is -taken based on the type of the operand.

    - +

    The value produced is the integer or floating point product of the +two operands.

    +

    There is no signed vs unsigned multiplication. The appropriate +action is taken based on the type of the operand.

    Example:
    - -
    -  <result> = mul int 4, %var          ; yields {int}:result = 4 * %var
    +
      <result> = mul int 4, %var          ; yields {int}:result = 4 * %var
     
    -
    - - - +
    -
    Syntax:
    - -
    -  <result> = div <ty> <var1>, <var2>   ; yields {ty}:result
    +
      <result> = div <ty> <var1>, <var2>   ; yields {ty}:result
     
    -
    Overview:
    - -

    The 'div' instruction returns the quotient of its two operands.

    - +

    The 'div' instruction returns the quotient of its two +operands.

    Arguments:
    -

    The two arguments to the 'div' instruction must be either integer or floating point -values. Both arguments must have identical types.

    - + href="#t_integer">integer or floating point +values. Both arguments must have identical types.

    Semantics:
    - -

    The value produced is the integer or floating point quotient of the two -operands.

    - +

    The value produced is the integer or floating point quotient of the +two operands.

    Example:
    - -
    -  <result> = div int 4, %var          ; yields {int}:result = 4 / %var
    +
      <result> = div int 4, %var          ; yields {int}:result = 4 / %var
     
    -
    - - - +
    -
    Syntax:
    - -
    -  <result> = rem <ty> <var1>, <var2>   ; yields {ty}:result
    +
      <result> = rem <ty> <var1>, <var2>   ; yields {ty}:result
     
    -
    Overview:
    - -

    The 'rem' instruction returns the remainder from the division of its -two operands.

    - +

    The 'rem' instruction returns the remainder from the +division of its two operands.

    Arguments:
    -

    The two arguments to the 'rem' instruction must be either integer or floating point -values. Both arguments must have identical types.

    - + href="#t_integer">integer or floating point +values. Both arguments must have identical types.

    Semantics:
    - -

    This returns the remainder of a division (where the result has the -same sign as the divisor), not the modulus (where the result has the same -sign as the dividend) of a value. For more information about the difference, -see: The Math -Forum.

    - +

    This returns the remainder of a division (where the result +has the same sign as the divisor), not the modulus (where the +result has the same sign as the dividend) of a value. For more +information about the difference, see: The +Math Forum.

    Example:
    - -
    -  <result> = rem int 4, %var          ; yields {int}:result = 4 % %var
    +
      <result> = rem int 4, %var          ; yields {int}:result = 4 % %var
     
    -
    - - - +
    -
    Syntax:
    - -
    -  <result> = seteq <ty> <var1>, <var2>   ; yields {bool}:result
    +
      <result> = seteq <ty> <var1>, <var2>   ; yields {bool}:result
       <result> = setne <ty> <var1>, <var2>   ; yields {bool}:result
       <result> = setlt <ty> <var1>, <var2>   ; yields {bool}:result
       <result> = setgt <ty> <var1>, <var2>   ; yields {bool}:result
       <result> = setle <ty> <var1>, <var2>   ; yields {bool}:result
       <result> = setge <ty> <var1>, <var2>   ; yields {bool}:result
     
    - -
    Overview:
    - -

    The 'setcc' family of instructions returns a boolean value -based on a comparison of their two operands.

    - -
    Arguments:
    - -

    The two arguments to the 'setcc' instructions must be of first class type (it is not possible to compare -'label's, 'array's, 'structure' or 'void' -values, etc...). Both arguments must have identical types.

    - +
    Overview:
    +

    The 'setcc' family of instructions returns a boolean +value based on a comparison of their two operands.

    +
    Arguments:
    +

    The two arguments to the 'setcc' instructions must +be of first class type (it is not possible +to compare 'label's, 'array's, 'structure' +or 'void' values, etc...). Both arguments must have identical +types.

    Semantics:
    - -

    The 'seteq' instruction yields a true 'bool' value -if both operands are equal.
    - -The 'setne' instruction yields a true 'bool' value if -both operands are unequal.
    - -The 'setlt' instruction yields a true 'bool' value if -the first operand is less than the second operand.
    - -The 'setgt' instruction yields a true 'bool' value if -the first operand is greater than the second operand.
    - -The 'setle' instruction yields a true 'bool' value if -the first operand is less than or equal to the second operand.
    - -The 'setge' instruction yields a true 'bool' value if -the first operand is greater than or equal to the second operand.

    - +

    The 'seteq' instruction yields a true 'bool' +value if both operands are equal.
    +The 'setne' instruction yields a true 'bool' +value if both operands are unequal.
    +The 'setlt' instruction yields a true 'bool' +value if the first operand is less than the second operand.
    +The 'setgt' instruction yields a true 'bool' +value if the first operand is greater than the second operand.
    +The 'setle' instruction yields a true 'bool' +value if the first operand is less than or equal to the second operand.
    +The 'setge' instruction yields a true 'bool' +value if the first operand is greater than or equal to the second +operand.

    Example:
    - -
    -  <result> = seteq int   4, 5        ; yields {bool}:result = false
    +
      <result> = seteq int   4, 5        ; yields {bool}:result = false
       <result> = setne float 4, 5        ; yields {bool}:result = true
       <result> = setlt uint  4, 5        ; yields {bool}:result = true
       <result> = setgt sbyte 4, 5        ; yields {bool}:result = false
       <result> = setle sbyte 4, 5        ; yields {bool}:result = true
       <result> = setge sbyte 4, 5        ; yields {bool}:result = false
     
    -
    - - - +
    - -

    Bitwise binary operators are used to do various forms of bit-twiddling in a -program. They are generally very efficient instructions, and can commonly be -strength reduced from other instructions. They require two operands, execute an -operation on them, and produce a single value. The resulting value of the -bitwise binary operators is always the same type as its first operand.

    - +

    Bitwise binary operators are used to do various forms of +bit-twiddling in a program. They are generally very efficient +instructions, and can commonly be strength reduced from other +instructions. They require two operands, execute an operation on them, +and produce a single value. The resulting value of the bitwise binary +operators is always the same type as its first operand.

    - - - +
    -
    Syntax:
    - -
    -  <result> = and <ty> <var1>, <var2>   ; yields {ty}:result
    +
      <result> = and <ty> <var1>, <var2>   ; yields {ty}:result
     
    -
    Overview:
    - -

    The 'and' instruction returns the bitwise logical and of its two -operands.

    - +

    The 'and' instruction returns the bitwise logical and of +its two operands.

    Arguments:
    -

    The two arguments to the 'and' instruction must be integral values. Both arguments must have identical -types.

    - + href="#t_integral">integral values. Both arguments must have +identical types.

    Semantics:
    -

    The truth table used for the 'and' instruction is:

    - -

    +

    - - - - - -
    In0 In1 Out
    0 0 0
    0 1 0
    1 0 0
    1 1 1
    -

    - + + + In0 + In1 + Out + + + 0 + 0 + 0 + + + 0 + 1 + 0 + + + 1 + 0 + 0 + + + 1 + 1 + 1 + + + +
    Example:
    - -
    -  <result> = and int 4, %var         ; yields {int}:result = 4 & %var
    +
      <result> = and int 4, %var         ; yields {int}:result = 4 & %var
       <result> = and int 15, 40          ; yields {int}:result = 8
       <result> = and int 4, 8            ; yields {int}:result = 0
     
    -
    - - - +
    -
    Syntax:
    - -
    -  <result> = or <ty> <var1>, <var2>   ; yields {ty}:result
    +
      <result> = or <ty> <var1>, <var2>   ; yields {ty}:result
     
    - -
    Overview:
    - -

    The 'or' instruction returns the bitwise logical inclusive or of its -two operands.

    - +
    Overview:
    +

    The 'or' instruction returns the bitwise logical inclusive +or of its two operands.

    Arguments:
    -

    The two arguments to the 'or' instruction must be integral values. Both arguments must have identical -types.

    - + href="#t_integral">integral values. Both arguments must have +identical types.

    Semantics:
    -

    The truth table used for the 'or' instruction is:

    - -

    -

    - - - - - -
    In0 In1 Out
    0 0 0
    0 1 1
    1 0 1
    1 1 1
    -

    - +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    In0In1Out
    000
    011
    101
    111
    +
    Example:
    - -
    -  <result> = or int 4, %var         ; yields {int}:result = 4 | %var
    +
      <result> = or int 4, %var         ; yields {int}:result = 4 | %var
       <result> = or int 15, 40          ; yields {int}:result = 47
       <result> = or int 4, 8            ; yields {int}:result = 12
     
    -
    - - - +
    -
    Syntax:
    - -
    -  <result> = xor <ty> <var1>, <var2>   ; yields {ty}:result
    +
      <result> = xor <ty> <var1>, <var2>   ; yields {ty}:result
     
    -
    Overview:
    - -

    The 'xor' instruction returns the bitwise logical exclusive or of -its two operands. The xor is used to implement the "one's complement" -operation, which is the "~" operator in C.

    - +

    The 'xor' instruction returns the bitwise logical exclusive +or of its two operands. The xor is used to implement the +"one's complement" operation, which is the "~" operator in C.

    Arguments:
    -

    The two arguments to the 'xor' instruction must be integral values. Both arguments must have identical -types.

    - + href="#t_integral">integral values. Both arguments must have +identical types.

    Semantics:
    -

    The truth table used for the 'xor' instruction is:

    - -

    -

    - - - - - -
    In0 In1 Out
    0 0 0
    0 1 1
    1 0 1
    1 1 0
    -

    - +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    In0In1Out
    000
    011
    101
    110
    +
    +

    Example:
    - -
    -  <result> = xor int 4, %var         ; yields {int}:result = 4 ^ %var
    +
      <result> = xor int 4, %var         ; yields {int}:result = 4 ^ %var
       <result> = xor int 15, 40          ; yields {int}:result = 39
       <result> = xor int 4, 8            ; yields {int}:result = 12
       <result> = xor int %V, -1          ; yields {int}:result = ~%V
     
    -
    - - - +
    -
    Syntax:
    - -
    -  <result> = shl <ty> <var1>, ubyte <var2>   ; yields {ty}:result
    +
      <result> = shl <ty> <var1>, ubyte <var2>   ; yields {ty}:result
     
    -
    Overview:
    - -

    The 'shl' instruction returns the first operand shifted to the left -a specified number of bits.

    - +

    The 'shl' instruction returns the first operand shifted to +the left a specified number of bits.

    Arguments:
    -

    The first argument to the 'shl' instruction must be an integer type. The second argument must be an -'ubyte' type.

    - + href="#t_integer">integer type. The second argument must be an 'ubyte' +type.

    Semantics:
    -

    The value produced is var1 * 2var2.

    -
    Example:
    - -
    -  <result> = shl int 4, ubyte %var   ; yields {int}:result = 4 << %var
    +
      <result> = shl int 4, ubyte %var   ; yields {int}:result = 4 << %var
       <result> = shl int 4, ubyte 2      ; yields {int}:result = 16
       <result> = shl int 1, ubyte 10     ; yields {int}:result = 1024
     
    -
    - - - +
    -
    Syntax:
    - -
    -  <result> = shr <ty> <var1>, ubyte <var2>   ; yields {ty}:result
    +
      <result> = shr <ty> <var1>, ubyte <var2>   ; yields {ty}:result
     
    -
    Overview:
    - -

    The 'shr' instruction returns the first operand shifted to the right -a specified number of bits.

    - +

    The 'shr' instruction returns the first operand shifted to +the right a specified number of bits.

    Arguments:
    -

    The first argument to the 'shr' instruction must be an integer type. The second argument must be an -'ubyte' type.

    - + href="#t_integer">integer type. The second argument must be an 'ubyte' +type.

    Semantics:
    - -

    If the first argument is a signed type, the most -significant bit is duplicated in the newly free'd bit positions. If the first -argument is unsigned, zero bits shall fill the empty positions.

    - +

    If the first argument is a signed type, the +most significant bit is duplicated in the newly free'd bit positions. +If the first argument is unsigned, zero bits shall fill the empty +positions.

    Example:
    - -
    -  <result> = shr int 4, ubyte %var   ; yields {int}:result = 4 >> %var
    +
      <result> = shr int 4, ubyte %var   ; yields {int}:result = 4 >> %var
       <result> = shr uint 4, ubyte 1     ; yields {uint}:result = 2
       <result> = shr int 4, ubyte 2      ; yields {int}:result = 1
       <result> = shr sbyte 4, ubyte 3    ; yields {sbyte}:result = 0
       <result> = shr sbyte -2, ubyte 1   ; yields {sbyte}:result = -1
     
    -
    - - - - +
    - -

    A key design point of an SSA-based representation is how it represents -memory. In LLVM, no memory locations are in SSA form, which makes things very -simple. This section describes how to read, write, allocate and free memory in -LLVM.

    - +

    A key design point of an SSA-based representation is how it +represents memory. In LLVM, no memory locations are in SSA form, which +makes things very simple. This section describes how to read, write, +allocate and free memory in LLVM.

    - - - +
    -
    Syntax:
    - -
    -  <result> = malloc <type>, uint <NumElements>     ; yields {type*}:result
    +
      <result> = malloc <type>, uint <NumElements>     ; yields {type*}:result
       <result> = malloc <type>                         ; yields {type*}:result
     
    -
    Overview:
    - -

    The 'malloc' instruction allocates memory from the system heap and -returns a pointer to it.

    - +

    The 'malloc' instruction allocates memory from the system +heap and returns a pointer to it.

    Arguments:
    - -

    The the 'malloc' instruction allocates -sizeof(<type>)*NumElements bytes of memory from the operating -system, and returns a pointer of the appropriate type to the program. The -second form of the instruction is a shorter version of the first instruction -that defaults to allocating one element.

    - +

    The the 'malloc' instruction allocates sizeof(<type>)*NumElements +bytes of memory from the operating system, and returns a pointer of the +appropriate type to the program. The second form of the instruction is +a shorter version of the first instruction that defaults to allocating +one element.

    'type' must be a sized type.

    -
    Semantics:
    - -

    Memory is allocated using the system "malloc" function, and a -pointer is returned.

    - +

    Memory is allocated using the system "malloc" function, and +a pointer is returned.

    Example:
    +
      %array  = malloc [4 x ubyte ]                    ; yields {[%4 x ubyte]*}:array
     
    -
    -  %array  = malloc [4 x ubyte ]                    ; yields {[%4 x ubyte]*}:array
    -
    -  %size   = add uint 2, 2                          ; yields {uint}:size = uint 4
    +  %size   = add uint 2, 2                          ; yields {uint}:size = uint 4
       %array1 = malloc ubyte, uint 4                   ; yields {ubyte*}:array1
       %array2 = malloc [12 x ubyte], uint %size        ; yields {[12 x ubyte]*}:array2
     
    -
    - - - +
    -
    Syntax:
    - -
    -  free <type> <value>                              ; yields {void}
    +
      free <type> <value>                              ; yields {void}
     
    -
    Overview:
    - -

    The 'free' instruction returns memory back to the unused memory -heap, to be reallocated in the future.

    - +

    The 'free' instruction returns memory back to the unused +memory heap, to be reallocated in the future.

    +

    Arguments:
    - -

    'value' shall be a pointer value that points to a value that was -allocated with the 'malloc' instruction.

    - +

    'value' shall be a pointer value that points to a value +that was allocated with the 'malloc' +instruction.

    Semantics:
    - -

    Access to the memory pointed to by the pointer is not longer defined after -this instruction executes.

    - +

    Access to the memory pointed to by the pointer is not longer defined +after this instruction executes.

    Example:
    -
    -  %array  = malloc [4 x ubyte]                    ; yields {[4 x ubyte]*}:array
    +
      %array  = malloc [4 x ubyte]                    ; yields {[4 x ubyte]*}:array
                 free   [4 x ubyte]* %array
     
    -
    - - - +
    -
    Syntax:
    - -
    -  <result> = alloca <type>, uint <NumElements>  ; yields {type*}:result
    +
      <result> = alloca <type>, uint <NumElements>  ; yields {type*}:result
       <result> = alloca <type>                      ; yields {type*}:result
     
    -
    Overview:
    - -

    The 'alloca' instruction allocates memory on the current stack frame -of the procedure that is live until the current function returns to its -caller.

    - -
    Arguments:
    - -

    The the 'alloca' instruction allocates -sizeof(<type>)*NumElements bytes of memory on the runtime stack, -returning a pointer of the appropriate type to the program. The second form of -the instruction is a shorter version of the first that defaults to allocating -one element.

    - +

    The 'alloca' instruction allocates memory on the current +stack frame of the procedure that is live until the current function +returns to its caller.

    +
    Arguments:
    +

    The the 'alloca' instruction allocates sizeof(<type>)*NumElements +bytes of memory on the runtime stack, returning a pointer of the +appropriate type to the program. The second form of the instruction is +a shorter version of the first that defaults to allocating one element.

    'type' may be any sized type.

    -
    Semantics:
    - -

    Memory is allocated, a pointer is returned. 'alloca'd memory is -automatically released when the function returns. The 'alloca' -instruction is commonly used to represent automatic variables that must have an -address available. When the function returns (either with the ret or invoke +

    Memory is allocated, a pointer is returned. 'alloca'd +memory is automatically released when the function returns. The 'alloca' +instruction is commonly used to represent automatic variables that must +have an address available. When the function returns (either with the ret or invoke instructions), the memory is reclaimed.

    -
    Example:
    - -
    -  %ptr = alloca int                              ; yields {int*}:ptr
    +
      %ptr = alloca int                              ; yields {int*}:ptr
       %ptr = alloca int, uint 4                      ; yields {int*}:ptr
     
    -
    - - - +
    -
    Syntax:
    - -
    -  <result> = load <ty>* <pointer>
    -  <result> = volatile load <ty>* <pointer>
    -
    - +
      <result> = load <ty>* <pointer>
    <result> = volatile load <ty>* <pointer>
    Overview:
    -

    The 'load' instruction is used to read from memory.

    -
    Arguments:
    - -

    The argument to the 'load' instruction specifies the memory address -to load from. The pointer must point to a first -class type. If the load is marked as volatile then the -optimizer is not allowed to modify the number or order of execution of this -load with other volatile load and store instructions.

    - +

    The argument to the 'load' instruction specifies the memory +address to load from. The pointer must point to a first class type. If the load is +marked as volatile then the optimizer is not allowed to modify +the number or order of execution of this load with other +volatile load and store +instructions.

    Semantics:
    -

    The location of memory pointed to is loaded.

    -
    Examples:
    - -
    -  %ptr = alloca int                               ; yields {int*}:ptr
    -  store int 3, int* %ptr                          ; yields {void}
    +
      %ptr = alloca int                               ; yields {int*}:ptr
    +  store int 3, int* %ptr                          ; yields {void}
       %val = load int* %ptr                           ; yields {int}:val = int 3
     
    -
    - - - +
    Syntax:
    - -
    -  store <ty> <value>, <ty>* <pointer>                   ; yields {void}
    +
      store <ty> <value>, <ty>* <pointer>                   ; yields {void}
       volatile store <ty> <value>, <ty>* <pointer>                   ; yields {void}
     
    -
    Overview:
    -

    The 'store' instruction is used to write to memory.

    -
    Arguments:
    - -

    There are two arguments to the 'store' instruction: a value to store -and an address to store it into. The type of the '<pointer>' -operand must be a pointer to the type of the '<value>' operand. -If the store is marked as volatile then the optimizer is not -allowed to modify the number or order of execution of this store with -other volatile load and store -instructions.

    - -
    Semantics:
    - -

    The contents of memory are updated to contain '<value>' at the -location specified by the '<pointer>' operand.

    - -
    Example:
    - -
    -  %ptr = alloca int                               ; yields {int*}:ptr
    -  store int 3, int* %ptr                          ; yields {void}
    +

    There are two arguments to the 'store' instruction: a value +to store and an address to store it into. The type of the '<pointer>' +operand must be a pointer to the type of the '<value>' +operand. If the store is marked as volatile then the +optimizer is not allowed to modify the number or order of execution of +this store with other volatile load and store instructions.

    +
    Semantics:
    +

    The contents of memory are updated to contain '<value>' +at the location specified by the '<pointer>' operand.

    +
    Example:
    +
      %ptr = alloca int                               ; yields {int*}:ptr
    +  store int 3, int* %ptr                          ; yields {void}
       %val = load int* %ptr                           ; yields {int}:val = int 3
     
    - - - - - +
    -
    Syntax:
    - -
    -  <result> = getelementptr <ty>* <ptrval>{, long <aidx>|, ubyte <sidx>}*
    -
    - +
      <result> = getelementptr <ty>* <ptrval>{, long <aidx>|, ubyte <sidx>}*
    Overview:
    - -

    The 'getelementptr' instruction is used to get the address of a -subelement of an aggregate data structure.

    - +

    The 'getelementptr' instruction is used to get the address +of a subelement of an aggregate data structure.

    Arguments:
    -

    This instruction takes a list of long values and ubyte -constants that indicate what form of addressing to perform. The actual types of -the arguments provided depend on the type of the first pointer argument. The -'getelementptr' instruction is used to index down through the type -levels of a structure.

    - -

    For example, let's consider a C code fragment and how it gets compiled to -LLVM:

    - -
    -struct RT {
    -  char A;
    -  int B[10][20];
    -  char C;
    -};
    -struct ST {
    -  int X;
    -  double Y;
    -  struct RT Z;
    -};
    -
    -int *foo(struct ST *s) {
    -  return &s[1].Z.B[5][13];
    -}
    -
    - +constants that indicate what form of addressing to perform. The actual +types of the arguments provided depend on the type of the first pointer +argument. The 'getelementptr' instruction is used to index +down through the type levels of a structure.

    +

    For example, let's consider a C code fragment and how it gets +compiled to LLVM:

    +
    struct RT {
    char A;
    int B[10][20];
    char C;
    };
    struct ST {
    int X;
    double Y;
    struct RT Z;
    };

    int *foo(struct ST *s) {
    return &s[1].Z.B[5][13];
    }

    The LLVM code generated by the GCC frontend is:

    - -
    -%RT = type { sbyte, [10 x [20 x int]], sbyte }
    -%ST = type { int, double, %RT }
    -
    -int* "foo"(%ST* %s) {
    -  %reg = getelementptr %ST* %s, long 1, ubyte 2, ubyte 1, long 5, long 13
    -  ret int* %reg
    -}
    -
    - +
    %RT = type { sbyte, [10 x [20 x int]], sbyte }
    %ST = type { int, double, %RT }

    int* "foo"(%ST* %s) {
    %reg = getelementptr %ST* %s, long 1, ubyte 2, ubyte 1, long 5, long 13
    ret int* %reg
    }
    Semantics:
    - -

    The index types specified for the 'getelementptr' instruction depend -on the pointer type that is being index into. Pointer -and array types require 'long' values, and structure types require 'ubyte' -constants.

    - +

    The index types specified for the 'getelementptr' +instruction depend on the pointer type that is being index into. Pointer and array types +require 'long' values, and structure +types require 'ubyte' constants.

    In the example above, the first index is indexing into the '%ST*' -type, which is a pointer, yielding a '%ST' = '{ int, double, %RT -}' type, a structure. The second index indexes into the third element of -the structure, yielding a '%RT' = '{ sbyte, [10 x [20 x int]], -sbyte }' type, another structure. The third index indexes into the second -element of the structure, yielding a '[10 x [20 x int]]' type, an -array. The two dimensions of the array are subscripted into, yielding an -'int' type. The 'getelementptr' instruction return a pointer -to this element, thus yielding a 'int*' type.

    - -

    Note that it is perfectly legal to index partially through a structure, -returning a pointer to an inner element. Because of this, the LLVM code for the -given testcase is equivalent to:

    - -
    -int* "foo"(%ST* %s) {
    -  %t1 = getelementptr %ST* %s , long 1                        ; yields %ST*:%t1
    +type, which is a pointer, yielding a '%ST' = '{ int,
    +double, %RT }' type, a structure.  The second index indexes into
    +the third element of the structure, yielding a '%RT' = '{
    +sbyte, [10 x [20 x int]], sbyte }' type, another structure.  The
    +third index indexes into the second element of the structure, yielding
    +a '[10 x [20 x int]]' type, an array.  The two dimensions of
    +the array are subscripted into, yielding an 'int' type.  The 'getelementptr'
    +instruction return a pointer to this element, thus yielding a 'int*'
    +type.

    +

    Note that it is perfectly legal to index partially through a +structure, returning a pointer to an inner element. Because of this, +the LLVM code for the given testcase is equivalent to:

    +
    int* "foo"(%ST* %s) {
    %t1 = getelementptr %ST* %s , long 1 ; yields %ST*:%t1 %t2 = getelementptr %ST* %t1, long 0, ubyte 2 ; yields %RT*:%t2 %t3 = getelementptr %RT* %t2, long 0, ubyte 1 ; yields [10 x [20 x int]]*:%t3 %t4 = getelementptr [10 x [20 x int]]* %t3, long 0, long 5 ; yields [20 x int]*:%t4 @@ -1866,450 +1408,281 @@ ret int* %t5 }
    -
    Example:
    - -
    -  ; yields [12 x ubyte]*:aptr
    -  %aptr = getelementptr {int, [12 x ubyte]}* %sptr, long 0, ubyte 1
    -
    - -
    - +
      ; yields [12 x ubyte]*:aptr
    +  %aptr = getelementptr {int, [12 x ubyte]}* %sptr, long 0, ubyte 1
    +
     Note To The Novice:
    +When using indexing into global arrays with the 'getelementptr' +instruction, you must remember that the  - - +
    - -

    The instructions in this catagory are the "miscellaneous" instructions, which -defy better classification.

    - +

    The instructions in this catagory are the "miscellaneous" +instructions, which defy better classification.

    - - - +
    -
    Syntax:
    - -
    -  <result> = phi <ty> [ <val0>, <label0>], ...
    -
    - +
      <result> = phi <ty> [ <val0>, <label0>], ...
    Overview:
    - -

    The 'phi' instruction is used to implement the φ node in the SSA -graph representing the function.

    - +

    The 'phi' instruction is used to implement the φ node in +the SSA graph representing the function.

    Arguments:
    - -

    The type of the incoming values are specified with the first type field. -After this, the 'phi' instruction takes a list of pairs as arguments, -with one pair for each predecessor basic block of the current block. Only -values of first class type may be used as the value -arguments to the PHI node. Only labels may be used as the label arguments.

    - -

    There must be no non-phi instructions between the start of a basic block and -the PHI instructions: i.e. PHI instructions must be first in a basic block.

    - +

    The type of the incoming values are specified with the first type +field. After this, the 'phi' instruction takes a list of pairs +as arguments, with one pair for each predecessor basic block of the +current block. Only values of first class +type may be used as the value arguments to the PHI node. Only labels +may be used as the label arguments.

    +

    There must be no non-phi instructions between the start of a basic +block and the PHI instructions: i.e. PHI instructions must be first in +a basic block.

    Semantics:
    - -

    At runtime, the 'phi' instruction logically takes on the value -specified by the parameter, depending on which basic block we came from in the -last terminator instruction.

    - +

    At runtime, the 'phi' instruction logically takes on the +value specified by the parameter, depending on which basic block we +came from in the last terminator instruction.

    Example:
    - -
    -Loop:       ; Infinite loop that counts from 0 on up...
    -  %indvar = phi uint [ 0, %LoopHeader ], [ %nextindvar, %Loop ]
    -  %nextindvar = add uint %indvar, 1
    -  br label %Loop
    -
    - +
    Loop:       ; Infinite loop that counts from 0 on up...
    %indvar = phi uint [ 0, %LoopHeader ], [ %nextindvar, %Loop ]
    %nextindvar = add uint %indvar, 1
    br label %Loop
    - - - +
    -
    Syntax:
    - -
    -  <result> = cast <ty> <value> to <ty2>             ; yields ty2
    +
      <result> = cast <ty> <value> to <ty2>             ; yields ty2
     
    -
    Overview:
    - -

    The 'cast' instruction is used as the primitive means to convert -integers to floating point, change data type sizes, and break type safety (by -casting pointers).

    - +

    The 'cast' instruction is used as the primitive means to +convert integers to floating point, change data type sizes, and break +type safety (by casting pointers).

    Arguments:
    - -

    The 'cast' instruction takes a value to cast, which must be a first -class value, and a type to cast it to, which must also be a first class type.

    - +

    The 'cast' instruction takes a value to cast, which must be +a first class value, and a type to cast it to, which must also be a first class type.

    Semantics:
    - -

    This instruction follows the C rules for explicit casts when determining how -the data being cast must change to fit in its new container.

    - -

    When casting to bool, any value that would be considered true in the context -of a C 'if' condition is converted to the boolean 'true' +

    This instruction follows the C rules for explicit casts when +determining how the data being cast must change to fit in its new +container.

    +

    When casting to bool, any value that would be considered true in the +context of a C 'if' condition is converted to the boolean 'true' values, all else are 'false'.

    - -

    When extending an integral value from a type of one signness to another (for -example 'sbyte' to 'ulong'), the value is sign-extended if the -source value is signed, and zero-extended if the source value is -unsigned. bool values are always zero extended into either zero or -one.

    - +

    When extending an integral value from a type of one signness to +another (for example 'sbyte' to 'ulong'), the value +is sign-extended if the source value is signed, and +zero-extended if the source value is unsigned. bool values +are always zero extended into either zero or one.

    Example:
    - -
    -  %X = cast int 257 to ubyte              ; yields ubyte:1
    +
      %X = cast int 257 to ubyte              ; yields ubyte:1
       %Y = cast int 123 to bool               ; yields bool:true
     
    -
    - - - +
    -
    Syntax:
    - -
    -  <result> = call <ty>* <fnptrval>(<param list>)
    -
    - +
      <result> = call <ty>* <fnptrval>(<param list>)
    Overview:
    -

    The 'call' instruction represents a simple function call.

    -
    Arguments:
    -

    This instruction requires several arguments:

    -
      - -
    1. 'ty': shall be the signature of the pointer to function value - being invoked. The argument types must match the types implied by this - signature.

    2. - -
    3. 'fnptrval': An LLVM value containing a pointer to a function - to be invoked. In most cases, this is a direct function invocation, but - indirect calls are just as possible, calling an arbitrary pointer to - function values.

    4. - -
    5. 'function args': argument list whose types match the function - signature argument types. If the function signature indicates the function - accepts a variable number of arguments, the extra arguments can be - specified.

    6. - +
    7. +

      'ty': shall be the signature of the pointer to function +value being invoked. The argument types must match the types implied +by this signature.

      +
    8. +
    9. +

      'fnptrval': An LLVM value containing a pointer to a +function to be invoked. In most cases, this is a direct function +invocation, but indirect calls are just as possible, +calling an arbitrary pointer to function values.

      +
    10. +
    11. +

      'function args': argument list whose types match the +function signature argument types. If the function signature +indicates the function accepts a variable number of arguments, the +extra arguments can be specified.

      +
    - -
    Semantics:
    - -

    The 'call' instruction is used to cause control flow to transfer to -a specified function, with its incoming arguments bound to the specified values. -Upon a 'ret' instruction in the called function, -control flow continues with the instruction after the function call, and the -return value of the function is bound to the result argument. This is a simpler -case of the invoke instruction.

    - -
    Example:
    - -
    -  %retval = call int %test(int %argc)
    -  call int(sbyte*, ...) *%printf(sbyte* %msg, int 12, sbyte 42);
    -
    - -
    - - - - -
    - -
    Syntax:
    - -
    -  <resultarglist> = vanext <va_list> <arglist>, <argty>
    -
    - -
    Overview:
    - -

    The 'vanext' instruction is used to access arguments passed through -the "variable argument" area of a function call. It is used to implement the -va_arg macro in C.

    - -
    Arguments:
    - -

    This instruction takes a valist value and the type of the argument. -It returns another valist.

    -
    Semantics:
    - -

    The 'vanext' instruction advances the specified valist past -an argument of the specified type. In conjunction with the vaarg instruction, it is used to implement the -va_arg macro available in C. For more information, see the variable -argument handling Intrinsic Functions.

    - -

    It is legal for this instruction to be called in a function which does not -take a variable number of arguments, for example, the vfprintf +

    The 'call' instruction is used to cause control flow to +transfer to a specified function, with its incoming arguments bound to +the specified values. Upon a 'ret' +instruction in the called function, control flow continues with the +instruction after the function call, and the return value of the +function is bound to the result argument. This is a simpler case of +the invoke instruction.

    +
    Example:
    +
      %retval = call int %test(int %argc)
    call int(sbyte*, ...) *%printf(sbyte* %msg, int 12, sbyte 42);
    +
    + + +
    +
    Syntax:
    +
      <resultarglist> = vanext <va_list> <arglist>, <argty>
    +
    Overview:
    +

    The 'vanext' instruction is used to access arguments passed +through the "variable argument" area of a function call. It is used to +implement the va_arg macro in C.

    +
    Arguments:
    +

    This instruction takes a valist value and the type of the +argument. It returns another valist.

    +
    Semantics:
    +

    The 'vanext' instruction advances the specified valist +past an argument of the specified type. In conjunction with the vaarg instruction, it is used to implement +the va_arg macro available in C. For more information, see +the variable argument handling Intrinsic +Functions.

    +

    It is legal for this instruction to be called in a function which +does not take a variable number of arguments, for example, the vfprintf function.

    -

    vanext is an LLVM instruction instead of an intrinsic function because it takes an type as an -argument.

    - + href="#intrinsics">intrinsic function because it takes an type as +an argument.

    Example:
    - -

    See the variable argument processing section.

    - +

    See the variable argument processing +section.

    - - - +
    -
    Syntax:
    - -
    -  <resultval> = vaarg <va_list> <arglist>, <argty>
    -
    - +
      <resultval> = vaarg <va_list> <arglist>, <argty>
    Overview:
    - -

    The 'vaarg' instruction is used to access arguments passed through -the "variable argument" area of a function call. It is used to implement the -va_arg macro in C.

    - +

    The 'vaarg' instruction is used to access arguments passed +through the "variable argument" area of a function call. It is used to +implement the va_arg macro in C.

    Arguments:
    - -

    This instruction takes a valist value and the type of the argument. -It returns a value of the specified argument type.

    - +

    This instruction takes a valist value and the type of the +argument. It returns a value of the specified argument type.

    Semantics:
    - -

    The 'vaarg' instruction loads an argument of the specified type from -the specified va_list. In conjunction with the vanext instruction, it is used to implement the -va_arg macro available in C. For more information, see the variable -argument handling Intrinsic Functions.

    - -

    It is legal for this instruction to be called in a function which does not -take a variable number of arguments, for example, the vfprintf +

    The 'vaarg' instruction loads an argument of the specified +type from the specified va_list. In conjunction with the vanext instruction, it is used to +implement the va_arg macro available in C. For more +information, see the variable argument handling Intrinsic +Functions.

    +

    It is legal for this instruction to be called in a function which +does not take a variable number of arguments, for example, the vfprintf function.

    -

    vaarg is an LLVM instruction instead of an intrinsic function because it takes an type as an -argument.

    - + href="#intrinsics">intrinsic function because it takes an type as +an argument.

    Example:
    - -

    See the variable argument processing section.

    - +

    See the variable argument processing +section.

    - - + -
    - -

    LLVM supports the notion of an "intrinsic function". These functions have -well known names and semantics, and are required to follow certain restrictions. -Overall, these instructions represent an extension mechanism for the LLVM -language that does not require changing all of the transformations in LLVM to -add to the language (or the bytecode reader/writer, the parser, etc...).

    - -

    Intrinsic function names must all start with an "llvm." prefix, this -prefix is reserved in LLVM for intrinsic names, thus functions may not be named -this. Intrinsic functions must always be external functions: you cannot define -the body of intrinsic functions. Intrinsic functions may only be used in call -or invoke instructions: it is illegal to take the address of an intrinsic -function. Additionally, because intrinsic functions are part of the LLVM -language, it is required that they all be documented here if any are added.

    - -

    Unless an intrinsic function is target-specific, there must be a lowering -pass to eliminate the intrinsic or all backends must support the intrinsic -function.

    - +

    LLVM supports the notion of an "intrinsic function". These +functions have well known names and semantics, and are required to +follow certain restrictions. Overall, these instructions represent an +extension mechanism for the LLVM language that does not require +changing all of the transformations in LLVM to add to the language (or +the bytecode reader/writer, the parser, etc...).

    +

    Intrinsic function names must all start with an "llvm." +prefix, this prefix is reserved in LLVM for intrinsic names, thus +functions may not be named this. Intrinsic functions must always be +external functions: you cannot define the body of intrinsic functions. +Intrinsic functions may only be used in call or invoke instructions: it +is illegal to take the address of an intrinsic function. Additionally, +because intrinsic functions are part of the LLVM language, it is +required that they all be documented here if any are added.

    +

    Unless an intrinsic function is target-specific, there must be a +lowering pass to eliminate the intrinsic or all backends must support +the intrinsic function.

    - - - +
    -

    Variable argument support is defined in LLVM with the vanext instruction and these three intrinsic -functions. These functions are related to the similarly named macros defined in -the <stdarg.h> header file.

    - -

    All of these functions operate on arguments that use a target-specific value -type "va_list". The LLVM assembly language reference manual does not -define what this type is, so all transformations should be prepared to handle -intrinsics with any type used.

    - + href="#i_vanext">vanext instruction and these three +intrinsic functions. These functions are related to the similarly +named macros defined in the <stdarg.h> header file.

    +

    All of these functions operate on arguments that use a +target-specific value type "va_list". The LLVM assembly +language reference manual does not define what this type is, so all +transformations should be prepared to handle intrinsics with any type +used.

    This example shows how the vanext -instruction and the variable argument handling intrinsic functions are used.

    - -
    -int %test(int %X, ...) {
    -  ; Initialize variable argument processing
    -  %ap = call sbyte*()* %llvm.va_start()
    -
    -  ; Read a single integer argument
    -  %tmp = vaarg sbyte* %ap, int
    -
    -  ; Advance to the next argument
    -  %ap2 = vanext sbyte* %ap, int
    -
    -  ; Demonstrate usage of llvm.va_copy and llvm.va_end
    -  %aq = call sbyte* (sbyte*)* %llvm.va_copy(sbyte* %ap2)
    -  call void %llvm.va_end(sbyte* %aq)
    -
    -  ; Stop processing of arguments.
    -  call void %llvm.va_end(sbyte* %ap2)
    -  ret int %tmp
    -}
    -
    - +instruction and the variable argument handling intrinsic functions are +used.

    +
    int %test(int %X, ...) {
    ; Initialize variable argument processing
    %ap = call sbyte*()* %llvm.va_start()

    ; Read a single integer argument
    %tmp = vaarg sbyte* %ap, int

    ; Advance to the next argument
    %ap2 = vanext sbyte* %ap, int

    ; Demonstrate usage of llvm.va_copy and llvm.va_end
    %aq = call sbyte* (sbyte*)* %llvm.va_copy(sbyte* %ap2)
    call void %llvm.va_end(sbyte* %aq)

    ; Stop processing of arguments.
    call void %llvm.va_end(sbyte* %ap2)
    ret int %tmp
    }
    - - - +
    -
    Syntax:
    - -
    -  call va_list ()* %llvm.va_start()
    -
    - +
      call va_list ()* %llvm.va_start()
    Overview:
    -

    The 'llvm.va_start' intrinsic returns a new <arglist> for subsequent use by the variable argument intrinsics.

    -
    Semantics:
    -

    The 'llvm.va_start' intrinsic works just like the va_start -macro available in C. In a target-dependent way, it initializes and returns a -va_list element, so that the next vaarg will produce the first -variable argument passed to the function. Unlike the C va_start macro, -this intrinsic does not need to know the last argument of the function, the -compiler can figure that out.

    - -

    Note that this intrinsic function is only legal to be called from within the -body of a variable argument function.

    - +macro available in C. In a target-dependent way, it initializes and +returns a va_list element, so that the next vaarg +will produce the first variable argument passed to the function. Unlike +the C va_start macro, this intrinsic does not need to know the +last argument of the function, the compiler can figure that out.

    +

    Note that this intrinsic function is only legal to be called from +within the body of a variable argument function.

    - - - +
    -
    Syntax:
    - -
    -  call void (va_list)* %llvm.va_end(va_list <arglist>)
    -
    - +
      call void (va_list)* %llvm.va_end(va_list <arglist>)
    Overview:
    - -

    The 'llvm.va_end' intrinsic destroys <arglist> which -has been initialized previously with llvm.va_start or llvm.va_copy.

    - +

    The 'llvm.va_end' intrinsic destroys <arglist> +which has been initialized previously with llvm.va_start +or llvm.va_copy.

    Arguments:
    -

    The argument is a va_list to destroy.

    -
    Semantics:
    -

    The 'llvm.va_end' intrinsic works just like the va_end -macro available in C. In a target-dependent way, it destroys the -va_list. Calls to llvm.va_start and -llvm.va_copy must be matched exactly with -calls to llvm.va_end.

    - +macro available in C. In a target-dependent way, it destroys the va_list. +Calls to llvm.va_start and llvm.va_copy must be matched exactly +with calls to llvm.va_end.

    - - - +
    -
    Syntax:
    - -
    -  call va_list (va_list)* %llvm.va_copy(va_list <destarglist>)
    -
    - +
      call va_list (va_list)* %llvm.va_copy(va_list <destarglist>)
    Overview:
    - -

    The 'llvm.va_copy' intrinsic copies the current argument position -from the source argument list to the destination argument list.

    - +

    The 'llvm.va_copy' intrinsic copies the current argument +position from the source argument list to the destination argument list.

    Arguments:
    -

    The argument is the va_list to copy.

    -
    Semantics:
    -

    The 'llvm.va_copy' intrinsic works just like the va_copy -macro available in C. In a target-dependent way, it copies the source -va_list element into the returned list. This intrinsic is necessary -because the llvm.va_start intrinsic may be -arbitrarily complex and require memory allocation, for example.

    - +macro available in C. In a target-dependent way, it copies the source va_list +element into the returned list. This intrinsic is necessary because the llvm.va_start intrinsic may be arbitrarily +complex and require memory allocation, for example.

    - -
    - +
    Chris Lattner
    +The LLVM Compiler Infrastructure
    +Last modified: $Date: 2003/11/25 01:02:51 $ Index: llvm/docs/ProgrammersManual.html diff -u llvm/docs/ProgrammersManual.html:1.50 llvm/docs/ProgrammersManual.html:1.51 --- llvm/docs/ProgrammersManual.html:1.50 Mon Nov 10 18:14:41 2003 +++ llvm/docs/ProgrammersManual.html Mon Nov 24 19:02:51 2003 @@ -1,68 +1,75 @@ -LLVM Programmer's Manual - - - - - -
      LLVM Programmer's Manual
    - + + + LLVM Programmer's Manual + + + + + + + + +
      LLVM Programmer's Manual
      -
    1. Introduction +
    2. Introduction
    3. General Information - +-->
    4. + +
    5. Important and useful LLVM APIs - -
    6. Helpful Hints for Common Operations - +-->
    7. + +
    8. The Core LLVM Class Hierarchy Reference - - -

      Written by Chris Lattner, - Dinakar Dhurjati, and - Joel Stanley

      +

      Written by Chris Lattner,Dinakar Dhurjati, and Joel Stanley

      +

      +
    - - - - -
    -Introduction -
      - - -This document is meant to highlight some of the important classes and interfaces -available in the LLVM source-base. This manual is not intended to explain what -LLVM is, how it works, and what LLVM code looks like. It assumes that you know -the basics of LLVM and are interested in writing transformations or otherwise -analyzing or manipulating the code.

      - -This document should get you oriented so that you can find your way in the -continuously growing source code that makes up the LLVM infrastructure. Note -that this manual is not intended to serve as a replacement for reading the -source code, so if you think there should be a method in one of these classes to -do something, but it's not listed, check the source. Links to the doxygen sources are provided to make this as easy as -possible.

      - -The first section of this document describes general information that is useful -to know when working in the LLVM infrastructure, and the second describes the -Core LLVM classes. In the future this manual will be extended with information -describing how to use extension libraries, such as dominator information, CFG -traversal routines, and useful utilities like the InstVisitor template.

      - - -

    -
    -General Information -
      + + + + + + +
      Introduction
      +
        - -This section contains general information that is useful if you are working in -the LLVM source-base, but that isn't specific to any particular API.

        - - - -

      -
         - -The C++ Standard Template Library -
        - -LLVM makes heavy use of the C++ Standard Template Library (STL), perhaps much -more than you are used to, or have seen before. Because of this, you might want -to do a little background reading in the techniques used and capabilities of the -library. There are many good pages that discuss the STL, and several books on -the subject that you can get, so it will not be discussed in this document.

        - -Here are some useful links:

        - -

          -
        1. Dinkumware C++ -Library reference - an excellent reference for the STL and other parts of -the standard C++ library. - -
        2. C++ In a Nutshell - This is an -O'Reilly book in the making. It has a decent Standard Library -Reference that rivals Dinkumware's, and is actually free until the book is -published. - -
        3. C++ Frequently Asked -Questions - -
        4. SGI's STL Programmer's Guide - -Contains a useful Introduction to the -STL. - -
        5. Bjarne Stroustrup's C++ -Page - -

        - -You are also encouraged to take a look at the LLVM Coding Standards guide which focuses on how -to write maintainable code more than where to put your curly braces.

        - - -

      -
         - -Other useful references -
        - -LLVM is currently using CVS as its source versioning system. You may find this -reference handy:

        - -

          -
        1. CVS Branch and Tag -Primer
        2. -

        - +This document is meant to highlight some of the important classes and +interfaces available in the LLVM source-base. This manual is not +intended to explain what LLVM is, how it works, and what LLVM code looks +like. It assumes that you know the basics of LLVM and are interested +in writing transformations or otherwise analyzing or manipulating the +code. +

        This document should get you oriented so that you can find your +way in the continuously growing source code that makes up the LLVM +infrastructure. Note that this manual is not intended to serve as a +replacement for reading the source code, so if you think there should be +a method in one of these classes to do something, but it's not listed, +check the source. Links to the doxygen sources +are provided to make this as easy as possible.

        +

        The first section of this document describes general information +that is useful to know when working in the LLVM infrastructure, and the +second describes the Core LLVM classes. In the future this manual will +be extended with information describing how to use extension libraries, +such as dominator information, CFG traversal routines, and useful +utilities like the InstVisitor +template.

        +

        +
      + + + + + + +
      General Information
      +
        -
      -
      -Important and useful LLVM APIs -
        +This section contains general information that is useful if you are +working in the LLVM source-base, but that isn't specific to any +particular API. +

        +
      + + + + + + + +
         The C++ Standard Template +Library
      + + + + + + + + +
         Other useful references
      +
        +LLVM is currently using CVS as its source versioning system. You may +find this reference handy: +

        +
          +
        1. CVS +Branch and Tag Primer
        2. +
        +

        +
      + + + + + + +
      Important and useful LLVM +APIs
      +
        - -Here we highlight some LLVM APIs that are generally useful and good to know -about when writing transformations.

        - - -

      -
         - -The isa<>, cast<> and dyn_cast<> templates -
        - -The LLVM source-base makes extensive use of a custom form of RTTI. These -templates have many similarities to the C++ dynamic_cast<> -operator, but they don't have some drawbacks (primarily stemming from the fact -that dynamic_cast<> only works on classes that have a v-table). -Because they are used so often, you must know what they do and how they work. -All of these templates are defined in the Support/Casting.h file (note -that you very rarely have to include this file directly).

        - -

        - -
        isa<>: - -
        The isa<> operator works exactly like the Java -"instanceof" operator. It returns true or false depending on whether a -reference or pointer points to an instance of the specified class. This can be -very useful for constraint checking of various sorts (example below).

        - - -

        cast<>: - -
        The cast<> operator is a "checked cast" operation. It -converts a pointer or reference from a base class to a derived cast, causing an -assertion failure if it is not really an instance of the right type. This -should be used in cases where you have some information that makes you believe -that something is of the right type. An example of the isa<> and -cast<> template is:

        - -

        -static bool isLoopInvariant(const Value *V, const Loop *L) {
        -  if (isa<Constant>(V) || isa<Argument>(V) || isa<GlobalValue>(V))
        -    return true;
        -
        -  // Otherwise, it must be an instruction...
        -  return !L->contains(cast<Instruction>(V)->getParent());
        -

        - -Note that you should not use an isa<> test followed by a -cast<>, for that use the dyn_cast<> operator.

        - - -

        dyn_cast<>: - -
        The dyn_cast<> operator is a "checking cast" operation. It -checks to see if the operand is of the specified type, and if so, returns a -pointer to it (this operator does not work with references). If the operand is -not of the correct type, a null pointer is returned. Thus, this works very much -like the dynamic_cast operator in C++, and should be used in the same -circumstances. Typically, the dyn_cast<> operator is used in an -if statement or some other flow control statement like this:

        - -

        -  if (AllocationInst *AI = dyn_cast<AllocationInst>(Val)) {
        -    ...
        -  }
        -

        - -This form of the if statement effectively combines together a call to -isa<> and a call to cast<> into one statement, -which is very convenient.

        - -Another common example is:

        - -

        -  // Loop over all of the phi nodes in a basic block
        -  BasicBlock::iterator BBI = BB->begin();
        -  for (; PHINode *PN = dyn_cast<PHINode>(BBI); ++BBI)
        -    cerr << *PN;
        -

        - -Note that the dyn_cast<> operator, like C++'s -dynamic_cast or Java's instanceof operator, can be abused. In -particular you should not use big chained if/then/else blocks to check -for lots of different variants of classes. If you find yourself wanting to do -this, it is much cleaner and more efficient to use the InstVisitor class to -dispatch over the instruction type directly.

        - - -

        cast_or_null<>: - -
        The cast_or_null<> operator works just like the -cast<> operator, except that it allows for a null pointer as an -argument (which it then propagates). This can sometimes be useful, allowing you -to combine several null checks into one.

        - - -

        dyn_cast_or_null<>: - -
        The dyn_cast_or_null<> operator works just like the -dyn_cast<> operator, except that it allows for a null pointer as -an argument (which it then propagates). This can sometimes be useful, allowing -you to combine several null checks into one.

        - -

        - -These five templates can be used with any classes, whether they have a v-table -or not. To add support for these templates, you simply need to add -classof static methods to the class you are interested casting to. -Describing this is currently outside the scope of this document, but there are -lots of examples in the LLVM source base.

        - - - -

      -
         - -The DEBUG() macro & -debug option -
        - -Often when working on your pass you will put a bunch of debugging printouts and -other code into your pass. After you get it working, you want to remove -it... but you may need it again in the future (to work out new bugs that you run -across).

        - -Naturally, because of this, you don't want to delete the debug printouts, but -you don't want them to always be noisy. A standard compromise is to comment -them out, allowing you to enable them if you need them in the future.

        - -The "Support/Debug.h" file -provides a macro named DEBUG() that is a much nicer solution to this -problem. Basically, you can put arbitrary code into the argument of the -DEBUG macro, and it is only executed if 'opt' (or any other -tool) is run with the '-debug' command line argument: - -

        -     ... 
        -     DEBUG(std::cerr << "I am here!\n");
        -     ...
        -

        - -Then you can run your pass like this:

        - -

        -  $ opt < a.bc > /dev/null -mypass
        -    <no output>
        -  $ opt < a.bc > /dev/null -mypass -debug
        -    I am here!
        -  $
        -

        - -Using the DEBUG() macro instead of a home-brewed solution allows you to -now have to create "yet another" command line option for the debug output for -your pass. Note that DEBUG() macros are disabled for optimized builds, -so they do not cause a performance impact at all (for the same reason, they -should also not contain side-effects!).

        - -One additional nice thing about the DEBUG() macro is that you can -enable or disable it directly in gdb. Just use "set DebugFlag=0" or -"set DebugFlag=1" from the gdb if the program is running. If the -program hasn't been started yet, you can always just run it with --debug.

        - - -


      Fine grained debug info with - DEBUG_TYPE() and the -debug-only option

        - +Here we highlight some LLVM APIs that are generally useful and good to +know about when writing transformations. +

        +
      + + + + + + + +
         The isa<>, +cast<> and dyn_cast<> templates
      +
        +The LLVM source-base makes extensive use of a custom form of RTTI. +These templates have many similarities to the C++ dynamic_cast<> +operator, but they don't have some drawbacks (primarily stemming from +the fact that dynamic_cast<> only works on classes that +have a v-table). Because they are used so often, you must know what they +do and how they work. All of these templates are defined in the Support/Casting.h +file (note that you very rarely have to include this file directly). +

        +
        +
        isa<>:
        +
        The isa<> operator works exactly like the Java "instanceof" +operator. It returns true or false depending on whether a reference or +pointer points to an instance of the specified class. This can be very +useful for constraint checking of various sorts (example below). +

        +
        +
        cast<>:
        +
        The cast<> operator is a "checked cast" +operation. It converts a pointer or reference from a base class to a +derived cast, causing an assertion failure if it is not really an +instance of the right type. This should be used in cases where you have +some information that makes you believe that something is of the right +type. An example of the isa<> and cast<> +template is: +

        +
        static bool isLoopInvariant(const Value *V, const Loop *L) {
        if (isa<Constant>(V) || isa<Argument>(V) || isa<GlobalValue>(V))
        return true;

        // Otherwise, it must be an instruction...
        return !L->contains(cast<Instruction>(V)->getParent());
        +

        Note that you should not use an isa<> +test followed by a cast<>, for that use the dyn_cast<> +operator.

        +

        +
        +
        dyn_cast<>:
        +
        The dyn_cast<> operator is a "checking cast" +operation. It checks to see if the operand is of the specified type, and +if so, returns a pointer to it (this operator does not work with +references). If the operand is not of the correct type, a null pointer +is returned. Thus, this works very much like the dynamic_cast +operator in C++, and should be used in the same circumstances. +Typically, the dyn_cast<> operator is used in an if +statement or some other flow control statement like this: +

        +
          if (AllocationInst *AI = dyn_cast<AllocationInst>(Val)) {
        ...
        }
        +

        This form of the if statement effectively combines +together a call to isa<> and a call to cast<> +into one statement, which is very convenient.

        +

        Another common example is:

        +

        +
          // Loop over all of the phi nodes in a basic block
        BasicBlock::iterator BBI = BB->begin();
        for (; PHINode *PN = dyn_cast<PHINode>(BBI); ++BBI)
        cerr << *PN;
        +

        Note that the dyn_cast<> operator, like C++'s dynamic_cast +or Java's instanceof operator, can be abused. In particular +you should not use big chained if/then/else blocks to check for +lots of different variants of classes. If you find yourself wanting to +do this, it is much cleaner and more efficient to use the InstVisitor +class to dispatch over the instruction type directly.

        +

        +
        +
        cast_or_null<>:
        +
        The cast_or_null<> operator works just like the cast<> +operator, except that it allows for a null pointer as an argument (which +it then propagates). This can sometimes be useful, allowing you to +combine several null checks into one. +

        +
        +
        dyn_cast_or_null<>:
        +
        The dyn_cast_or_null<> operator works just like +the dyn_cast<> operator, except that it allows for a null +pointer as an argument (which it then propagates). This can sometimes +be useful, allowing you to combine several null checks into one. +

        +
        +
        +These five templates can be used with any classes, whether they have a +v-table or not. To add support for these templates, you simply need to +add classof static methods to the class you are interested +casting to. Describing this is currently outside the scope of this +document, but there are lots of examples in the LLVM source base. +

        +
      + + + + + + + +
         The DEBUG() macro +& -debug option
      +
        +Often when working on your pass you will put a bunch of debugging +printouts and other code into your pass. After you get it working, you +want to remove it... but you may need it again in the future (to work +out new bugs that you run across). +

        Naturally, because of this, you don't want to delete the debug +printouts, but you don't want them to always be noisy. A standard +compromise is to comment them out, allowing you to enable them if you +need them in the future.

        +

        The "Support/Debug.h" +file provides a macro named DEBUG() that is a much nicer +solution to this problem. Basically, you can put arbitrary code into +the argument of the DEBUG macro, and it is only executed if 'opt' +(or any other tool) is run with the '-debug' command line +argument:

        +
             ... 
        DEBUG(std::cerr << "I am here!\n");
        ...
        +

        Then you can run your pass like this:

        +

        +
          $ opt < a.bc > /dev/null -mypass
        <no output>
        $ opt < a.bc > /dev/null -mypass -debug
        I am here!
        $
        +

        Using the DEBUG() macro instead of a home-brewed solution +allows you to now have to create "yet another" command line option for +the debug output for your pass. Note that DEBUG() macros are +disabled for optimized builds, so they do not cause a performance impact +at all (for the same reason, they should also not contain +side-effects!).

        +

        One additional nice thing about the DEBUG() macro is that +you can enable or disable it directly in gdb. Just use "set +DebugFlag=0" or "set DebugFlag=1" from the gdb if the +program is running. If the program hasn't been started yet, you can +always just run it with -debug.

        +

        +
      +

      +
      Fine grained debug info with DEBUG_TYPE() and the -debug-only +option

      +
        Sometimes you may find yourself in a situation where enabling -debug -just turns on too much information (such as when working on the code -generator). If you want to enable debug information with more fine-grained -control, you define the DEBUG_TYPE macro and the -debug only -option as follows:

        - -

        -     ...
        -     DEBUG(std::cerr << "No debug type\n");
        -     #undef  DEBUG_TYPE
        -     #define DEBUG_TYPE "foo"
        -     DEBUG(std::cerr << "'foo' debug type\n");
        -     #undef  DEBUG_TYPE
        -     #define DEBUG_TYPE "bar"
        -     DEBUG(std::cerr << "'bar' debug type\n");
        -     #undef  DEBUG_TYPE
        -     #define DEBUG_TYPE ""
        -     DEBUG(std::cerr << "No debug type (2)\n");
        -     ...
        -

        - -Then you can run your pass like this:

        - -

        -  $ opt < a.bc > /dev/null -mypass
        -    <no output>
        -  $ opt < a.bc > /dev/null -mypass -debug
        -    No debug type
        -    'foo' debug type
        -    'bar' debug type
        -    No debug type (2)
        -  $ opt < a.bc > /dev/null -mypass -debug-only=foo
        -    'foo' debug type
        -  $ opt < a.bc > /dev/null -mypass -debug-only=bar
        -    'bar' debug type
        -  $
        -

        - -Of course, in practice, you should only set DEBUG_TYPE at the top of a -file, to specify the debug type for the entire module (if you do this before you -#include "Support/Debug.h", you don't have to insert the ugly -#undef's). Also, you should use names more meaningful that "foo" and -"bar", because there is no system in place to ensure that names do not conflict: -if two different modules use the same string, they will all be turned on when -the name is specified. This allows all, say, instruction scheduling, debug -information to be enabled with -debug-type=InstrSched, even if the -source lives in multiple files.

        - - - -

      -
         - -The Statistic template & -stats -option -
        - -The "Support/Statistic.h" -file provides a template named Statistic that is used as a unified way -to keeping track of what the LLVM compiler is doing and how effective various -optimizations are. It is useful to see what optimizations are contributing to -making a particular program run faster.

        - -Often you may run your pass on some big program, and you're interested to see -how many times it makes a certain transformation. Although you can do this with -hand inspection, or some ad-hoc method, this is a real pain and not very useful -for big programs. Using the Statistic template makes it very easy to -keep track of this information, and the calculated information is presented in a -uniform manner with the rest of the passes being executed.

        - -There are many examples of Statistic users, but this basics of using it -are as follows:

        - -

          -
        1. Define your statistic like this:

          - -

          -static Statistic<> NumXForms("mypassname", "The # of times I did stuff");
          -

          - -The Statistic template can emulate just about any data-type, but if you -do not specify a template argument, it defaults to acting like an unsigned int -counter (this is usually what you want).

          - -

        2. Whenever you make a transformation, bump the counter:

          - -

          -   ++NumXForms;   // I did stuff
          -

          - -

        - -That's all you have to do. To get 'opt' to print out the statistics -gathered, use the '-stats' option:

        - -

        -   $ opt -stats -mypassname < program.bc > /dev/null
        -    ... statistic output ...
        -

        - -When running gccas on a C file from the SPEC benchmark suite, it gives -a report that looks like this:

        - -

        -   7646 bytecodewriter  - Number of normal instructions
        -    725 bytecodewriter  - Number of oversized instructions
        - 129996 bytecodewriter  - Number of bytecode bytes written
        -   2817 raise           - Number of insts DCEd or constprop'd
        -   3213 raise           - Number of cast-of-self removed
        -   5046 raise           - Number of expression trees converted
        -     75 raise           - Number of other getelementptr's formed
        -    138 raise           - Number of load/store peepholes
        -     42 deadtypeelim    - Number of unused typenames removed from symtab
        -    392 funcresolve     - Number of varargs functions resolved
        -     27 globaldce       - Number of global variables removed
        -      2 adce            - Number of basic blocks removed
        -    134 cee             - Number of branches revectored
        -     49 cee             - Number of setcc instruction eliminated
        -    532 gcse            - Number of loads removed
        -   2919 gcse            - Number of instructions removed
        -     86 indvars         - Number of canonical indvars added
        -     87 indvars         - Number of aux indvars removed
        -     25 instcombine     - Number of dead inst eliminate
        -    434 instcombine     - Number of insts combined
        -    248 licm            - Number of load insts hoisted
        -   1298 licm            - Number of insts hoisted to a loop pre-header
        -      3 licm            - Number of insts hoisted to multiple loop preds (bad, no loop pre-header)
        -     75 mem2reg         - Number of alloca's promoted
        -   1444 cfgsimplify     - Number of blocks simplified
        -

        - -Obviously, with so many optimizations, having a unified framework for this stuff -is very nice. Making your pass fit well into the framework makes it more -maintainable and useful.

        - - - -

      -
      -Helpful Hints for Common Operations -

        +
      + + + + + + + +
         The Statistic +template & -stats option
      +
        +The "Support/Statistic.h" +file provides a template named Statistic that is used as a +unified way to keep track of what the LLVM compiler is doing and how +effective various optimizations are. It is useful to see what +optimizations are contributing to making a particular program run +faster. +

        Often you may run your pass on some big program, and you're +interested to see how many times it makes a certain transformation. +Although you can do this with hand inspection, or some ad-hoc method, +this is a real pain and not very useful for big programs. Using the Statistic +template makes it very easy to keep track of this information, and the +calculated information is presented in a uniform manner with the rest of +the passes being executed.

        +

        There are many examples of Statistic uses, but the basics +of using it are as follows:

        +

        +
          +
        1. Define your statistic like this: +

          +
          static Statistic<> NumXForms("mypassname", "The # of times I did stuff");
          +

          The Statistic template can emulate just about any +data-type, but if you do not specify a template argument, it defaults to +acting like an unsigned int counter (this is usually what you want).

          +

          +
        2. +
        3. Whenever you make a transformation, bump the counter: +

          +
             ++NumXForms;   // I did stuff
          +

          +
        4. +
        +

        That's all you have to do. To get 'opt' to print out the +statistics gathered, use the '-stats' option:

        +

        +
           $ opt -stats -mypassname < program.bc > /dev/null
        ... statistic output ...
        +

        When running gccas on a C file from the SPEC benchmark +suite, it gives a report that looks like this:

        +

        +
           7646 bytecodewriter  - Number of normal instructions
        725 bytecodewriter - Number of oversized instructions
        129996 bytecodewriter - Number of bytecode bytes written
        2817 raise - Number of insts DCEd or constprop'd
        3213 raise - Number of cast-of-self removed
        5046 raise - Number of expression trees converted
        75 raise - Number of other getelementptr's formed
        138 raise - Number of load/store peepholes
        42 deadtypeelim - Number of unused typenames removed from symtab
        392 funcresolve - Number of varargs functions resolved
        27 globaldce - Number of global variables removed
        2 adce - Number of basic blocks removed
        134 cee - Number of branches revectored
        49 cee - Number of setcc instruction eliminated
        532 gcse - Number of loads removed
        2919 gcse - Number ! of instructions removed
        86 indvars - Number of canonical indvars added
        87 indvars - Number of aux indvars removed
        25 instcombine - Number of dead inst eliminate
        434 instcombine - Number of insts combined
        248 licm - Number of load insts hoisted
        1298 licm - Number of insts hoisted to a loop pre-header
        3 licm - Number of insts hoisted to multiple loop preds (bad, no loop pre-header)
        75 mem2reg - Number of alloca's promoted
        1444 cfgsimplify - Number of blocks simplified
        +

        Obviously, with so many optimizations, having a unified framework +for this stuff is very nice. Making your pass fit well into the +framework makes it more maintainable and useful.

        +

        +
      + + + + + + +
      Helpful Hints for Common +Operations
      +
        + - -This section describes how to perform some very simple transformations of LLVM -code. This is meant to give examples of common idioms used, showing the -practical side of LLVM transformations.

        - -Because this is a "how-to" section, you should also read about the main classes -that you will be working with. The Core LLVM Class -Hierarchy Reference contains details and descriptions of the main classes -that you should know about.

        - - - - - -

      -
         - -Basic Inspection and Traversal Routines -
        - -The LLVM compiler infrastructure have many different data structures that may be -traversed. Following the example of the C++ standard template library, the -techniques used to traverse these various data structures are all basically the -same. For a enumerable sequence of values, the XXXbegin() function (or -method) returns an iterator to the start of the sequence, the XXXend() -function returns an iterator pointing to one past the last valid element of the -sequence, and there is some XXXiterator data type that is common -between the two operations.

        - -Because the pattern for iteration is common across many different aspects of the -program representation, the standard template library algorithms may be used on -them, and it is easier to remember how to iterate. First we show a few common -examples of the data structures that need to be traversed. Other data -structures are traversed in very similar ways.

        - - - -


      Iterating over the
      BasicBlocks in a Function

        - +This section describes how to perform some very simple transformations +of LLVM code. This is meant to give examples of common idioms used, +showing the practical side of LLVM transformations. +

        Because this is a "how-to" section, you should also read about the +main classes that you will be working with. The Core +LLVM Class Hierarchy Reference contains details and descriptions of +the main classes that you should know about.

        +

        +
      + + + + + + + +
         Basic Inspection and +Traversal Routines
      +
        +The LLVM compiler infrastructure have many different data structures +that may be traversed. Following the example of the C++ standard +template library, the techniques used to traverse these various data +structures are all basically the same. For a enumerable sequence of +values, the XXXbegin() function (or method) returns an iterator +to the start of the sequence, the XXXend() function returns an +iterator pointing to one past the last valid element of the sequence, +and there is some XXXiterator data type that is common between +the two operations. +

        Because the pattern for iteration is common across many different +aspects of the program representation, the standard template library +algorithms may be used on them, and it is easier to remember how to +iterate. First we show a few common examples of the data structures that +need to be traversed. Other data structures are traversed in very +similar ways.

        +

        +
      +

      +
      Iterating over the BasicBlocks in a Function

      +
        It's quite common to have a Function instance that you'd like -to transform in some way; in particular, you'd like to manipulate its -BasicBlocks. To facilitate this, you'll need to iterate over -all of the BasicBlocks that constitute the Function. -The following is an example that prints the name of a -BasicBlock and the number of Instructions it -contains: - -
        -  // func is a pointer to a Function instance
        -  for (Function::iterator i = func->begin(), e = func->end(); i != e; ++i) {
        -
        -      // print out the name of the basic block if it has one, and then the
        -      // number of instructions that it contains
        -
        -      cerr << "Basic block (name=" << i->getName() << ") has " 
        -           << i->size() << " instructions.\n";
        -  }
        -
        - +to transform in some way; in particular, you'd like to manipulate its BasicBlocks. +To facilitate this, you'll need to iterate over all of the BasicBlocks +that constitute the Function. The following is an example +that prints the name of a BasicBlock and the number of Instructions +it contains: +
          // func is a pointer to a Function instance
        for (Function::iterator i = func->begin(), e = func->end(); i != e; ++i) {

        // print out the name of the basic block if it has one, and then the
        // number of instructions that it contains

        cerr << "Basic block (name=" << i->getName() << ") has "
        << i->size() << " instructions.\n";
        }
        Note that i can be used as if it were a pointer for the purposes of invoking member functions of the Instruction class. This is because the indirection operator is overloaded for the iterator classes. In the above code, the expression i->size() is -exactly equivalent to (*i).size() just like you'd expect. - - -


      Iterating over the
      Instructions in a BasicBlock

        - -Just like when dealing with BasicBlocks in -Functions, it's easy to iterate over the individual -instructions that make up BasicBlocks. Here's a code snippet -that prints out each instruction in a BasicBlock: - -
        -  // blk is a pointer to a BasicBlock instance
        -  for (BasicBlock::iterator i = blk->begin(), e = blk->end(); i != e; ++i)
        -     // the next statement works since operator<<(ostream&,...) 
        -     // is overloaded for Instruction&
        -     cerr << *i << "\n";
        -
        - -However, this isn't really the best way to print out the contents of a -BasicBlock! Since the ostream operators are overloaded for -virtually anything you'll care about, you could have just invoked the -print routine on the basic block itself: cerr << *blk << -"\n";.

        - -Note that currently operator<< is implemented for Value*, so it -will print out the contents of the pointer, instead of -the pointer value you might expect. This is a deprecated interface that will -be removed in the future, so it's best not to depend on it. To print out the -pointer value for now, you must cast to void*.

        - - - -


      Iterating over the
      Instructions in a Function

        - -If you're finding that you commonly iterate over a Function's -BasicBlocks and then that BasicBlock's -Instructions, InstIterator should be used instead. -You'll need to include llvm/Support/InstIterator.h, and then -instantiate InstIterators explicitly in your code. Here's a -small example that shows how to dump all instructions in a function to -stderr (Note: Dereferencing an InstIterator yields an -Instruction*, not an Instruction&!): - -
        -#include "llvm/Support/InstIterator.h"
        -...
        -// Suppose F is a ptr to a function
        -for (inst_iterator i = inst_begin(F), e = inst_end(F); i != e; ++i)
        -  cerr << **i << "\n";
        -
        - +exactly equivalent to (*i).size() just like you'd expect. +
      +

      +
      Iterating over the Instructions in a BasicBlock

      +
        +Just like when dealing with BasicBlocks in Functions, +it's easy to iterate over the individual instructions that make up BasicBlocks. +Here's a code snippet that prints out each instruction in a BasicBlock: +
          // blk is a pointer to a BasicBlock instance
        for (BasicBlock::iterator i = blk->begin(), e = blk->end(); i != e; ++i)
        // the next statement works since operator<<(ostream&,...)
        // is overloaded for Instruction&
        cerr << *i << "\n";
        +However, this isn't really the best way to print out the contents of a BasicBlock! +Since the ostream operators are overloaded for virtually anything +you'll care about, you could have just invoked the print routine on the +basic block itself: cerr << *blk << "\n";. +

        Note that currently operator<< is implemented for Value*, +so it will print out the contents of the pointer, instead of the +pointer value you might expect. This is a deprecated interface that +will be removed in the future, so it's best not to depend on it. To +print out the pointer value for now, you must cast to void*.

        +

        +
      +

      +
      Iterating over the Instructions in a Function

      +
        +If you're finding that you commonly iterate over a Function's BasicBlocks +and then that BasicBlock's Instructions, InstIterator +should be used instead. You'll need to include llvm/Support/InstIterator.h, +and then instantiate InstIterators explicitly in your code. +Here's a small example that shows how to dump all instructions in a +function to stderr (Note: Dereferencing an InstIterator +yields an Instruction*, not an Instruction&!): +
        #include "llvm/Support/InstIterator.h"
        ...
        // Suppose F is a ptr to a function
        for (inst_iterator i = inst_begin(F), e = inst_end(F); i != e; ++i)
        cerr << **i << "\n";
        Easy, isn't it? You can also use InstIterators to fill a worklist with its initial contents. For example, if you wanted to -initialize a worklist to contain all instructions in a -Function F, all you would need to do is something like: - -
        -std::set<Instruction*> worklist;
        -worklist.insert(inst_begin(F), inst_end(F));
        -
        - -The STL set worklist would now contain all instructions in -the Function pointed to by F. - - -


      Turning an iterator into a class -pointer (and vice-versa)

      +

      +
      Turning an iterator into a class +pointer (and vice-versa)

      +
        Sometimes, it'll be useful to grab a reference (or pointer) to a class instance when all you've got at hand is an iterator. Well, extracting a reference or a pointer from an iterator is very straightforward. -Assuming that i is a BasicBlock::iterator and -j is a BasicBlock::const_iterator: - -
        -    Instruction& inst = *i;   // grab reference to instruction reference
        -    Instruction* pinst = &*i; // grab pointer to instruction reference
        -    const Instruction& inst = *j;
        -
        -However, the iterators you'll be working with in the LLVM framework -are special: they will automatically convert to a ptr-to-instance type +Assuming that i is a BasicBlock::iterator and j +is a BasicBlock::const_iterator: +
            Instruction& inst = *i;   // grab reference to instruction reference
        Instruction* pinst = &*i; // grab pointer to instruction reference
        const Instruction& inst = *j;
        +However, the iterators you'll be working with in the LLVM framework are +special: they will automatically convert to a ptr-to-instance type whenever they need to. Instead of dereferencing the iterator and then -taking the address of the result, you can simply assign the iterator -to the proper pointer type and you get the dereference and address-of +taking the address of the result, you can simply assign the iterator to +the proper pointer type and you get the dereference and address-of operation as a result of the assignment (behind the scenes, this is a result of overloading casting mechanisms). Thus the last line of the last example, - -
        Instruction* pinst = &*i;
        - +
        Instruction* pinst = &*i;
        is semantically equivalent to - -
        Instruction* pinst = i;
        - +
        Instruction* pinst = i;
        It's also possible to turn a class pointer into the corresponding iterator. Usually, this conversion is quite inexpensive. The following code snippet illustrates use of the conversion constructors provided by LLVM iterators. By using these, you can explicitly grab the iterator of something without actually obtaining it via iteration over some structure: - -
        -void printNextInstruction(Instruction* inst) {
        -    BasicBlock::iterator it(inst);
        -    ++it; // after this line, it refers to the instruction after *inst.
        -    if (it != inst->getParent()->end()) cerr << *it << "\n";
        -}
        -
        +
        void printNextInstruction(Instruction* inst) {
        BasicBlock::iterator it(inst);
        ++it; // after this line, it refers to the instruction after *inst.
        if (it != inst->getParent()->end()) cerr << *it << "\n";
        }
        Of course, this example is strictly pedagogical, because it'd be much -better to explicitly grab the next instruction directly from inst. - - - -


      Finding call sites: a slightly -more complex example

      +

      +
      Finding call sites: a slightly +more complex example

      +
        Say that you're writing a FunctionPass and would like to count all the -locations in the entire module (that is, across every -Function) where a certain function (i.e., some -Function*) is already in scope. As you'll learn later, you may -want to use an InstVisitor to accomplish this in a much more -straightforward manner, but this example will allow us to explore how -you'd do it if you didn't have InstVisitor around. In -pseudocode, this is what we want to do: - -
        -initialize callCounter to zero
        -for each Function f in the Module
        -    for each BasicBlock b in f
        -      for each Instruction i in b
        -        if (i is a CallInst and calls the given function)
        -          increment callCounter
        -
        - -And the actual code is (remember, since we're writing a -FunctionPass, our FunctionPass-derived class simply -has to override the runOnFunction method...): - -
        -Function* targetFunc = ...;
        -
        -class OurFunctionPass : public FunctionPass {
        -  public:
        -    OurFunctionPass(): callCounter(0) { }
        -
        -    virtual runOnFunction(Function& F) {
        - 	for (Function::iterator b = F.begin(), be = F.end(); b != be; ++b) {
        - 	    for (BasicBlock::iterator i = b->begin(); ie = b->end(); i != ie; ++i) {
        - 		if (CallInst* callInst = dyn_cast<CallInst>(&*i)) {
        - 		    // we know we've encountered a call instruction, so we
        - 		    // need to determine if it's a call to the
        -	            // function pointed to by m_func or not.
        -  
        - 		    if (callInst->getCalledFunction() == targetFunc)
        - 			++callCounter;
        - 	    }
        - 	}
        -    }
        -    
        -  private:
        -    unsigned  callCounter;
        -};
        -
        - - +locations in the entire module (that is, across every Function) +where a certain function (i.e., some Function*) is already in +scope. As you'll learn later, you may want to use an InstVisitor +to accomplish this in a much more straightforward manner, but this +example will allow us to explore how you'd do it if you didn't have InstVisitor +around. In pseudocode, this is what we want to do: +
        initialize callCounter to zero
        for each Function f in the Module
        for each BasicBlock b in f
        for each Instruction i in b
        if (i is a CallInst and calls the given function)
        increment callCounter
        +And the actual code is (remember, since we're writing a FunctionPass, +our FunctionPass-derived class simply has to override the runOnFunction +method...): +
        Function* targetFunc = ...;

        class OurFunctionPass : public FunctionPass {
        public:
        OurFunctionPass(): callCounter(0) { }

        virtual runOnFunction(Function& F) {
        for (Function::iterator b = F.begin(), be = F.end(); b != be; ++b) {
        for (BasicBlock::iterator i = b->begin(); ie = b->end(); i != ie; ++i) {
        if (CallInst* callInst = dyn_cast<CallInst>(&*i)) {
        // we know we've encountered a call instruction, so we
        // need to determine if it's a call to the
        // function pointed to by m_func or not.

        if (callInst->getCalledFunction() == targetFunc)
        ++callCounter;
        }
        }
        }

        private:
        unsigned callCounter;
        };
        -


      Treating calls and -invokes the same way

      +

      +
      Treating calls and invokes the +same way

      +
        +

        You may have noticed that the previous example was a bit oversimplified in that it did not deal with call sites generated by 'invoke' instructions. In this, and in other situations, you may find -that you want to treat CallInsts and InvokeInsts the -same way, even though their most-specific common base class is -Instruction, which includes lots of less closely-related -things. For these cases, LLVM provides a handy wrapper class called CallSite -. It is essentially a wrapper around an Instruction -pointer, with some methods that provide functionality common to -CallInsts and InvokeInsts.

        - -

        This class is supposed to have "value semantics". So it should be +that you want to treat CallInsts and InvokeInsts +the same way, even though their most-specific common base class is Instruction, +which includes lots of less closely-related things. For these cases, +LLVM provides a handy wrapper class called CallSite . +It is essentially a wrapper around an Instruction pointer, +with some methods that provide functionality common to CallInsts +and InvokeInsts.

        +

        This class is supposed to have "value semantics". So it should be passed by value, not by reference; it should not be dynamically allocated or deallocated using operator new or operator delete. It is efficiently copyable, assignable and constructable, with costs equivalents to that of a bare pointer. (You will notice, if you look at its definition, that it has only a single data member.)

        - - -


      Iterating over def-use & -use-def chains

      +

      +
      Iterating over def-use & +use-def chains

      +
        Frequently, we might have an instance of the Value Class and we want to + href="/doxygen/classValue.html">Value Class and we want to determine which Users use the Value. The list of -all Users of a particular Value is called a -def-use chain. For example, let's say we have a -Function* named F to a particular function -foo. Finding all of the instructions that use -foo is as simple as iterating over the def-use chain of -F: - -
        -Function* F = ...;
        -
        -for (Value::use_iterator i = F->use_begin(), e = F->use_end(); i != e; ++i) {
        -    if (Instruction *Inst = dyn_cast<Instruction>(*i)) {
        -        cerr << "F is used in instruction:\n";
        -        cerr << *Inst << "\n";
        -    }
        -}
        -
        - +all Users of a particular Value is called a def-use +chain. For example, let's say we have a Function* named F +to a particular function foo. Finding all of the instructions +that use foo is as simple as iterating over the def-use +chain of F: +
        Function* F = ...;

        for (Value::use_iterator i = F->use_begin(), e = F->use_end(); i != e; ++i) {
        if (Instruction *Inst = dyn_cast<Instruction>(*i)) {
        cerr << "F is used in instruction:\n";
        cerr << *Inst << "\n";
        }
        }
        Alternately, it's common to have an instance of the User Class and need to know what -Values are used by it. The list of all Values used -by a User is known as a use-def chain. Instances of -class Instruction are common Users, so we might want -to iterate over all of the values that a particular instruction uses -(that is, the operands of the particular Instruction): - -
        -Instruction* pi = ...;
        -
        -for (User::op_iterator i = pi->op_begin(), e = pi->op_end(); i != e; ++i) {
        -    Value* v = *i;
        -    ...
        -}
        -
        - - + href="/doxygen/classUser.html">User Class and need to know what Values +are used by it. The list of all Values used by a User +is known as a use-def chain. Instances of class Instruction +are common Users, so we might want to iterate over all of the +values that a particular instruction uses (that is, the operands of the +particular Instruction): +
        Instruction* pi = ...;

        for (User::op_iterator i = pi->op_begin(), e = pi->op_end(); i != e; ++i) {
        Value* v = *i;
        ...
        }
        - - -
      -
         - -Making simple changes -
        - +--> +
      + + + + + + + +
         Making simple +changes
      +
        There are some primitive transformation operations present in the LLVM infrastructure that are worth knowing about. When performing -transformations, it's fairly common to manipulate the contents of -basic blocks. This section describes some of the common methods for -doing so and gives example code. - - -


      Creating and inserting - new Instructions

      +

      +
      Creating and inserting new Instructions

      +
        + Instantiating Instructions +

        Creation of Instructions is straightforward: simply call +the constructor for the kind of instruction to instantiate and provide +the necessary parameters. For example, an AllocaInst only requires +a (const-ptr-to) Type. Thus:

        +
        AllocaInst* ai = new AllocaInst(Type::IntTy);
        will create an AllocaInst instance that represents the -allocation of one integer in the current stack frame, at runtime. -Each Instruction subclass is likely to have varying default -parameters which change the semantics of the instruction, so refer to -the doxygen documentation for -the subclass of Instruction that you're interested in -instantiating.

        - -

        Naming values

        - -

        -It is very useful to name the values of instructions when you're able -to, as this facilitates the debugging of your transformations. If you -end up looking at generated LLVM machine code, you definitely want to -have logical names associated with the results of instructions! By -supplying a value for the Name (default) parameter of the -Instruction constructor, you associate a logical name with -the result of the instruction's execution at runtime. For example, -say that I'm writing a transformation that dynamically allocates space -for an integer on the stack, and that integer is going to be used as -some kind of index by some other code. To accomplish this, I place an -AllocaInst at the first point in the first -BasicBlock of some Function, and I'm intending to -use it within the same Function. I might do: - -

        AllocaInst* pa = new AllocaInst(Type::IntTy, 0, "indexLoc");
        - +allocation of one integer in the current stack frame, at runtime. Each Instruction +subclass is likely to have varying default parameters which change the +semantics of the instruction, so refer to the doxygen documentation for the +subclass of Instruction that you're interested in instantiating. +

        Naming values

        +

        It is very useful to name the values of instructions when you're +able to, as this facilitates the debugging of your transformations. If +you end up looking at generated LLVM machine code, you definitely want +to have logical names associated with the results of instructions! By +supplying a value for the Name (default) parameter of the Instruction +constructor, you associate a logical name with the result of the +instruction's execution at runtime. For example, say that I'm writing a +transformation that dynamically allocates space for an integer on the +stack, and that integer is going to be used as some kind of index by +some other code. To accomplish this, I place an AllocaInst at +the first point in the first BasicBlock of some Function, +and I'm intending to use it within the same Function. I +might do:

        +
        AllocaInst* pa = new AllocaInst(Type::IntTy, 0, "indexLoc");
        where indexLoc is now the logical name of the instruction's -execution value, which is a pointer to an integer on the runtime -stack. -

        - -

        Inserting instructions

        - -

        -There are essentially two ways to insert an Instruction into -an existing sequence of instructions that form a BasicBlock: -

          -
        • Insertion into an explicit instruction list - -

          Given a BasicBlock* pb, an Instruction* pi within -that BasicBlock, and a newly-created instruction -we wish to insert before *pi, we do the following: - -

          -  BasicBlock *pb = ...;
          -  Instruction *pi = ...;
          -  Instruction *newInst = new Instruction(...);
          -  pb->getInstList().insert(pi, newInst); // inserts newInst before pi in pb
          -
          -

          - -
        • Insertion into an implicit instruction list -

          Instruction instances that are already in -BasicBlocks are implicitly associated with an existing -instruction list: the instruction list of the enclosing basic block. -Thus, we could have accomplished the same thing as the above code -without being given a BasicBlock by doing: -

          -  Instruction *pi = ...;
          -  Instruction *newInst = new Instruction(...);
          -  pi->getParent()->getInstList().insert(pi, newInst);
          -
          -In fact, this sequence of steps occurs so frequently that the -Instruction class and Instruction-derived classes -provide constructors which take (as a default parameter) a pointer to -an Instruction which the newly-created Instruction -should precede. That is, Instruction constructors are -capable of inserting the newly-created instance into the -BasicBlock of a provided instruction, immediately before that -instruction. Using an Instruction constructor with a -insertBefore (default) parameter, the above code becomes: -
          -Instruction* pi = ...;
          -Instruction* newInst = new Instruction(..., pi);
          -
          +execution value, which is a pointer to an integer on the runtime stack. +

          Inserting instructions

          +

          There are essentially two ways to insert an Instruction +into an existing sequence of instructions that form a BasicBlock:

          +
            +
          • Insertion into an explicit instruction list +

            Given a BasicBlock* pb, an Instruction* pi +within that BasicBlock, and a newly-created instruction we +wish to insert before *pi, we do the following:

            +
              BasicBlock *pb = ...;
            Instruction *pi = ...;
            Instruction *newInst = new Instruction(...);
            pb->getInstList().insert(pi, newInst); // inserts newInst before pi in pb
            +
          • +
          • Insertion into an implicit instruction list +

            Instruction instances that are already in BasicBlocks +are implicitly associated with an existing instruction list: the +instruction list of the enclosing basic block. Thus, we could have +accomplished the same thing as the above code without being given a BasicBlock +by doing:

            +
              Instruction *pi = ...;
            Instruction *newInst = new Instruction(...);
            pi->getParent()->getInstList().insert(pi, newInst);
            +In fact, this sequence of steps occurs so frequently that the Instruction +class and Instruction-derived classes provide constructors +which take (as a default parameter) a pointer to an Instruction +which the newly-created Instruction should precede. That is, Instruction +constructors are capable of inserting the newly-created instance into +the BasicBlock of a provided instruction, immediately before +that instruction. Using an Instruction constructor with a insertBefore +(default) parameter, the above code becomes: +
            Instruction* pi = ...;
            Instruction* newInst = new Instruction(..., pi);
            which is much cleaner, especially if you're creating a lot of -instructions and adding them to BasicBlocks. -

            -

            -
          - - -


        Deleting -Instructions

        -


      Replacing an - Instruction with another Value

        - -

        Replacing individual instructions

        -

        -Including "llvm/Transforms/Utils/BasicBlockUtils.h" permits use of two very useful replace functions: -ReplaceInstWithValue and ReplaceInstWithInst. - -

          - -
        • ReplaceInstWithValue - -

          This function replaces all uses (within a basic block) of a given -instruction with a value, and then removes the original instruction. -The following example illustrates the replacement of the result of a -particular AllocaInst that allocates memory for a single -integer with an null pointer to an integer.

          - -
          -AllocaInst* instToReplace = ...;
          -BasicBlock::iterator ii(instToReplace);
          -ReplaceInstWithValue(instToReplace->getParent()->getInstList(), ii,
          -                     Constant::getNullValue(PointerType::get(Type::IntTy)));
          -
          - -
        • ReplaceInstWithInst - -

          This function replaces a particular instruction with another -instruction. The following example illustrates the replacement of one -AllocaInst with another.

          - -

          -AllocaInst* instToReplace = ...;
          -BasicBlock::iterator ii(instToReplace);
          -ReplaceInstWithInst(instToReplace->getParent()->getInstList(), ii,
          -                    new AllocaInst(Type::IntTy, 0, "ptrToReplacedInt"));
          -
          - -
        -

        Replacing multiple uses of Users and - Values

        - -You can use Value::replaceAllUsesWith and -User::replaceUsesOfWith to change more than one use at a -time. See the doxygen documentation for the Value Class and User Class, respectively, for more -information. - -

        +
      +

      +
      Replacing an Instruction +with another Value

      + +

      Deleting Instructions

      +
        +
          +
        • ReplaceInstWithValue +

          This function replaces all uses (within a basic block) of a +given instruction with a value, and then removes the original +instruction. The following example illustrates the replacement of the +result of a particular AllocaInst that allocates memory for a +single integer with an null pointer to an integer.

          +
          AllocaInst* instToReplace = ...;
          BasicBlock::iterator ii(instToReplace);
          ReplaceInstWithValue(instToReplace->getParent()->getInstList(), ii,
          Constant::getNullValue(PointerType::get(Type::IntTy)));
          +
        • +
        • ReplaceInstWithInst +

          This function replaces a particular instruction with another +instruction. The following example illustrates the replacement of one AllocaInst +with another.

          +

          +
          AllocaInst* instToReplace = ...;
          BasicBlock::iterator ii(instToReplace);
          ReplaceInstWithInst(instToReplace->getParent()->getInstList(), ii,
          new AllocaInst(Type::IntTy, 0, "ptrToReplacedInt"));
          +
        • +
        +

        Replacing multiple uses of Users and Values

        +You can use Value::replaceAllUsesWith and User::replaceUsesOfWith +to change more than one use at a time. See the doxygen documentation +for the Value Class and User Class, respectively, for more +information. - - -
      -
      -The Core LLVM Class Hierarchy Reference -
        +--> +
      + + + + + + +
      The Core LLVM Class +Hierarchy Reference
      +
        - -The Core LLVM classes are the primary means of representing the program being -inspected or transformed. The core LLVM classes are defined in header files in -the include/llvm/ directory, and implemented in the lib/VMCore -directory.

        - - - -

      -
         - -The Value class -


      Important Public Members of -the Value class

      + + + + + + + +
         The Value class
      +
      +

      +
      Important Public Members of the Value +class

      +
        +
      • Value::use_iterator - Typedef for iterator over the +use-list
        + Value::use_const_iterator - Typedef for const_iterator over +the use-list
        + unsigned use_size() - Returns the number of users of the +value.
        bool use_empty() - Returns true if there are no users.
        - use_iterator use_begin() - - Get an iterator to the start of the use-list.
        - use_iterator use_end() - - Get an iterator to the end of the use-list.
        - User *use_back() - - Returns the last element in the list.

        - -These methods are the interface to access the def-use information in LLVM. As with all other iterators in LLVM, the naming conventions follow the conventions defined by the STL.

        - -

      • Type *getType() const

        -This method returns the Type of the Value. - -

      • bool hasName() const
        + use_iterator use_begin() - Get an iterator to the start of +the use-list.
        + use_iterator use_end() - Get an iterator to the end of the +use-list.
        + User *use_back() - Returns the last +element in the list. +

        These methods are the interface to access the def-use +information in LLVM. As with all other iterators in LLVM, the naming +conventions follow the conventions defined by the STL.

        +

        +
      • +
      • Type *getType() const +

        This method returns the Type of the Value.

        +
      • +
      • bool hasName() const
        std::string getName() const
        - void setName(const std::string &Name)

        - -This family of methods is used to access and assign a name to a Value, -be aware of the precaution above.

        - - -

      • void replaceAllUsesWith(Value *V)

        - -This method traverses the use list of a Value changing all Users of the current value to refer to "V" -instead. For example, if you detect that an instruction always produces a -constant value (for example through constant folding), you can replace all uses -of the instruction with the constant like this:

        - -

        -  Inst->replaceAllUsesWith(ConstVal);
        -

        - - - - -

      -
         - -The User class -
        - -#include "llvm/User.h"
        + void setName(const std::string &Name) +

        This family of methods is used to access and assign a name to a Value, +be aware of the precaution above.

        +

        + +
      • void replaceAllUsesWith(Value *V) +

        This method traverses the use list of a Value changing +all Users of the current value to refer to "V" +instead. For example, if you detect that an instruction always +produces a constant value (for example through constant folding), you +can replace all uses of the instruction with the constant like this:

        +

        +
          Inst->replaceAllUsesWith(ConstVal);
        +

        +
      • +
      + + + + + + + +
         The User class
      +
        + #include "llvm/User.h"
        doxygen info: User Class
        -Superclass: Value

        - - -The User class is the common base class of all LLVM nodes that may -refer to Values. It exposes a list of "Operands" -that are all of the Values that the User is -referring to. The User class itself is a subclass of -Value.

        - -The operands of a User point directly to the LLVM Value that it refers to. Because LLVM uses Static -Single Assignment (SSA) form, there can only be one definition referred to, -allowing this direct connection. This connection provides the use-def -information in LLVM.

        - - -


      Important Public Members of -the User class

      -
         - -The Instruction class -
        - -#include "llvm/Instruction.h"
        -doxygen info: Instruction Class
        -Superclasses: User, Value

        - -The Instruction class is the common base class for all LLVM -instructions. It provides only a few methods, but is a very commonly used -class. The primary data tracked by the Instruction class itself is the -opcode (instruction type) and the parent BasicBlock the Instruction is embedded -into. To represent a specific type of instruction, one of many subclasses of -Instruction are used.

        - -Because the Instruction class subclasses the User class, its operands can be accessed in the same -way as for other Users (with the -getOperand()/getNumOperands() and -op_begin()/op_end() methods).

        - -An important file for the Instruction class is the -llvm/Instruction.def file. This file contains some meta-data about the -various different types of instructions in LLVM. It describes the enum values -that are used as opcodes (for example Instruction::Add and -Instruction::SetLE), as well as the concrete sub-classes of -Instruction that implement the instruction (for example BinaryOperator and SetCondInst). Unfortunately, the use of macros in -this file confused doxygen, so these enum values don't show up correctly in the -doxygen output.

        - - - -


      Important Public Members of -the Instruction class

        - -
      • BasicBlock *getParent()

        - -Returns the BasicBlock that this -Instruction is embedded into.

        - -

      • bool mayWriteToMemory()

        - -Returns true if the instruction writes to memory, i.e. it is a call, -free, invoke, or store.

        - -

      • unsigned getOpcode()

        - -Returns the opcode for the Instruction.

        - -

      • Instruction *clone() const

        - -Returns another instance of the specified instruction, identical in all ways to -the original except that the instruction has no parent (ie it's not embedded -into a BasicBlock), and it has no name.

        - - - - - - - -

      -
         - -The BasicBlock class -
        - -#include "llvm/BasicBlock.h"
        +Superclass: Value +

        The User class is the common base class of all LLVM nodes +that may refer to Values. It exposes a +list of "Operands" that are all of the Values +that the User is referring to. The User class itself is a +subclass of Value.

        +

        The operands of a User point directly to the LLVM Value that it refers to. Because LLVM uses +Static Single Assignment (SSA) form, there can only be one definition +referred to, allowing this direct connection. This connection provides +the use-def information in LLVM.

        +

        +
      +

      +
      Important Public Members of the User +class

      +
        +The User class exposes the operand list in two ways: through +an index access interface and through an iterator based interface. +

        +
      • Value *getOperand(unsigned i)
        + unsigned getNumOperands() +

        These two methods expose the operands of the User in a +convenient form for direct access.

        +

        +
      • +
      • User::op_iterator - Typedef for iterator over the operand +list
        + User::op_const_iterator use_iterator op_begin() - +Get an iterator to the start of the operand list.
        + use_iterator op_end() - Get an iterator to the end of the +operand list. +

        Together, these methods make up the iterator based interface to +the operands of a User.

        +

        +
      • +
      + + + + + + + +
         The Instruction +class
      +
        + #include "llvm/Instruction.h"
        +doxygen info: Instruction +Class
        +Superclasses: User, Value +

        The Instruction class is the common base class for all +LLVM instructions. It provides only a few methods, but is a very +commonly used class. The primary data tracked by the Instruction +class itself is the opcode (instruction type) and the parent BasicBlock the Instruction is +embedded into. To represent a specific type of instruction, one of many +subclasses of Instruction are used.

        +

        Because the Instruction class subclasses the User class, its operands can be accessed in +the same way as for other Users (with the getOperand()/getNumOperands() +and op_begin()/op_end() methods).

        +

        An important file for the Instruction class is the llvm/Instruction.def +file. This file contains some meta-data about the various different +types of instructions in LLVM. It describes the enum values that are +used as opcodes (for example Instruction::Add and Instruction::SetLE), +as well as the concrete sub-classes of Instruction that +implement the instruction (for example BinaryOperator +and SetCondInst). Unfortunately, +the use of macros in this file confuses doxygen, so these enum values +don't show up correctly in the doxygen +output.

        +

        +
      +

      +
      Important Public Members of the Instruction +class

      +
        +
      • BasicBlock *getParent() +

        Returns the BasicBlock that +this Instruction is embedded into.

        +

        +
      • +
      • bool mayWriteToMemory() +

        Returns true if the instruction writes to memory, i.e. it is a call,free,invoke, +or store.

        +

        +
      • +
      • unsigned getOpcode() +

        Returns the opcode for the Instruction.

        +

        +
      • +
      • Instruction *clone() const +

        Returns another instance of the specified instruction, identical +in all ways to the original except that the instruction has no parent +(ie it's not embedded into a BasicBlock), +and it has no name

        +
      • +
      + + + + + + + +
         The BasicBlock +class
      +
        + #include "llvm/BasicBlock.h"
        doxygen info: BasicBlock Class
        -Superclass: Value

        - - -This class represents a single entry multiple exit section of the code, commonly -known as a basic block by the compiler community. The BasicBlock class -maintains a list of Instructions, which form -the body of the block. Matching the language definition, the last element of -this list of instructions is always a terminator instruction (a subclass of the -TerminatorInst class).

        - -In addition to tracking the list of instructions that make up the block, the -BasicBlock class also keeps track of the Function that it is embedded into.

        - -Note that BasicBlocks themselves are Values, because they are referenced by instructions -like branches and can go in the switch tables. BasicBlocks have type -label.

        - - - -


      Important Public Members of -the BasicBlock class

        - -
      • BasicBlock(const std::string &Name = "", Function *Parent = 0)

        - -The BasicBlock constructor is used to create new basic blocks for -insertion into a function. The constructor simply takes a name for the new -block, and optionally a Function to insert it -into. If the Parent parameter is specified, the new -BasicBlock is automatically inserted at the end of the specified Function, if not specified, the BasicBlock must be -manually inserted into the Function.

        - -

      • BasicBlock::iterator - Typedef for instruction list iterator
        +Superclass: Value +

        This class represents a single entry multiple exit section of the +code, commonly known as a basic block by the compiler community. The BasicBlock +class maintains a list of Instructions, +which form the body of the block. Matching the language definition, +the last element of this list of instructions is always a terminator +instruction (a subclass of the TerminatorInst +class).

        +

        In addition to tracking the list of instructions that make up the +block, the BasicBlock class also keeps track of the Function that it is embedded into.

        +

        Note that BasicBlocks themselves are Values, +because they are referenced by instructions like branches and can go in +the switch tables. BasicBlocks have type label.

        +

        +
      +

      +
      Important Public Members of the BasicBlock +class

      +
        +
      • BasicBlock(const std::string &Name = "", Function *Parent = 0) +

        The BasicBlock constructor is used to create new basic +blocks for insertion into a function. The constructor optionally takes +a name for the new block, and a Function +to insert it into. If the Parent parameter is specified, the +new BasicBlock is automatically inserted at the end of the +specified Function, if not specified, +the BasicBlock must be manually inserted into the Function.

        +

        +
      • +
      • BasicBlock::iterator - Typedef for instruction list +iterator
        BasicBlock::const_iterator - Typedef for const_iterator.
        - begin(), end(), front(), back(), - size(), empty(), rbegin(), rend()

        - -These methods and typedefs are forwarding functions that have the same semantics -as the standard library methods of the same names. These methods expose the -underlying instruction list of a basic block in a way that is easy to -manipulate. To get the full complement of container operations (including -operations to update the list), you must use the getInstList() -method.

        - -

      • BasicBlock::InstListType &getInstList()

        - -This method is used to get access to the underlying container that actually -holds the Instructions. This method must be used when there isn't a forwarding -function in the BasicBlock class for the operation that you would like -to perform. Because there are no forwarding functions for "updating" -operations, you need to use this if you want to update the contents of a -BasicBlock.

        - -

      • Function *getParent()

        - -Returns a pointer to Function the block is -embedded into, or a null pointer if it is homeless.

        - -

      • TerminatorInst *getTerminator()

        - -Returns a pointer to the terminator instruction that appears at the end of the -BasicBlock. If there is no terminator instruction, or if the last -instruction in the block is not a terminator, then a null pointer is -returned.

        - - - -

      -
         - -The GlobalValue class -
        - -#include "llvm/GlobalValue.h"
        -doxygen info: GlobalValue Class
        -Superclasses: User, Value

        - -Global values (GlobalVariables or Functions) are the only LLVM values that are -visible in the bodies of all Functions. -Because they are visible at global scope, they are also subject to linking with -other globals defined in different translation units. To control the linking -process, GlobalValues know their linkage rules. Specifically, -GlobalValues know whether they have internal or external linkage.

        - -If a GlobalValue has internal linkage (equivalent to being -static in C), it is not visible to code outside the current translation -unit, and does not participate in linking. If it has external linkage, it is -visible to external code, and does participate in linking. In addition to -linkage information, GlobalValues keep track of which Module they are currently part of.

        - -Because GlobalValues are memory objects, they are always referred to by -their address. As such, the Type of a global is -always a pointer to its contents. This is explained in the LLVM Language -Reference Manual.

        - - - -


      Important Public Members of -the GlobalValue class

      + + + + + + + +
         The GlobalValue +class
      +
        + #include "llvm/GlobalValue.h"
        +doxygen info: GlobalValue +Class
        +Superclasses: User, Value +

        Global values (GlobalVariables +or Functions) are the only LLVM +values that are visible in the bodies of all Functions. +Because they are visible at global scope, they are also subject to +linking with other globals defined in different translation units. To +control the linking process, GlobalValues know their linkage +rules. Specifically, GlobalValues know whether they have +internal or external linkage, as defined by the LinkageTypes enumerator.

        +

        If a GlobalValue has internal linkage (equivalent to +being static in C), it is not visible to code outside the +current translation unit, and does not participate in linking. If it +has external linkage, it is visible to external code, and does +participate in linking. In addition to linkage information, GlobalValues +keep track of which Module they are +currently part of.

        +

        Because GlobalValues are memory objects, they are always +referred to by their address. As such, the Type +of a global is always a pointer to its contents. It is important to +remember this when using the GetElementPtrInst +instruction because this pointer must be dereferenced first. For +example, if you have a GlobalVariable +(a subclass of GlobalValue) +that is an array of 24 ints, type [24 +x int], then the GlobalVariable +is a pointer to that array. Although the address of the first element of +this array and the value of the GlobalVariable +are the same, they have different types. The GlobalVariable's type is [24 x int]. The first element's +type is int. Because of +this, accessing a global value requires you to dereference the pointer +with GetElementPtrInst +first, then its elements can be accessed.  This is explained in +the LLVM Language Reference Manual.

        +

        +
      +

      +
      Important Public Members of the GlobalValue +class

      +
        +
      • bool hasInternalLinkage() const
        bool hasExternalLinkage() const
        - void setInternalLinkage(bool HasInternalLinkage)

        - -These methods manipulate the linkage characteristics of the -GlobalValue.

        - -

      • Module *getParent()

        - -This returns the Module that the GlobalValue is -currently embedded into.

        - - - - -

      -
         - -The Function class -
        - -#include "llvm/Function.h"
        + void setInternalLinkage(bool HasInternalLinkage) +

        These methods manipulate the linkage characteristics of the GlobalValue.

        +

        + +
      • Module *getParent() +

        This returns the Module that the +GlobalValue is currently embedded into.

        +

        +
      • +
      + + + + + + + +
         The Function +class
      +
        + #include "llvm/Function.h"
        doxygen info: Function Class
        Superclasses: GlobalValue, User, Value

        - -The Function class represents a single procedure in LLVM. It is -actually one of the more complex classes in the LLVM heirarchy because it must -keep track of a large amount of data. The Function class keeps track -of a list of BasicBlocks, a list of formal Arguments, and a SymbolTable.

        - -The list of BasicBlocks is the most commonly -used part of Function objects. The list imposes an implicit ordering -of the blocks in the function, which indicate how the code will be layed out by -the backend. Additionally, the first BasicBlock is the implicit entry node for the -Function. It is not legal in LLVM explicitly branch to this initial -block. There are no implicit exit nodes, and in fact there may be multiple exit -nodes from a single Function. If the BasicBlock list is empty, this indicates that -the Function is actually a function declaration: the actual body of the -function hasn't been linked in yet.

        - -In addition to a list of BasicBlocks, the -Function class also keeps track of the list of formal Arguments that the function receives. This -container manages the lifetime of the Argument -nodes, just like the BasicBlock list does for -the BasicBlocks.

        - -The SymbolTable is a very rarely used LLVM -feature that is only used when you have to look up a value by name. Aside from -that, the SymbolTable is used internally to -make sure that there are not conflicts between the names of Instructions, BasicBlocks, or Arguments in the function body.

        - - - -


      Important Public Members of -the Function class

        - -
      • Function(const FunctionType *Ty, bool isInternal, const std::string &N = "")

        - -Constructor used when you need to create new Functions to add the the -program. The constructor must specify the type of the function to create and -whether or not it should start out with internal or external linkage.

        - -

      • bool isExternal()

        - -Return whether or not the Function has a body defined. If the function -is "external", it does not have a body, and thus must be resolved by linking -with a function defined in a different translation unit.

        - - -

      • Function::iterator - Typedef for basic block list iterator
        + href="#User">User, Value +

        The Function class represents a single procedure in LLVM. +It is actually one of the more complex classes in the LLVM heirarchy +because it must keep track of a large amount of data. The Function +class keeps track of a list of BasicBlocks, +a list of formal Arguments, and a SymbolTable.

        +

        The list of BasicBlocks is the +most commonly used part of Function objects. The list imposes +an implicit ordering of the blocks in the function, which indicate how +the code will be layed out by the backend. Additionally, the first BasicBlock is the implicit entry node +for the Function. It is not legal in LLVM to explicitly +branch to this initial block. There are no implicit exit nodes, and in +fact there may be multiple exit nodes from a single Function. +If the BasicBlock list is empty, +this indicates that the Function is actually a function +declaration: the actual body of the function hasn't been linked in yet.

        +

        In addition to a list of BasicBlocks, +the Function class also keeps track of the list of formal Arguments that the function receives. +This container manages the lifetime of the Argument +nodes, just like the BasicBlock list +does for the BasicBlocks.

        +

        The SymbolTable is a very +rarely used LLVM feature that is only used when you have to look up a +value by name. Aside from that, the SymbolTable +is used internally to make sure that there are not conflicts between the +names of Instructions, BasicBlocks, or Arguments +in the function body.

        +

        +
      +

      +
      Important Public Members of the Function +class

      +
        +
      • Function(const FunctionType +*Ty, bool isInternal, const std::string &N = "", Module* Parent = 0) +

        Constructor used when you need to create new Functions +to add the the program. The constructor must specify the type of the +function to create and whether or not it should start out with internal +or external linkage. The FunctionType argument specifies the +formal arguments and return value for the function. The same FunctionType +value can be used to create multiple functions. The Parent argument specifies the +Module in which the function is defined. If this argument is provided, +the function will automatically be inserted into that module's list of +functions.

        +

        +
      • +
      • bool isExternal() +

        Return whether or not the Function has a body defined. +If the function is "external", it does not have a body, and thus must be +resolved by linking with a function defined in a different translation +unit.

        +

        +
      • +
      • Function::iterator - Typedef for basic block list iterator
        Function::const_iterator - Typedef for const_iterator.
        - begin(), end(), front(), back(), - size(), empty(), rbegin(), rend()

        - -These are forwarding methods that make it easy to access the contents of a -Function object's BasicBlock -list.

        - -

      • Function::BasicBlockListType &getBasicBlockList()

        - -Returns the list of BasicBlocks. This is -necessary to use when you need to update the list or perform a complex action -that doesn't have a forwarding method.

        - - -

      • Function::aiterator - Typedef for the argument list iterator
        + begin(), end(), front(), back(),size(),empty(),rbegin(),rend() +

        These are forwarding methods that make it easy to access the +contents of a Function object's BasicBlock +list.

        +

        +
      • +
      • Function::BasicBlockListType &getBasicBlockList() +

        Returns the list of BasicBlocks. +This is necessary to use when you need to update the list or perform a +complex action that doesn't have a forwarding method.

        +

        +
      • +
      • Function::aiterator - Typedef for the argument list +iterator
        Function::const_aiterator - Typedef for const_iterator.
        - abegin(), aend(), afront(), aback(), - asize(), aempty(), arbegin(), arend()

        - -These are forwarding methods that make it easy to access the contents of a -Function object's Argument list.

        - -

      • Function::ArgumentListType &getArgumentList()

        - -Returns the list of Arguments. This is -necessary to use when you need to update the list or perform a complex action -that doesn't have a forwarding method.

        - - - -

      • BasicBlock &getEntryBlock()

        - -Returns the entry BasicBlock for the -function. Because the entry block for the function is always the first block, -this returns the first block of the Function.

        - -

      • Type *getReturnType()
        - FunctionType *getFunctionType()

        - -This traverses the Type of the Function + abegin(), aend(), afront(), aback(),asize(),aempty(),arbegin(),arend() +

        These are forwarding methods that make it easy to access the +contents of a Function object's Argument +list.

        +

        +
      • +
      • Function::ArgumentListType &getArgumentList() +

        Returns the list of Arguments. +This is necessary to use when you need to update the list or perform a +complex action that doesn't have a forwarding method.

        +

        +
      • +
      • BasicBlock &getEntryBlock() +

        Returns the entry BasicBlock +for the function. Because the entry block for the function is always +the first block, this returns the first block of the Function.

        +

        +
      • +
      • Type *getReturnType()
        + FunctionType *getFunctionType() +

        This traverses the Type of the Function and returns the return type of the function, or the FunctionType of the actual function.

        - -

      • SymbolTable *getSymbolTable()

        - -Return a pointer to the SymbolTable for this -Function.

        - - - - -

      -
         - -The GlobalVariable class -
      + + + + + + + +
         The GlobalVariable +class
      +
        + #include "llvm/GlobalVariable.h"
        +doxygen info: GlobalVariable +Class
        Superclasses: GlobalValue, User, Value

        - -Global variables are represented with the (suprise suprise) -GlobalVariable class. Like functions, GlobalVariables are -also subclasses of GlobalValue, and as such -are always referenced by their address (global values must live in memory, so -their "name" refers to their address). Global variables may have an initial -value (which must be a Constant), and if they -have an initializer, they may be marked as "constant" themselves (indicating -that their contents never change at runtime).

        - - - -


      Important Public Members of the -GlobalVariable class

        - -
      • GlobalVariable(const Type *Ty, bool isConstant, bool -isInternal, Constant *Initializer = 0, const std::string -&Name = "")

        - -Create a new global variable of the specified type. If isConstant is -true then the global variable will be marked as unchanging for the program, and -if isInternal is true the resultant global variable will have internal -linkage. Optionally an initializer and name may be specified for the global variable as well.

        - - -

      • bool isConstant() const

        - -Returns true if this is a global variable is known not to be modified at -runtime.

        - - -

      • bool hasInitializer()

        - -Returns true if this GlobalVariable has an intializer.

        - - -

      • Constant *getInitializer()

        - -Returns the intial value for a GlobalVariable. It is not legal to call -this method if there is no initializer.

        - - - -

      -
         - -The Module class -
        - -#include "llvm/Module.h"
        -doxygen info: Module Class

        - -The Module class represents the top level structure present in LLVM -programs. An LLVM module is effectively either a translation unit of the -original program or a combination of several translation units merged by the -linker. The Module class keeps track of a list of Functions, a list of GlobalVariables, and a SymbolTable. Additionally, it contains a few -helpful member functions that try to make common operations easy.

        - - - -


      Important Public Members of the -Module class

        - -
      • Module::iterator - Typedef for function list iterator
        + href="#User">User
        , Value +

        Global variables are represented with the (suprise suprise) GlobalVariable +class. Like functions, GlobalVariables are also subclasses of GlobalValue, and as such are always +referenced by their address (global values must live in memory, so their +"name" refers to their address). See GlobalValue for more on +this. Global variables may have an initial value (which must be a Constant), and if they have an +initializer, they may be marked as "constant" themselves (indicating +that their contents never change at runtime).  

        +

        +
      +

      +
      Important Public Members of the GlobalVariable +class

      +
        +
      • GlobalVariable(const Type *Ty, +bool isConstant, LinkageTypes& Linkage, Constant +*Initializer = 0, const std::string &Name = "", Module* Parent = 0) +

        Create a new global variable of the specified type. If isConstant +is true then the global variable will be marked as unchanging for the +program. The Linkage parameter specifies the type of linkage (internal, +external, weak, linkonce, appending) for the variable. If the linkage +is InternalLinkage, WeakLinkage, or LinkOnceLinkage,  then the +resultant global variable will have internal linkage. AppendingLinkage +concatenates together all instances (in different translation units) of +the variable into a single variable but is only applicable to arrays. + See the LLVM Language +Reference for further details on linkage types. Optionally an +initializer, a name, and the module to put the variable into may be +specified for the global variable as well.

        +

        +
      • +
      • bool isConstant() const +

        Returns true if this is a global variable that is known not to +be modified at runtime.

        +

        +
      • +
      • bool hasInitializer() +

        Returns true if this GlobalVariable has an intializer.

        +

        +
      • +
      • Constant *getInitializer() +

        Returns the intial value for a GlobalVariable. It is +not legal to call this method if there is no initializer.

        +

        +
      • +
      + + + + + + + +
         The Module class
      +
        + #include "llvm/Module.h"
        +doxygen info: Module Class +

        The Module class represents the top level structure +present in LLVM programs. An LLVM module is effectively either a +translation unit of the original program or a combination of several +translation units merged by the linker. The Module class keeps +track of a list of Functions, a list +of GlobalVariables, and a SymbolTable. Additionally, it +contains a few helpful member functions that try to make common +operations easy.

        +

        +
      +

      +
      Important Public Members of the Module +class

      +
        +
      • Module::Module( std::string +name = "" )
      • +
      +

      Constructing a Module +is easy. You can optionally provide a name for it (probably based on the +name of the translation unit).

      +
        +
      • Module::iterator - Typedef for function list iterator
        Module::const_iterator - Typedef for const_iterator.
        - begin(), end(), front(), back(), - size(), empty(), rbegin(), rend()

        - -These are forwarding methods that make it easy to access the contents of a -Module object's Function -list.

        - -

      • Module::FunctionListType &getFunctionList()

        - -Returns the list of Functions. This is -necessary to use when you need to update the list or perform a complex action -that doesn't have a forwarding method.

        - - -


        - -
      • Module::giterator - Typedef for global variable list iterator
        + begin(), end(), front(), back(),size(),empty(),rbegin(),rend() +

        These are forwarding methods that make it easy to access the +contents of a Module object's Function +list.

        +

        +
      • +
      • Module::FunctionListType &getFunctionList() +

        Returns the list of Functions. +This is necessary to use when you need to update the list or perform a +complex action that doesn't have a forwarding method.

        +

        +
      • +
      • Module::giterator - Typedef for global variable list +iterator
        Module::const_giterator - Typedef for const_iterator.
        - gbegin(), gend(), gfront(), gback(), - gsize(), gempty(), grbegin(), grend()

        - -These are forwarding methods that make it easy to access the contents of a -Module object's GlobalVariable -list.

        - -

      • Module::GlobalListType &getGlobalList()

        - -Returns the list of GlobalVariables. -This is necessary to use when you need to update the list or perform a complex -action that doesn't have a forwarding method.

        - - - -


        - -
      • SymbolTable *getSymbolTable()

        - -Return a reference to the SymbolTable for -this Module.

        - - - -


        - -
      • Function *getFunction(const std::string &Name, const FunctionType *Ty)

        - -Look up the specified function in the Module SymbolTable. If it does not exist, return -null.

        - - -

      • Function *getOrInsertFunction(const std::string - &Name, const FunctionType *T)

        - -Look up the specified function in the Module SymbolTable. If it does not exist, add an -external declaration for the function and return it.

        - - -

      • std::string getTypeName(const Type *Ty)

        - -If there is at least one entry in the SymbolTable for the specified Type, return it. Otherwise return the empty -string.

        - - -

      • bool addTypeName(const std::string &Name, const Type -*Ty)

        - -Insert an entry in the SymbolTable mapping -Name to Ty. If there is already an entry for this name, true -is returned and the SymbolTable is not -modified.

        - - - -

      -
         - -The Constant class and subclasses -
        - -Constant represents a base class for different types of constants. It is -subclassed by ConstantBool, ConstantInt, ConstantSInt, ConstantUInt, -ConstantArray etc for representing the various types of Constants.

        - - - -


      Important Public Methods

      -
         - -The Type class and Derived Types -


      Important Public Methods

      -
         - -The Argument class -
      + + + + + + + +
         The Constant +class and subclasses
      +
        +Constant represents a base class for different types of constants. It +is subclassed by ConstantBool, ConstantInt, ConstantSInt, ConstantUInt, +ConstantArray etc for representing the various types of Constants. +

        +
      +

      +
      Important Public Methods

      +
        +
      • bool isConstantExpr(): Returns true if it is a +ConstantExpr +
        Important Subclasses of Constant +

        +
          +
        • ConstantSInt : This subclass of Constant represents a signed +integer constant. +
            +
          • int64_t getValue() const: Returns the underlying value of +this constant.
          • +
          +
        • +
        • ConstantUInt : This class represents an unsigned integer. +
            +
          • uint64_t getValue() const: Returns the underlying value +of this constant.
          • +
          +
        • +
        • ConstantFP : This class represents a floating point constant. +
            +
          • double getValue() const: Returns the underlying value of +this constant.
          • +
          +
        • +
        • ConstantBool : This represents a boolean constant. +
            +
          • bool getValue() const: Returns the underlying value of +this constant.
          • +
          +
        • +
        • ConstantArray : This represents a constant array. +
            +
          • const std::vector<Use> &getValues() const: +Returns a Vecotr of component constants that makeup this array.
          • +
          +
        • +
        • ConstantStruct : This represents a constant struct. +
            +
          • const std::vector<Use> &getValues() const: +Returns a Vecotr of component constants that makeup this array.
          • +
          +
        • +
        • ConstantPointerRef : This represents a constant pointer value +that is initialized to point to a global value, which lies at a +constant fixed address. +
            +
          • GlobalValue *getValue(): Returns the global +value to which this pointer is pointing to.
          • +
          +
        • +
        +
      • +
      + + + + + + + +
         The Type class and +Derived Types
      +
        +Type as noted earlier is also a subclass of a Value class. Any +primitive type (like int, short etc) in LLVM is an instance of Type +Class. All other types are instances of subclasses of type like +FunctionType, ArrayType etc. DerivedType is the interface for all such +dervied types including FunctionType, ArrayType, PointerType, +StructType. Types can have names. They can be recursive (StructType). +There exists exactly one instance of any type structure at a time. This +allows using pointer equality of Type *s for comparing types. +
      +

      +
      Important Public Methods

      +
        +
      • PrimitiveID getPrimitiveID() const: Returns the base +type of the type.
      • +
      • bool isSigned() const: Returns whether an integral +numeric type is signed. This is true for SByteTy, ShortTy, IntTy, +LongTy. Note that this is not true for Float and Double.
      • +
      • bool isUnsigned() const: Returns whether a numeric type +is unsigned. This is not quite the complement of isSigned... nonnumeric +types return false as they do with isSigned. This returns true for +UByteTy, UShortTy, UIntTy, and ULongTy.
      • +
      • bool isInteger() const: Equilivent to isSigned() || +isUnsigned(), but with only a single virtual function invocation.
      • +
      • bool isIntegral() const: Returns true if this is an +integral type, which is either Bool type or one of the Integer types.
      • +
      • bool isFloatingPoint(): Return true if this is one of +the two floating point types.
      • +
      • bool isRecursive() const: Returns rue if the type graph +contains a cycle.
      • +
      • isLosslesslyConvertableTo (const Type *Ty) const: Return +true if this type can be converted to 'Ty' without any reinterpretation +of bits. For example, uint to int.
      • +
      • bool isPrimitiveType() const: Returns true if it is a +primitive type.
      • +
      • bool isDerivedType() const: Returns true if it is a +derived type.
      • +
      • const Type * getContainedType (unsigned i) const: This +method is used to implement the type iterator. For derived types, this +returns the types 'contained' in the derived type, returning 0 when 'i' +becomes invalid. This allows the user to iterate over the types in a +struct, for example, really easily.
      • +
      • unsigned getNumContainedTypes() const: Return the number +of types in the derived type. +

        +
        Derived Types +

        +
          +
        • SequentialType : This is subclassed by ArrayType and +PointerType +
            +
          • const Type * getElementType() const: Returns the type of +each of the elements in the sequential type.
          • +
          +
        • +
        • ArrayType : This is a subclass of SequentialType and defines +interface for array types. +
            +
          • unsigned getNumElements() const: Returns the number of +elements in the array.
          • +
          +
        • +
        • PointerType : Subclass of SequentialType for pointer types.
        • +
        • StructType : subclass of DerivedTypes for struct types
        • +
        • FunctionType : subclass of DerivedTypes for function types. +
            +
          • bool isVarArg() const: Returns true if its a vararg +function
          • +
          • const Type * getReturnType() const: Returns the +return type of the function.
          • +
          • const ParamTypes &getParamTypes() const: +Returns a vector of parameter types.
          • +
          • const Type * getParamType (unsigned i): Returns +the type of the ith parameter.
          • +
          • const unsigned getNumParams() const: Returns the +number of formal parameters.
          • +
          +
        • +
        +
      • +
      + + + + + + + +
         The Argument +class
      +
        +This subclass of Value defines the interface for incoming formal +arguments to a function. A Function maitanis a list of its formal +arguments. An argument has a pointer to the parent Function.
      - -
      -
      By: Dinakar Dhurjati and -Chris Lattner
      -The LLVM Compiler Infrastructure -
      - - -Last modified: Fri Nov 7 13:24:22 CST 2003 - -
      +
      +
      By: Dinakar Dhurjati +and Chris Lattner
      +
      The LLVM +Compiler Infrastructure
      + Last +modified: Fri Nov 7 13:24:22 CST 2003
      + + Index: llvm/docs/llvm.css diff -u llvm/docs/llvm.css:1.9 llvm/docs/llvm.css:1.10 --- llvm/docs/llvm.css:1.9 Fri Nov 21 19:23:53 2003 +++ llvm/docs/llvm.css Mon Nov 24 19:02:51 2003 @@ -47,3 +47,5 @@ .doc_red { color: red } +.doc_table { text-align: center; width: 90%; padding: 1 1 1 1; border: 1 1 1 1 ; } + From lattner at cs.uiuc.edu Mon Nov 24 19:36:02 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon Nov 24 19:36:02 2003 Subject: [llvm-commits] CVS: llvm/docs/Stacker.html Message-ID: <200311250135.TAA22898@zion.cs.uiuc.edu> Changes in directory llvm/docs: Stacker.html updated: 1.2 -> 1.3 --- Log message: Apply docs patch fro Reid --- Diffs of the changes: (+126 -50) Index: llvm/docs/Stacker.html diff -u llvm/docs/Stacker.html:1.2 llvm/docs/Stacker.html:1.3 --- llvm/docs/Stacker.html:1.2 Mon Nov 24 11:03:38 2003 +++ llvm/docs/Stacker.html Mon Nov 24 19:35:06 2003 @@ -25,8 +25,10 @@
      1. The Stack
      2. Punctuation +
      3. Comments
      4. Literals
      5. Words +
      6. Standard Style
      7. Built-Ins
      @@ -40,6 +42,8 @@
    • The Runtime
    • Compiler Driver
    • Test Programs
    • +
    • Exercise
    • +
    • Things Remaining To Be Done
    • @@ -53,9 +57,9 @@

      This document is another way to learn about LLVM. Unlike the LLVM Reference Manual or -LLVM Programmer's Manual, this -document walks you through the implementation of a programming language -named Stacker. Stacker was invented specifically as a demonstration of +LLVM Programmer's Manual, we learn +about LLVM through the experience of creating a simple programming language +named Stacker. Stacker was invented specifically as a demonstration of LLVM. The emphasis in this document is not on describing the intricacies of LLVM itself, but on how to use it to build your own compiler system.

      @@ -80,7 +84,7 @@ complete, you wouldn't use it for your next big project. However, the fact that it is complete, its simple, and it doesn't have a C-like syntax make it useful for demonstration purposes. It shows -that LLVM could be applied to a wide variety of language syntaxes.

      +that LLVM could be applied to a wide variety of languages.

      The basic notions behind stacker is very simple. There's a stack of integers (or character pointers) that the program manipulates. Pretty much the only thing the program can do is manipulate the stack and do @@ -106,24 +110,30 @@

      Lessons I Learned About LLVM
      -

      Stacker was written for two purposes: (a) to get the author over the -learning curve and (b) to provide a simple example of how to write a compiler -using LLVM. During the development of Stacker, many lessons about LLVM were +

      Stacker was written for two purposes:

      +
        +
      1. to get the author over the learning curve, and
      2. +
      3. to provide a simple example of how to write a compiler using LLVM.
      4. +
      +

      During the development of Stacker, many lessons about LLVM were learned. Those lessons are described in the following subsections.

      Everything's a Value!
      -

      Although I knew that LLVM used a Single Static Assignment (SSA) format, +

      Although I knew that LLVM uses a Single Static Assignment (SSA) format, it wasn't obvious to me how prevalent this idea was in LLVM until I really -started using it. Reading the Programmer's Manual and Language Reference I -noted that most of the important LLVM IR (Intermediate Representation) C++ +started using it. Reading the +Programmer's Manual and Language Reference +I noted that most of the important LLVM IR (Intermediate Representation) C++ classes were derived from the Value class. The full power of that simple design only became fully understood once I started constructing executable expressions for Stacker.

      This really makes your programming go faster. Think about compiling code -for the following C/C++ expression: (a|b)*((x+1)/(y+1)). You could write a -function using LLVM that does exactly that, this way:

      +for the following C/C++ expression: (a|b)*((x+1)/(y+1)). Assuming +the values are on the stack in the order a, b, x, y, this could be +expressed in stacker as: 1 + SWAP 1 + / ROT2 OR *. +You could write a function using LLVM that computes this expression like this:

      
       Value* 
       expression(BasicBlock*bb, Value* a, Value* b, Value* x, Value* y )
      @@ -146,19 +156,19 @@
       

      "Okay, big deal," you say. It is a big deal. Here's why. Note that I didn't have to tell this function which kinds of Values are being passed in. They could be -instructions, Constants, Global Variables, etc. Furthermore, if you specify Values -that are incorrect for this sequence of operations, LLVM will either notice right -away (at compilation time) or the LLVM Verifier will pick up the inconsistency -when the compiler runs. In no case will you make a type error that gets passed -through to the generated program. This really helps you write a compiler -that always generates correct code!

      +Instructions, Constants, GlobalVariables, +etc. Furthermore, if you specify Values that are incorrect for this sequence of +operations, LLVM will either notice right away (at compilation time) or the LLVM +Verifier will pick up the inconsistency when the compiler runs. In no case will +you make a type error that gets passed through to the generated program. +This really helps you write a compiler that always generates correct code!

      The second point is that we don't have to worry about branching, registers, stack variables, saving partial results, etc. The instructions we create are the values we use. Note that all that was created in the above code is a Constant value and five operators. Each of the instructions is -the resulting value of that instruction.

      +the resulting value of that instruction. This saves a lot of time.

      The lesson is this: SSA form is very powerful: there is no difference - between a value and the instruction that created it. This is fully +between a value and the instruction that created it. This is fully enforced by the LLVM IR. Use it to your best advantage.

      @@ -186,8 +196,7 @@
      Concrete Blocks

      After a little initial fumbling around, I quickly caught on to how blocks -should be constructed. The use of the standard template library really helps -simply the interface. In general, here's what I learned: +should be constructed. In general, here's what I learned:

      1. Create your blocks early. While writing your compiler, you will encounter several situations where you know apriori that you will @@ -206,19 +215,17 @@ getTerminator() method on a BasicBlock), it can always be used as the insert_before argument to your instruction constructors. This causes the instruction to automatically be inserted in - the RightPlace&tm; place, just before the terminating instruction. The + the RightPlace™ place, just before the terminating instruction. The nice thing about this design is that you can pass blocks around and insert - new instructions into them without ever known what instructions came + new instructions into them without ever knowing what instructions came before. This makes for some very clean compiler design.

      The foregoing is such an important principal, its worth making an idiom:

      -
      -
      +
      
       BasicBlock* bb = new BasicBlock();
       bb->getInstList().push_back( new Branch( ... ) );
       new Instruction(..., bb->getTerminator() );
      -
      -
      +

      To make this clear, consider the typical if-then-else statement (see StackerCompiler::handle_if() method). We can set this up in a single function using LLVM in the following way:

      @@ -254,8 +261,7 @@ the instructions for the "then" and "else" parts. They would use the third part of the idiom almost exclusively (inserting new instructions before the terminator). Furthermore, they could even recurse back to handle_if -should they encounter another if/then/else statement and it will all "just work". -

      +should they encounter another if/then/else statement and it will just work.

      Note how cleanly this all works out. In particular, the push_back methods on the BasicBlock's instruction list. These are lists of type Instruction which also happen to be Values. To create @@ -312,10 +318,10 @@ will run against your grain because you'll naturally think of the global array variable and the address of its first element as the same. That tripped me up for a while until I realized that they really do differ .. by type. -Remember that LLVM is a strongly typed language itself. Absolutely everything +Remember that LLVM is a strongly typed language itself. Everything has a type. The "type" of the global variable is [24 x int]*. That is, its a pointer to an array of 24 ints. When you dereference that global variable with -a single index, you now have a " [24 x int]" type, the pointer is gone. Although +a single (0) index, you now have a "[24 x int]" type. Although the pointer value of the dereferenced global and the address of the zero'th element in the array will be the same, they differ in their type. The zero'th element has type "int" while the pointer value has type "[24 x int]".

      @@ -333,7 +339,7 @@ you to think you know what a linkage type represents but in fact it is slightly different. I recommend you read the Language Reference on this topic very -carefully.

      +carefully. Then, read it again.

      Here are some handy tips that I discovered along the way:

      • Unitialized means external. That is, the symbol is declared in the current @@ -366,12 +372,13 @@
      +

      This section describes the Stacker language

      The Stack

      Stacker definitions define what they do to the global stack. Before proceeding, a few words about the stack are in order. The stack is simply a global array of 32-bit integers or pointers. A global index keeps track -of the location of the to of the stack. All of this is hidden from the +of the location of the top of the stack. All of this is hidden from the programmer but it needs to be noted because it is the foundation of the conceptual programming model for Stacker. When you write a definition, you are, essentially, saying how you want that definition to manipulate @@ -384,7 +391,7 @@ word that interprets that boolean value as a pointer to a string to print out will almost always yield a crash. Stacker simply leaves it to the programmer to get it right without any interference or hindering -on interpretation of the stack values. You've been warned :)

      +on interpretation of the stack values. You've been warned. :)

      Punctuation
      @@ -393,8 +400,31 @@ characters are used to introduce and terminate a definition (respectively). Except for FORWARD declarations, definitions are all you can specify in Stacker. Definitions are read left to right. -Immediately after the semi-colon comes the name of the word being defined. -The remaining words in the definition specify what the word does.

      +Immediately after the colon comes the name of the word being defined. +The remaining words in the definition specify what the word does. The definition +is terminated by a semi-colon.

      +

      So, your typical definition will have the form:

      +
      : name ... ;
      +

      The name is up to you but it must start with a letter and contain +only letters numbers and underscore. Names are case sensitive and must not be +the same as the name of a built-in word. The ... is replaced by +the stack manipulting words that you wish define name as.

      +

      + +
      Comments
      +
      +

      Stacker supports two types of comments. A hash mark (#) starts a comment + that extends to the end of the line. It is identical to the kind of comments + commonly used in shell scripts. A pair of parentheses also surround a comment. + In both cases, the content of the comment is ignored by the Stacker compiler. The + following does nothing in Stacker. +

      +
      
      +# This is a comment to end of line
      +( This is an enclosed comment )
      +
      +

      See the example program to see how this works in +a real program.

      Literals
      @@ -416,11 +446,11 @@ transformation he applies will affect the program.

      Words in a definition come in two flavors: built-in and programmer defined. Simply mentioning the name of a previously defined or declared -programmer-defined word causes that words definition to be invoked. It +programmer-defined word causes that word's definition to be invoked. It is somewhat like a function call in other languages. The built-in words have various effects, described below.

      Sometimes you need to call a word before it is defined. For this, you can -use the FORWARD declaration. It looks like this

      +use the FORWARD declaration. It looks like this:

      FORWARD name ;

      This simply states to Stacker that "name" is the name of a definition that is defined elsewhere. Generally it means the definition can be found @@ -467,7 +497,7 @@

    • b - a boolean truth value
    • w - a normal integer valued word.
    • s - a pointer to a string value
    • -
    • p - a pointer to a malloc's memory block
    • +
    • p - a pointer to a malloc'd memory block
    • @@ -775,15 +805,14 @@ ROLL x0 x1 .. xn n -- x1 .. xn x0 Not Implemented. This one has been left as an exercise to - the student. If you can implement this one you understand Stacker - and probably a fair amount about LLVM since this is one of the - more complicated Stacker operations. See the StackerCompiler.cpp - file in the projects/Stacker/lib/compiler directory. The operation - of ROLL is like a generalized ROT. That is ROLL with n=1 is the - same as ROT. The n value (top of stack) is used as an index to - select a value up the stack that is moved to the top of - the stack. See the implementations of PICk and SELECT to get - some hints.

      + the student. See Exercise. ROLL requires + a value, "n", to be on the top of the stack. This value specifies how + far into the stack to "roll". The n'th value is moved (not + copied) from its location and replaces the "n" value on the top of the + stack. In this way, all the values between "n" and x0 roll up the stack. + The operation of ROLL is a generalized ROT. The "n" value specifies + how much to rotate. That is, ROLL with n=1 is the same as ROT and + ROLL with n=2 is the same as ROT2. MEMORY OPERATIONS WordNameOperationDescription @@ -1266,10 +1295,57 @@

      See projects/Stacker/test/*.st

      + +
      +

      As you may have noted from a careful inspection of the Built-In word +definitions, the ROLL word is not implemented. This word was left out of +Stacker on purpose so that it can be an exercise for the student. The exercise +is to implement the ROLL functionality (in your own workspace) and build a test +program for it. If you can implement ROLL you understand Stacker and probably +a fair amount about LLVM since this is one of the more complicated Stacker +operations. The work will almost be completely limited to the +compiler. +

      The ROLL word is already recognized by both the lexer and parser but ignored +by the compiler. That means you don't have to futz around with figuring out how +to get the keyword recognized. It already is. The part of the compiler that +you need to implement is the ROLL case in the +StackerCompiler::handle_word(int) method.

      See the implementations +of PICk and SELECT in the same method to get some hints about how to complete +this exercise.

      +

      Good luck!

      +
      + + +
      +

      The initial implementation of Stacker has several deficiencies. If you're +interested, here are some things that could be implemented better:

      +
        +
      1. Write an LLVM pass to compute the correct stack depth needed by the + program.
      2. +
      3. Write an LLVM pass to optimize the use of the global stack. The code + emitted currently is somewhat wasteful. It gets cleaned up a lot by existing + passes but more could be done.
      4. +
      5. Add -O -O1 -O2 and -O3 optimization switches to the compiler driver to + allow LLVM optimization without using "opt"
      6. +
      7. Make the compiler driver use the LLVM linking facilities (with IPO) before + depending on GCC to do the final link.
      8. +
      9. Clean up parsing. It doesn't handle errors very well.
      10. +
      11. Rearrange the StackerCompiler.cpp code to make better use of inserting + instructions before a block's terminating instruction. I didn't figure this + technique out until I was nearly done with LLVM. As it is, its a bad example + of how to insert instructions!
      12. +
      13. Provide for I/O to arbitrary files instead of just stdin/stdout.
      14. +
      15. Write additional built-in words.
      16. +
      17. Write additional sample Stacker programs.
      18. +
      19. Add your own compiler writing experiences and tips in the + Lessons I Learned About LLVM section.
      20. +
      +
      +
      +
      Last modified: $Date: 2003/11/25 01:35:06 $ From lattner at cs.uiuc.edu Mon Nov 24 19:45:02 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon Nov 24 19:45:02 2003 Subject: [llvm-commits] CVS: llvm/docs/Stacker.html Message-ID: <200311250144.TAA23164@zion.cs.uiuc.edu> Changes in directory llvm/docs: Stacker.html updated: 1.3 -> 1.4 --- Log message: Minor fixes --- Diffs of the changes: (+7 -7) Index: llvm/docs/Stacker.html diff -u llvm/docs/Stacker.html:1.3 llvm/docs/Stacker.html:1.4 --- llvm/docs/Stacker.html:1.3 Mon Nov 24 19:35:06 2003 +++ llvm/docs/Stacker.html Mon Nov 24 19:44:27 2003 @@ -141,15 +141,15 @@ Instruction* tail = bb->getTerminator(); ConstantSInt* one = ConstantSInt::get( Type::IntTy, 1); BinaryOperator* or1 = - new BinaryOperator::create( Instruction::Or, a, b, "", tail ); + BinaryOperator::create( Instruction::Or, a, b, "", tail ); BinaryOperator* add1 = - new BinaryOperator::create( Instruction::Add, x, one, "", tail ); + BinaryOperator::create( Instruction::Add, x, one, "", tail ); BinaryOperator* add2 = - new BinaryOperator::create( Instruction::Add, y, one, "", tail ); + BinaryOperator::create( Instruction::Add, y, one, "", tail ); BinaryOperator* div1 = - new BinaryOperator::create( Instruction::Div, add1, add2, "", tail); + BinaryOperator::create( Instruction::Div, add1, add2, "", tail); BinaryOperator* mult1 = - new BinaryOperator::create( Instruction::Mul, or1, div1, "", tail ); + BinaryOperator::create( Instruction::Mul, or1, div1, "", tail ); return mult1; } @@ -271,7 +271,7 @@ the BasicBlock provided as an argument. To give the caller a way to keep inserting after calling handle_if we create an "exit" block which is returned to the caller. Note that the "exit" block is used as the -terminator for both the "then" and the "else" blocks. This gaurantees that no +terminator for both the "then" and the "else" blocks. This guarantees that no matter what else "handle_if" or "fill_in" does, they end up at the "exit" block.

      @@ -1346,6 +1346,6 @@ +
      Last modified: $Date: 2003/11/25 01:44:27 $ From lattner at cs.uiuc.edu Mon Nov 24 21:31:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon Nov 24 21:31:01 2003 Subject: [llvm-commits] CVS: llvm-www/Documentation.html Message-ID: <200311250330.VAA24210@zion.cs.uiuc.edu> Changes in directory llvm-www: Documentation.html updated: 1.1 -> 1.2 --- Log message: Add link to the stacker dox --- Diffs of the changes: (+6 -1) Index: llvm-www/Documentation.html diff -u llvm-www/Documentation.html:1.1 llvm-www/Documentation.html:1.2 --- llvm-www/Documentation.html:1.1 Tue Nov 18 17:04:53 2003 +++ llvm-www/Documentation.html Mon Nov 24 21:30:29 2003 @@ -86,6 +86,11 @@ - Look here if you are interested in doing something with LLVM but aren't sure what needs to be done. +
    • The Stacker Cronicles + - This document describes both the Stacker language and + LLVM frontend, but also some details about LLVM useful for + those writing front-ends.
    • +
    • Doxygen generated documentation (classes)
    • @@ -122,4 +127,4 @@

    - \ No newline at end of file + From lattner at cs.uiuc.edu Mon Nov 24 21:34:02 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon Nov 24 21:34:02 2003 Subject: [llvm-commits] CVS: llvm/docs/index.html Message-ID: <200311250333.VAA24402@zion.cs.uiuc.edu> Changes in directory llvm/docs: index.html updated: 1.5 -> 1.6 --- Log message: add link to the stacker dox --- Diffs of the changes: (+9 -0) Index: llvm/docs/index.html diff -u llvm/docs/index.html:1.5 llvm/docs/index.html:1.6 --- llvm/docs/index.html:1.5 Thu Nov 13 13:32:14 2003 +++ llvm/docs/index.html Mon Nov 24 21:32:57 2003 @@ -183,6 +183,15 @@

    + The Stacker Cronicles +
    + The Stacker Cronicles + - This document describes both the Stacker language and + LLVM frontend, but also some details about LLVM useful for + those writing front-ends.

    + + +

    Command Line Library:
    llvm/docs/CommandLine.html From lattner at cs.uiuc.edu Mon Nov 24 21:55:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon Nov 24 21:55:01 2003 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.y Message-ID: <200311250354.VAA24969@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: llvmAsmParser.y updated: 1.141 -> 1.142 --- Log message: Fix PR147 --- Diffs of the changes: (+5 -0) Index: llvm/lib/AsmParser/llvmAsmParser.y diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.141 llvm/lib/AsmParser/llvmAsmParser.y:1.142 --- llvm/lib/AsmParser/llvmAsmParser.y:1.141 Fri Nov 21 16:32:16 2003 +++ llvm/lib/AsmParser/llvmAsmParser.y Mon Nov 24 21:54:16 2003 @@ -553,6 +553,11 @@ } } } + + // Clear the symbol table so it doesn't complain when it + // gets destructed + CurFun.LocalSymtab.clear(); + ThrowException("Redefinition of value named '" + Name + "' in the '" + V->getType()->getDescription() + "' type plane!"); } From lattner at cs.uiuc.edu Mon Nov 24 21:59:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon Nov 24 21:59:01 2003 Subject: [llvm-commits] CVS: llvm/test/Regression/Assembler/2003-11-24-SymbolTableCrash.llx Message-ID: <200311250358.VAA25026@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Assembler: 2003-11-24-SymbolTableCrash.llx added (r1.1) --- Log message: Testcase for PR147 --- Diffs of the changes: (+10 -0) Index: llvm/test/Regression/Assembler/2003-11-24-SymbolTableCrash.llx diff -c /dev/null llvm/test/Regression/Assembler/2003-11-24-SymbolTableCrash.llx:1.1 *** /dev/null Mon Nov 24 21:58:59 2003 --- llvm/test/Regression/Assembler/2003-11-24-SymbolTableCrash.llx Mon Nov 24 21:58:49 2003 *************** *** 0 **** --- 1,10 ---- + ; RUN: llvm-as < %s 2>&1 | not grep Asserti + + void %test() { + %tmp.1 = add int 0, 1 + br label %return + return: + %tmp.1 = add int 0, 1 + ret void + } + From lattner at cs.uiuc.edu Tue Nov 25 02:46:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 02:46:01 2003 Subject: [llvm-commits] CVS: llvm/test/Regression/C++Frontend/2003-11-25-ReturningOpaqueByValue.cpp Message-ID: <200311250845.CAA02024@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/C++Frontend: 2003-11-25-ReturningOpaqueByValue.cpp added (r1.1) --- Log message: testcase for PR 148 --- Diffs of the changes: (+10 -0) Index: llvm/test/Regression/C++Frontend/2003-11-25-ReturningOpaqueByValue.cpp diff -c /dev/null llvm/test/Regression/C++Frontend/2003-11-25-ReturningOpaqueByValue.cpp:1.1 *** /dev/null Tue Nov 25 02:45:48 2003 --- llvm/test/Regression/C++Frontend/2003-11-25-ReturningOpaqueByValue.cpp Tue Nov 25 02:45:38 2003 *************** *** 0 **** --- 1,10 ---- + #include + std::vector my_method (); + + int + main () + { + my_method (); + return 0; + } + From lattner at cs.uiuc.edu Tue Nov 25 02:50:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 02:50:01 2003 Subject: [llvm-commits] CVS: llvm/docs/ReleaseNotes.html Message-ID: <200311250849.CAA02940@zion.cs.uiuc.edu> Changes in directory llvm/docs: ReleaseNotes.html updated: 1.62 -> 1.63 --- Log message: boog --- Diffs of the changes: (+2 -1) Index: llvm/docs/ReleaseNotes.html diff -u llvm/docs/ReleaseNotes.html:1.62 llvm/docs/ReleaseNotes.html:1.63 --- llvm/docs/ReleaseNotes.html:1.62 Fri Nov 21 19:23:39 2003 +++ llvm/docs/ReleaseNotes.html Tue Nov 25 02:49:12 2003 @@ -181,6 +181,7 @@
  • [llvm-gcc] Bitfields & large array don't mix well
  • [llvm-gcc] Complex division is not supported
  • [llvm-gcc] Illegal union field reference
  • +
  • [llvmg++] Front-end attempts to return structure by value
  • At this time, LLVM is known to work properly with SPEC CPU 2000 (X86 only), @@ -589,7 +590,7 @@ src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!" /> The LLVM Compiler Infrastructure
    - Last modified: $Date: 2003/11/22 01:23:39 $ + Last modified: $Date: 2003/11/25 08:49:12 $ From lattner at cs.uiuc.edu Tue Nov 25 02:51:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 02:51:01 2003 Subject: [llvm-commits] CVS: llvm-www/releases/1.0/docs/ReleaseNotes.html Message-ID: <200311250850.CAA03127@zion.cs.uiuc.edu> Changes in directory llvm-www/releases/1.0/docs: ReleaseNotes.html updated: 1.43 -> 1.44 --- Log message: Boogz --- Diffs of the changes: (+3 -0) Index: llvm-www/releases/1.0/docs/ReleaseNotes.html diff -u llvm-www/releases/1.0/docs/ReleaseNotes.html:1.43 llvm-www/releases/1.0/docs/ReleaseNotes.html:1.44 --- llvm-www/releases/1.0/docs/ReleaseNotes.html:1.43 Thu Nov 20 15:00:03 2003 +++ llvm-www/releases/1.0/docs/ReleaseNotes.html Tue Nov 25 02:50:08 2003 @@ -427,6 +427,9 @@

  • [llvmg++] Cannot use pointer to member to initialize global
  • +

  • [llvmg++] Front-end attempts to return structure by value
  • + + Notes:

    • The C++ front-end is based on a pre-release of the GCC 3.4 C++ parser. This From brukman at cs.uiuc.edu Tue Nov 25 10:43:01 2003 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Tue Nov 25 10:43:01 2003 Subject: [llvm-commits] CVS: llvm/test/Programs/External/SPEC/CINT2000/Makefile Message-ID: <200311251642.KAA15180@zion.cs.uiuc.edu> Changes in directory llvm/test/Programs/External/SPEC/CINT2000: Makefile updated: 1.11 -> 1.12 --- Log message: I spoke too soon, crafty still hangs, even the native version. And sometimes the automatic script doesn't kill it after a certain time. --- Diffs of the changes: (+5 -0) Index: llvm/test/Programs/External/SPEC/CINT2000/Makefile diff -u llvm/test/Programs/External/SPEC/CINT2000/Makefile:1.11 llvm/test/Programs/External/SPEC/CINT2000/Makefile:1.12 --- llvm/test/Programs/External/SPEC/CINT2000/Makefile:1.11 Fri Nov 21 18:34:37 2003 +++ llvm/test/Programs/External/SPEC/CINT2000/Makefile Tue Nov 25 10:42:00 2003 @@ -16,4 +16,9 @@ # Get the $(ARCH) setting include $(LEVEL)/Makefile.config +# Disable crafty until it stops infinite-looping on Sparc +ifeq ($(ARCH), Sparc) +PARALLEL_DIRS := $(filter-out 186.crafty, $(PARALLEL_DIRS)) +endif + include ${LEVEL}/test/Programs/Makefile.programs From criswell at cs.uiuc.edu Tue Nov 25 11:50:02 2003 From: criswell at cs.uiuc.edu (John Criswell) Date: Tue Nov 25 11:50:02 2003 Subject: [llvm-commits] CVS: llvm/Makefile.rules configure Message-ID: <200311251749.LAA09274@choi.cs.uiuc.edu> Changes in directory llvm: Makefile.rules updated: 1.159 -> 1.160 configure updated: 1.57 -> 1.58 --- Log message: Added a pseudo-hack: The Makefile now copies Makefiles from source tree to object tree if it is missing. This means that new Makefiles should get picked up automagically, requiring less bothersome re-configuring after updates. --- Diffs of the changes: (+40 -840) Index: llvm/Makefile.rules diff -u llvm/Makefile.rules:1.159 llvm/Makefile.rules:1.160 --- llvm/Makefile.rules:1.159 Mon Nov 24 12:31:01 2003 +++ llvm/Makefile.rules Tue Nov 25 11:49:21 2003 @@ -395,6 +395,11 @@ ifdef DIRS all install clean test bytecode :: $(VERB) for dir in ${DIRS}; do \ + $(MKDIR) $$dir; \ + if [ ! -f $$dir/Makefile ]; \ + then \ + cp $(SourceDir)/$$dir/Makefile $$dir/Makefile; \ + fi; \ ($(MAKE) -C $$dir $@) || exit 1; \ done endif @@ -408,15 +413,20 @@ bytecode :: $(addsuffix /.makebytecode, $(PARALLEL_DIRS)) %/.makeall %/.makeinstall %/.makeclean %/.maketest %/.makebytecode: - $(VERB) $(MAKE) -C $(@D) $(subst $(@D)/.make,,$@) + $(VERB) $(MKDIR) $(@D); cp $(SourceDir)/$(@D)/Makefile $(@D); $(MAKE) -C $(@D) $(subst $(@D)/.make,,$@) endif # Handle directories that may or may not exist ifdef OPTIONAL_DIRS all install clean test bytecode :: $(VERB) for dir in ${OPTIONAL_DIRS}; do \ - if [ -d $$dir ]; \ + if [ -d $(SourceDir)/$$dir ]; \ then\ + $(MKDIR) $$dir; \ + if [ ! -f $$dir/Makefile ]; \ + then \ + cp $(SourceDir)/$$dir/Makefile $$dir/Makefile; \ + fi; \ ($(MAKE) -C$$dir $@) || exit 1; \ fi \ done Index: llvm/configure diff -u llvm/configure:1.57 llvm/configure:1.58 --- llvm/configure:1.57 Sun Nov 23 20:54:57 2003 +++ llvm/configure Tue Nov 25 11:49:21 2003 @@ -1553,150 +1553,12 @@ ac_config_commands="$ac_config_commands Makefile.common" - ac_config_commands="$ac_config_commands Makefile.rules" - - ac_config_commands="$ac_config_commands lib/Makefile" - ac_config_commands="$ac_config_commands lib/Analysis/Makefile" - - - ac_config_commands="$ac_config_commands lib/Analysis/DataStructure/Makefile" - - - ac_config_commands="$ac_config_commands lib/Analysis/IPA/Makefile" - - - ac_config_commands="$ac_config_commands lib/Analysis/LiveVar/Makefile" - - - ac_config_commands="$ac_config_commands lib/AsmParser/Makefile" - - - ac_config_commands="$ac_config_commands lib/Bytecode/Makefile" - - - ac_config_commands="$ac_config_commands lib/Bytecode/Reader/Makefile" - - - ac_config_commands="$ac_config_commands lib/Bytecode/Writer/Makefile" - - - ac_config_commands="$ac_config_commands lib/CWriter/Makefile" - - - ac_config_commands="$ac_config_commands lib/CodeGen/Makefile" - - - ac_config_commands="$ac_config_commands lib/CodeGen/InstrSched/Makefile" - - - ac_config_commands="$ac_config_commands lib/CodeGen/InstrSelection/Makefile" - - - ac_config_commands="$ac_config_commands lib/CodeGen/ModuloScheduling/Makefile" - - - ac_config_commands="$ac_config_commands lib/CodeGen/RegAlloc/Makefile" - - - ac_config_commands="$ac_config_commands lib/CodeGen/SelectionDAG/Makefile" - - - ac_config_commands="$ac_config_commands lib/ExecutionEngine/Makefile" - - - ac_config_commands="$ac_config_commands lib/ExecutionEngine/Interpreter/Makefile" - - - ac_config_commands="$ac_config_commands lib/ExecutionEngine/JIT/Makefile" - - - ac_config_commands="$ac_config_commands lib/Support/Makefile" - - - ac_config_commands="$ac_config_commands lib/Target/Makefile" - - - ac_config_commands="$ac_config_commands lib/Target/Sparc/Makefile" - - - ac_config_commands="$ac_config_commands lib/Target/X86/Makefile" - - - ac_config_commands="$ac_config_commands lib/Transforms/Makefile" - - - ac_config_commands="$ac_config_commands lib/Transforms/Hello/Makefile" - - - ac_config_commands="$ac_config_commands lib/Transforms/IPO/Makefile" - - - ac_config_commands="$ac_config_commands lib/Transforms/Instrumentation/Makefile" - - - ac_config_commands="$ac_config_commands lib/Transforms/Instrumentation/ProfilePaths/Makefile" - - - ac_config_commands="$ac_config_commands lib/Transforms/Scalar/Makefile" - - - ac_config_commands="$ac_config_commands lib/Transforms/Utils/Makefile" - - - ac_config_commands="$ac_config_commands lib/VMCore/Makefile" - - ac_config_commands="$ac_config_commands runtime/Makefile" - ac_config_commands="$ac_config_commands runtime/GCCLibraries/Makefile" - - - ac_config_commands="$ac_config_commands runtime/GCCLibraries/crtend/Makefile" - - - ac_config_commands="$ac_config_commands runtime/GCCLibraries/libc/Makefile" - - - ac_config_commands="$ac_config_commands runtime/GCCLibraries/libcurses/Makefile" - - - ac_config_commands="$ac_config_commands runtime/GCCLibraries/libg/Makefile" - - - ac_config_commands="$ac_config_commands runtime/GCCLibraries/libgcc/Makefile" - - - ac_config_commands="$ac_config_commands runtime/GCCLibraries/libm/Makefile" - - - ac_config_commands="$ac_config_commands runtime/GCCLibraries/libmalloc/Makefile" - - - ac_config_commands="$ac_config_commands runtime/GCCLibraries/libtermcap/Makefile" - - - ac_config_commands="$ac_config_commands runtime/GCCLibraries/libucb/Makefile" - - - ac_config_commands="$ac_config_commands runtime/GCCLibraries/libutempter/Makefile" - - - ac_config_commands="$ac_config_commands runtime/GCCLibraries/libutil/Makefile" - - - ac_config_commands="$ac_config_commands runtime/libdummy/Makefile" - - - ac_config_commands="$ac_config_commands runtime/libtrace/Makefile" - - - ac_config_commands="$ac_config_commands runtime/libprofile/Makefile" - - ac_config_commands="$ac_config_commands test/Makefile" @@ -1766,93 +1628,12 @@ ac_config_commands="$ac_config_commands test/Programs/External/SPEC/Makefile.spec" - ac_config_commands="$ac_config_commands test/Programs/External/SPEC/CFP2000/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/External/SPEC/CFP2000/177.mesa/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/External/SPEC/CFP2000/179.art/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/External/SPEC/CFP2000/183.equake/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/External/SPEC/CFP2000/188.ammp/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/External/SPEC/CINT2000/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/External/SPEC/CINT2000/164.gzip/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/External/SPEC/CINT2000/175.vpr/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/External/SPEC/CINT2000/176.gcc/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/External/SPEC/CINT2000/181.mcf/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/External/SPEC/CINT2000/186.crafty/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/External/SPEC/CINT2000/197.parser/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/External/SPEC/CINT2000/252.eon/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/External/SPEC/CINT2000/253.perlbmk/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/External/SPEC/CINT2000/254.gap/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/External/SPEC/CINT2000/255.vortex/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/External/SPEC/CINT2000/256.bzip2/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/External/SPEC/CINT2000/300.twolf/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/LLVMSource/Makefile" - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Makefile" ac_config_commands="$ac_config_commands test/Programs/MultiSource/Makefile.multisrc" - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Applications/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Applications/Burg/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Applications/aha/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Applications/sgefa/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/Fhourstones/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/FreeBench/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/FreeBench/analyzer/Makefile" - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/FreeBench/analyzer/test.in" @@ -1892,204 +1673,18 @@ ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/FreeBench/pifft/test.in" - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/McCat/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/McCat/01-qbsort/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/McCat/03-testtrie/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/McCat/04-bisect/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/McCat/05-eks/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/McCat/08-main/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/McCat/09-vor/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/McCat/12-IOtest/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/McCat/15-trie/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/McCat/17-bintr/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/McCat/18-imp/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/Olden/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/Olden/bh/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/Olden/bisort/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/Olden/em3d/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/Olden/health/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/Olden/mst/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/Olden/perimeter/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/Olden/power/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/Olden/treeadd/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/Olden/tsp/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/Olden/voronoi/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/OptimizerEval/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/Ptrdist/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/Ptrdist/anagram/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/Ptrdist/bc/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/Ptrdist/ft/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/Ptrdist/ks/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/Ptrdist/yacr2/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/llubenchmark/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/MultiSource/Benchmarks/sim/Makefile" - - ac_config_commands="$ac_config_commands test/Programs/SingleSource/Makefile" ac_config_commands="$ac_config_commands test/Programs/SingleSource/Makefile.singlesrc" - ac_config_commands="$ac_config_commands test/Programs/SingleSource/Gizmos/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/SingleSource/Benchmarks/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/SingleSource/Benchmarks/Dhrystone/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/SingleSource/Benchmarks/Shootout/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/SingleSource/Benchmarks/Stanford/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/SingleSource/Benchmarks/Misc/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/SingleSource/CustomChecked/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/SingleSource/UnitTests/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/SingleSource/UnitTests/SetjmpLongjmp/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/SingleSource/Regression/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/SingleSource/Regression/C/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/SingleSource/Regression/C++/Makefile" - - - ac_config_commands="$ac_config_commands test/Programs/SingleSource/Regression/C++/EH/Makefile" - - ac_config_commands="$ac_config_commands tools/Makefile" - ac_config_commands="$ac_config_commands tools/analyze/Makefile" - - - ac_config_commands="$ac_config_commands tools/bugpoint/Makefile" - - - ac_config_commands="$ac_config_commands tools/extract/Makefile" - - - ac_config_commands="$ac_config_commands tools/gccas/Makefile" - - - ac_config_commands="$ac_config_commands tools/gccld/Makefile" - - - ac_config_commands="$ac_config_commands tools/llc/Makefile" - - - ac_config_commands="$ac_config_commands tools/llee/Makefile" - - - ac_config_commands="$ac_config_commands tools/lli/Makefile" - - - ac_config_commands="$ac_config_commands tools/llvm-ar/Makefile" - - - ac_config_commands="$ac_config_commands tools/llvm-as/Makefile" - - - ac_config_commands="$ac_config_commands tools/llvm-dis/Makefile" - - - ac_config_commands="$ac_config_commands tools/llvm-link/Makefile" - - - ac_config_commands="$ac_config_commands tools/llvm-nm/Makefile" - - - ac_config_commands="$ac_config_commands tools/llvm-prof/Makefile" - - - ac_config_commands="$ac_config_commands tools/opt/Makefile" - - ac_config_commands="$ac_config_commands utils/Makefile" - ac_config_commands="$ac_config_commands utils/Burg/Makefile" - - - ac_config_commands="$ac_config_commands utils/Burg/Doc/Makefile" - - - ac_config_commands="$ac_config_commands utils/TableGen/Makefile" - - ac_config_commands="$ac_config_commands projects/Makefile" @@ -4495,7 +4090,7 @@ ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 4498 "configure"' > conftest.$ac_ext + echo '#line 4093 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -5336,7 +4931,7 @@ # Provide some information about the compiler. -echo "$as_me:5339:" \ +echo "$as_me:4934:" \ "checking for Fortran 77 compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 @@ -6345,11 +5940,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6348: $lt_compile\"" >&5) + (eval echo "\"\$as_me:5943: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:6352: \$? = $ac_status" >&5 + echo "$as_me:5947: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -6577,11 +6172,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6580: $lt_compile\"" >&5) + (eval echo "\"\$as_me:6175: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:6584: \$? = $ac_status" >&5 + echo "$as_me:6179: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -6644,11 +6239,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6647: $lt_compile\"" >&5) + (eval echo "\"\$as_me:6242: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:6651: \$? = $ac_status" >&5 + echo "$as_me:6246: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -8656,7 +8251,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5) + (eval echo "\"\$as_me:10488: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:10897: \$? = $ac_status" >&5 + echo "$as_me:10492: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -10957,11 +10552,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:10960: $lt_compile\"" >&5) + (eval echo "\"\$as_me:10555: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:10964: \$? = $ac_status" >&5 + echo "$as_me:10559: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -12200,7 +11795,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5) + (eval echo "\"\$as_me:12718: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:13127: \$? = $ac_status" >&5 + echo "$as_me:12722: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -13187,11 +12782,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:13190: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12785: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:13194: \$? = $ac_status" >&5 + echo "$as_me:12789: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -15131,11 +14726,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15134: $lt_compile\"" >&5) + (eval echo "\"\$as_me:14729: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:15138: \$? = $ac_status" >&5 + echo "$as_me:14733: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -15363,11 +14958,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15366: $lt_compile\"" >&5) + (eval echo "\"\$as_me:14961: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:15370: \$? = $ac_status" >&5 + echo "$as_me:14965: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -15430,11 +15025,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15433: $lt_compile\"" >&5) + (eval echo "\"\$as_me:15028: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:15437: \$? = $ac_status" >&5 + echo "$as_me:15032: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -17442,7 +17037,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext < Changes in directory llvm/autoconf: configure.ac updated: 1.57 -> 1.58 --- Log message: Added a pseudo-hack: The Makefile now copies Makefiles from source tree to object tree if it is missing. This means that new Makefiles should get picked up automagically, requiring less bothersome re-configuring after updates. --- Diffs of the changes: (+0 -135) Index: llvm/autoconf/configure.ac diff -u llvm/autoconf/configure.ac:1.57 llvm/autoconf/configure.ac:1.58 --- llvm/autoconf/configure.ac:1.57 Sun Nov 23 20:54:17 2003 +++ llvm/autoconf/configure.ac Tue Nov 25 11:49:22 2003 @@ -49,54 +49,8 @@ AC_CONFIG_HEADERS(include/Config/config.h) AC_CONFIG_MAKEFILE(Makefile) AC_CONFIG_MAKEFILE(Makefile.common) -AC_CONFIG_MAKEFILE(Makefile.rules) AC_CONFIG_MAKEFILE(lib/Makefile) -AC_CONFIG_MAKEFILE(lib/Analysis/Makefile) -AC_CONFIG_MAKEFILE(lib/Analysis/DataStructure/Makefile) -AC_CONFIG_MAKEFILE(lib/Analysis/IPA/Makefile) -AC_CONFIG_MAKEFILE(lib/Analysis/LiveVar/Makefile) -AC_CONFIG_MAKEFILE(lib/AsmParser/Makefile) -AC_CONFIG_MAKEFILE(lib/Bytecode/Makefile) -AC_CONFIG_MAKEFILE(lib/Bytecode/Reader/Makefile) -AC_CONFIG_MAKEFILE(lib/Bytecode/Writer/Makefile) -AC_CONFIG_MAKEFILE(lib/CWriter/Makefile) -AC_CONFIG_MAKEFILE(lib/CodeGen/Makefile) -AC_CONFIG_MAKEFILE(lib/CodeGen/InstrSched/Makefile) -AC_CONFIG_MAKEFILE(lib/CodeGen/InstrSelection/Makefile) -AC_CONFIG_MAKEFILE(lib/CodeGen/ModuloScheduling/Makefile) -AC_CONFIG_MAKEFILE(lib/CodeGen/RegAlloc/Makefile) -AC_CONFIG_MAKEFILE(lib/CodeGen/SelectionDAG/Makefile) -AC_CONFIG_MAKEFILE(lib/ExecutionEngine/Makefile) -AC_CONFIG_MAKEFILE(lib/ExecutionEngine/Interpreter/Makefile) -AC_CONFIG_MAKEFILE(lib/ExecutionEngine/JIT/Makefile) -AC_CONFIG_MAKEFILE(lib/Support/Makefile) -AC_CONFIG_MAKEFILE(lib/Target/Makefile) -AC_CONFIG_MAKEFILE(lib/Target/Sparc/Makefile) -AC_CONFIG_MAKEFILE(lib/Target/X86/Makefile) -AC_CONFIG_MAKEFILE(lib/Transforms/Makefile) -AC_CONFIG_MAKEFILE(lib/Transforms/Hello/Makefile) -AC_CONFIG_MAKEFILE(lib/Transforms/IPO/Makefile) -AC_CONFIG_MAKEFILE(lib/Transforms/Instrumentation/Makefile) -AC_CONFIG_MAKEFILE(lib/Transforms/Instrumentation/ProfilePaths/Makefile) -AC_CONFIG_MAKEFILE(lib/Transforms/Scalar/Makefile) -AC_CONFIG_MAKEFILE(lib/Transforms/Utils/Makefile) -AC_CONFIG_MAKEFILE(lib/VMCore/Makefile) AC_CONFIG_MAKEFILE(runtime/Makefile) -AC_CONFIG_MAKEFILE(runtime/GCCLibraries/Makefile) -AC_CONFIG_MAKEFILE(runtime/GCCLibraries/crtend/Makefile) -AC_CONFIG_MAKEFILE(runtime/GCCLibraries/libc/Makefile) -AC_CONFIG_MAKEFILE(runtime/GCCLibraries/libcurses/Makefile) -AC_CONFIG_MAKEFILE(runtime/GCCLibraries/libg/Makefile) -AC_CONFIG_MAKEFILE(runtime/GCCLibraries/libgcc/Makefile) -AC_CONFIG_MAKEFILE(runtime/GCCLibraries/libm/Makefile) -AC_CONFIG_MAKEFILE(runtime/GCCLibraries/libmalloc/Makefile) -AC_CONFIG_MAKEFILE(runtime/GCCLibraries/libtermcap/Makefile) -AC_CONFIG_MAKEFILE(runtime/GCCLibraries/libucb/Makefile) -AC_CONFIG_MAKEFILE(runtime/GCCLibraries/libutempter/Makefile) -AC_CONFIG_MAKEFILE(runtime/GCCLibraries/libutil/Makefile) -AC_CONFIG_MAKEFILE(runtime/libdummy/Makefile) -AC_CONFIG_MAKEFILE(runtime/libtrace/Makefile) -AC_CONFIG_MAKEFILE(runtime/libprofile/Makefile) AC_CONFIG_MAKEFILE(test/Makefile) AC_CONFIG_MAKEFILE(test/Makefile.tests) AC_CONFIG_MAKEFILE(test/QMTest/llvm.py) @@ -120,35 +74,8 @@ AC_CONFIG_MAKEFILE(test/Programs/External/Makefile) AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/Makefile) AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/Makefile.spec) -AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/CFP2000/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/CFP2000/177.mesa/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/CFP2000/179.art/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/CFP2000/183.equake/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/CFP2000/188.ammp/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/CINT2000/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/CINT2000/164.gzip/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/CINT2000/175.vpr/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/CINT2000/176.gcc/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/CINT2000/181.mcf/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/CINT2000/186.crafty/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/CINT2000/197.parser/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/CINT2000/252.eon/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/CINT2000/253.perlbmk/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/CINT2000/254.gap/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/CINT2000/255.vortex/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/CINT2000/256.bzip2/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/External/SPEC/CINT2000/300.twolf/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/LLVMSource/Makefile) AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Makefile) AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Makefile.multisrc) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Applications/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Applications/Burg/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Applications/aha/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Applications/sgefa/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/Fhourstones/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/FreeBench/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/FreeBench/analyzer/Makefile) AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/FreeBench/analyzer/test.in) AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/FreeBench/distray/Makefile) AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/FreeBench/distray/test.in) @@ -162,72 +89,10 @@ AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/FreeBench/pcompress2/test.in) AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/FreeBench/pifft/Makefile) AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/FreeBench/pifft/test.in) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/McCat/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/McCat/01-qbsort/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/McCat/03-testtrie/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/McCat/04-bisect/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/McCat/05-eks/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/McCat/08-main/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/McCat/09-vor/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/McCat/12-IOtest/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/McCat/15-trie/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/McCat/17-bintr/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/McCat/18-imp/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/Olden/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/Olden/bh/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/Olden/bisort/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/Olden/em3d/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/Olden/health/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/Olden/mst/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/Olden/perimeter/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/Olden/power/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/Olden/treeadd/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/Olden/tsp/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/Olden/voronoi/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/OptimizerEval/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/Ptrdist/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/Ptrdist/anagram/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/Ptrdist/bc/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/Ptrdist/ft/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/Ptrdist/ks/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/Ptrdist/yacr2/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/llubenchmark/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/MultiSource/Benchmarks/sim/Makefile) AC_CONFIG_MAKEFILE(test/Programs/SingleSource/Makefile) AC_CONFIG_MAKEFILE(test/Programs/SingleSource/Makefile.singlesrc) -AC_CONFIG_MAKEFILE(test/Programs/SingleSource/Gizmos/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/SingleSource/Benchmarks/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/SingleSource/Benchmarks/Dhrystone/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/SingleSource/Benchmarks/Shootout/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/SingleSource/Benchmarks/Stanford/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/SingleSource/Benchmarks/Misc/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/SingleSource/CustomChecked/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/SingleSource/UnitTests/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/SingleSource/UnitTests/SetjmpLongjmp/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/SingleSource/Regression/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/SingleSource/Regression/C/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/SingleSource/Regression/C++/Makefile) -AC_CONFIG_MAKEFILE(test/Programs/SingleSource/Regression/C++/EH/Makefile) AC_CONFIG_MAKEFILE(tools/Makefile) -AC_CONFIG_MAKEFILE(tools/analyze/Makefile) -AC_CONFIG_MAKEFILE(tools/bugpoint/Makefile) -AC_CONFIG_MAKEFILE(tools/extract/Makefile) -AC_CONFIG_MAKEFILE(tools/gccas/Makefile) -AC_CONFIG_MAKEFILE(tools/gccld/Makefile) -AC_CONFIG_MAKEFILE(tools/llc/Makefile) -AC_CONFIG_MAKEFILE(tools/llee/Makefile) -AC_CONFIG_MAKEFILE(tools/lli/Makefile) -AC_CONFIG_MAKEFILE(tools/llvm-ar/Makefile) -AC_CONFIG_MAKEFILE(tools/llvm-as/Makefile) -AC_CONFIG_MAKEFILE(tools/llvm-dis/Makefile) -AC_CONFIG_MAKEFILE(tools/llvm-link/Makefile) -AC_CONFIG_MAKEFILE(tools/llvm-nm/Makefile) -AC_CONFIG_MAKEFILE(tools/llvm-prof/Makefile) -AC_CONFIG_MAKEFILE(tools/opt/Makefile) AC_CONFIG_MAKEFILE(utils/Makefile) -AC_CONFIG_MAKEFILE(utils/Burg/Makefile) -AC_CONFIG_MAKEFILE(utils/Burg/Doc/Makefile) -AC_CONFIG_MAKEFILE(utils/TableGen/Makefile) AC_CONFIG_MAKEFILE(projects/Makefile) AC_CONFIG_MAKEFILE(projects/ModuleMaker/Makefile) AC_CONFIG_MAKEFILE(projects/ModuleMaker/Makefile.common) From brukman at uiuc.edu Tue Nov 25 12:06:02 2003 From: brukman at uiuc.edu (Misha Brukman) Date: Tue Nov 25 12:06:02 2003 Subject: [llvm-commits] CVS: llvm/Makefile.rules configure In-Reply-To: <200311251749.LAA09274@choi.cs.uiuc.edu> References: <200311251749.LAA09274@choi.cs.uiuc.edu> Message-ID: <20031125180600.GG15004@zion> On Tue, Nov 25, 2003 at 11:49:32AM -0600, John Criswell wrote: > Changes in directory llvm: > > Makefile.rules updated: 1.159 -> 1.160 > configure updated: 1.57 -> 1.58 > > --- > Log message: > > Added a pseudo-hack: The Makefile now copies Makefiles from source tree to > object tree if it is missing. This means that new Makefiles should get > picked up automagically, requiring less bothersome re-configuring after > updates. Uhm... I've already added a pseudo-hack for that: [snip from bottom of Makefile.rules] # If the Makefile in the source tree has been updated, copy it over into the # build tree. Makefile :: $(BUILD_SRC_DIR)/Makefile @${ECHO} "===== Updating Makefile from source dir: `dirname $<` =====" cp -f $< $@ -- Misha Brukman :: http://misha.brukman.net From criswell at cs.uiuc.edu Tue Nov 25 12:27:02 2003 From: criswell at cs.uiuc.edu (John Criswell) Date: Tue Nov 25 12:27:02 2003 Subject: [llvm-commits] CVS: llvm/Makefile.rules configure In-Reply-To: <20031125180600.GG15004@zion> References: <200311251749.LAA09274@choi.cs.uiuc.edu> <20031125180600.GG15004@zion> Message-ID: <3FC39ED4.5060503@cs.uiuc.edu> Misha Brukman wrote: > On Tue, Nov 25, 2003 at 11:49:32AM -0600, John Criswell wrote: > >>Changes in directory llvm: >> >>Makefile.rules updated: 1.159 -> 1.160 >>configure updated: 1.57 -> 1.58 >> >>--- >>Log message: >> >>Added a pseudo-hack: The Makefile now copies Makefiles from source tree to >>object tree if it is missing. This means that new Makefiles should get >>picked up automagically, requiring less bothersome re-configuring after >>updates. > > > Uhm... I've already added a pseudo-hack for that: > > [snip from bottom of Makefile.rules] > > # If the Makefile in the source tree has been updated, copy it over into the > # build tree. > Makefile :: $(BUILD_SRC_DIR)/Makefile > @${ECHO} "===== Updating Makefile from source dir: `dirname $<` =====" > cp -f $< $@ > Mine is designed to replace the work done by autoconf (i.e. configure no longer copies over all of the Makefiles and creates all of the subdirectories. The master Makefile does this as needed). This avoids having to change autoconf/configure.ac every time we add a new directory with a new Makefile (although at times that will still be necessary). I'm planning on adding stuff later that will do better dependency checking (i.e. create the directories and Makefiles only if they don't exist). -- John T. -- ********************************************************************* * John T. Criswell Email: criswell at uiuc.edu * * Research Programmer * * University of Illinois at Urbana-Champaign * * * * "It's today!" said Piglet. "My favorite day," said Pooh. * ********************************************************************* From lattner at cs.uiuc.edu Tue Nov 25 12:34:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 12:34:01 2003 Subject: [llvm-commits] CVS: llvm/lib/Analysis/BasicAliasAnalysis.cpp Message-ID: <200311251833.MAA19710@zion.cs.uiuc.edu> Changes in directory llvm/lib/Analysis: BasicAliasAnalysis.cpp updated: 1.16 -> 1.17 --- Log message: Finegrainify namespacification --- Diffs of the changes: (+2 -4) Index: llvm/lib/Analysis/BasicAliasAnalysis.cpp diff -u llvm/lib/Analysis/BasicAliasAnalysis.cpp:1.16 llvm/lib/Analysis/BasicAliasAnalysis.cpp:1.17 --- llvm/lib/Analysis/BasicAliasAnalysis.cpp:1.16 Tue Nov 11 16:41:31 2003 +++ llvm/lib/Analysis/BasicAliasAnalysis.cpp Tue Nov 25 12:33:40 2003 @@ -22,11 +22,10 @@ #include "llvm/GlobalValue.h" #include "llvm/DerivedTypes.h" #include "llvm/Target/TargetData.h" - -namespace llvm { +using namespace llvm; // Make sure that anything that uses AliasAnalysis pulls in this file... -void BasicAAStub() {} +namespace llvm { void BasicAAStub() {} } namespace { struct BasicAliasAnalysis : public ImmutablePass, public AliasAnalysis { @@ -363,4 +362,3 @@ return MayAlias; } -} // End llvm namespace From criswell at cs.uiuc.edu Tue Nov 25 13:33:02 2003 From: criswell at cs.uiuc.edu (John Criswell) Date: Tue Nov 25 13:33:02 2003 Subject: [llvm-commits] CVS: llvm/Makefile.rules Message-ID: <200311251932.NAA23606@choi.cs.uiuc.edu> Changes in directory llvm: Makefile.rules updated: 1.160 -> 1.161 --- Log message: All directory targets now install the Makefile only if it is missing. Directory targets no longer check for existance of the directory in the object tree; if the Makefile doesn't exist, we will re-create the directory. This seems to be a pretty good assumption and saves us from checking directory existance each time. --- Diffs of the changes: (+9 -3) Index: llvm/Makefile.rules diff -u llvm/Makefile.rules:1.160 llvm/Makefile.rules:1.161 --- llvm/Makefile.rules:1.160 Tue Nov 25 11:49:21 2003 +++ llvm/Makefile.rules Tue Nov 25 13:32:22 2003 @@ -395,9 +395,9 @@ ifdef DIRS all install clean test bytecode :: $(VERB) for dir in ${DIRS}; do \ - $(MKDIR) $$dir; \ if [ ! -f $$dir/Makefile ]; \ then \ + $(MKDIR) $$dir; \ cp $(SourceDir)/$$dir/Makefile $$dir/Makefile; \ fi; \ ($(MAKE) -C $$dir $@) || exit 1; \ @@ -413,7 +413,12 @@ bytecode :: $(addsuffix /.makebytecode, $(PARALLEL_DIRS)) %/.makeall %/.makeinstall %/.makeclean %/.maketest %/.makebytecode: - $(VERB) $(MKDIR) $(@D); cp $(SourceDir)/$(@D)/Makefile $(@D); $(MAKE) -C $(@D) $(subst $(@D)/.make,,$@) + $(VERB) if [ ! -f $(@D)/Makefile ]; \ + then \ + $(MKDIR) $(@D); \ + cp $(SourceDir)/$(@D)/Makefile $(@D)/Makefile; \ + fi; \ + $(MAKE) -C $(@D) $(subst $(@D)/.make,,$@) endif # Handle directories that may or may not exist @@ -422,9 +427,9 @@ $(VERB) for dir in ${OPTIONAL_DIRS}; do \ if [ -d $(SourceDir)/$$dir ]; \ then\ - $(MKDIR) $$dir; \ if [ ! -f $$dir/Makefile ]; \ then \ + $(MKDIR) $$dir; \ cp $(SourceDir)/$$dir/Makefile $$dir/Makefile; \ fi; \ ($(MAKE) -C$$dir $@) || exit 1; \ @@ -830,6 +835,7 @@ # build tree. Makefile :: $(BUILD_SRC_DIR)/Makefile @${ECHO} "===== Updating Makefile from source dir: `dirname $<` =====" + $(MKDIR) $(@D) cp -f $< $@ # From lattner at cs.uiuc.edu Tue Nov 25 13:38:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 13:38:01 2003 Subject: [llvm-commits] CVS: llvm/include/llvm/Support/GetElementPtrTypeIterator.h Message-ID: <200311251937.NAA21473@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Support: GetElementPtrTypeIterator.h added (r1.1) --- Log message: Initial checkin of gep_type_begin/end which will be used to address PR82 --- Diffs of the changes: (+92 -0) Index: llvm/include/llvm/Support/GetElementPtrTypeIterator.h diff -c /dev/null llvm/include/llvm/Support/GetElementPtrTypeIterator.h:1.1 *** /dev/null Tue Nov 25 13:37:38 2003 --- llvm/include/llvm/Support/GetElementPtrTypeIterator.h Tue Nov 25 13:37:28 2003 *************** *** 0 **** --- 1,92 ---- + //===- llvm/Support/GetElementPtrTypeIterator.h -----------------*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by the LLVM research group and is distributed under + // the University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file implements an iterator for walking through the types indexed by + // getelementptr instructions. + // + //===----------------------------------------------------------------------===// + + #ifndef LLVM_SUPPORT_GETELEMENTPTRTYPE_H + #define LLVM_SUPPORT_GETELEMENTPTRTYPE_H + + #include "Support/iterator" + #include "llvm/iMemory.h" + #include "llvm/DerivedTypes.h" + + namespace llvm { + class GetElementPtrTypeIterator + : public forward_iterator { + typedef forward_iterator super; + + GetElementPtrInst *TheGEP; + const Type *CurTy; + unsigned Operand; + + GetElementPtrTypeIterator() {} + public: + + static GetElementPtrTypeIterator begin(GetElementPtrInst *gep) { + GetElementPtrTypeIterator I; + I.TheGEP = gep; + I.CurTy = gep->getOperand(0)->getType(); + I.Operand = 1; + return I; + } + static GetElementPtrTypeIterator end(GetElementPtrInst *gep) { + GetElementPtrTypeIterator I; + I.TheGEP = gep; + I.CurTy = 0; + I.Operand = gep->getNumOperands(); + return I; + } + + bool operator==(const GetElementPtrTypeIterator& x) const { + return Operand == x.Operand; + } + bool operator!=(const GetElementPtrTypeIterator& x) const { + return !operator==(x); + } + + const Type *operator*() const { + return CurTy; + } + + // This is a non-standard operator->. It allows you to call methods on the + // current type directly. + const Type *operator->() const { return operator*(); } + + unsigned getOperandNum() const { return Operand; } + + Value *getOperand() const { return TheGEP->getOperand(Operand); } + + GetElementPtrTypeIterator& operator++() { // Preincrement + if (const CompositeType *CT = dyn_cast(CurTy)) { + CurTy = CT->getTypeAtIndex(getOperand()); + } else { + CurTy = 0; + } + ++Operand; + return *this; + } + + GetElementPtrTypeIterator operator++(int) { // Postincrement + GetElementPtrTypeIterator tmp = *this; ++*this; return tmp; + } + }; + + inline GetElementPtrTypeIterator gep_type_begin(GetElementPtrInst *GEP) { + return GetElementPtrTypeIterator::begin(GEP); + } + + inline GetElementPtrTypeIterator gep_type_end(GetElementPtrInst *GEP) { + return GetElementPtrTypeIterator::end(GEP); + } + } // end namespace llvm + + #endif From lattner at cs.uiuc.edu Tue Nov 25 13:59:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 13:59:01 2003 Subject: [llvm-commits] CVS: llvm/include/llvm/Support/GetElementPtrTypeIterator.h Message-ID: <200311251958.NAA00446@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Support: GetElementPtrTypeIterator.h updated: 1.1 -> 1.2 --- Log message: Rename class to be consistent with other iterator classes --- Diffs of the changes: (+15 -15) Index: llvm/include/llvm/Support/GetElementPtrTypeIterator.h diff -u llvm/include/llvm/Support/GetElementPtrTypeIterator.h:1.1 llvm/include/llvm/Support/GetElementPtrTypeIterator.h:1.2 --- llvm/include/llvm/Support/GetElementPtrTypeIterator.h:1.1 Tue Nov 25 13:37:28 2003 +++ llvm/include/llvm/Support/GetElementPtrTypeIterator.h Tue Nov 25 13:58:35 2003 @@ -20,7 +20,7 @@ #include "llvm/DerivedTypes.h" namespace llvm { - class GetElementPtrTypeIterator + class gep_type_iterator : public forward_iterator { typedef forward_iterator super; @@ -28,28 +28,28 @@ const Type *CurTy; unsigned Operand; - GetElementPtrTypeIterator() {} + gep_type_iterator() {} public: - static GetElementPtrTypeIterator begin(GetElementPtrInst *gep) { - GetElementPtrTypeIterator I; + static gep_type_iterator begin(GetElementPtrInst *gep) { + gep_type_iterator I; I.TheGEP = gep; I.CurTy = gep->getOperand(0)->getType(); I.Operand = 1; return I; } - static GetElementPtrTypeIterator end(GetElementPtrInst *gep) { - GetElementPtrTypeIterator I; + static gep_type_iterator end(GetElementPtrInst *gep) { + gep_type_iterator I; I.TheGEP = gep; I.CurTy = 0; I.Operand = gep->getNumOperands(); return I; } - bool operator==(const GetElementPtrTypeIterator& x) const { + bool operator==(const gep_type_iterator& x) const { return Operand == x.Operand; } - bool operator!=(const GetElementPtrTypeIterator& x) const { + bool operator!=(const gep_type_iterator& x) const { return !operator==(x); } @@ -65,7 +65,7 @@ Value *getOperand() const { return TheGEP->getOperand(Operand); } - GetElementPtrTypeIterator& operator++() { // Preincrement + gep_type_iterator& operator++() { // Preincrement if (const CompositeType *CT = dyn_cast(CurTy)) { CurTy = CT->getTypeAtIndex(getOperand()); } else { @@ -75,17 +75,17 @@ return *this; } - GetElementPtrTypeIterator operator++(int) { // Postincrement - GetElementPtrTypeIterator tmp = *this; ++*this; return tmp; + gep_type_iterator operator++(int) { // Postincrement + gep_type_iterator tmp = *this; ++*this; return tmp; } }; - inline GetElementPtrTypeIterator gep_type_begin(GetElementPtrInst *GEP) { - return GetElementPtrTypeIterator::begin(GEP); + inline gep_type_iterator gep_type_begin(GetElementPtrInst *GEP) { + return gep_type_iterator::begin(GEP); } - inline GetElementPtrTypeIterator gep_type_end(GetElementPtrInst *GEP) { - return GetElementPtrTypeIterator::end(GEP); + inline gep_type_iterator gep_type_end(GetElementPtrInst *GEP) { + return gep_type_iterator::end(GEP); } } // end namespace llvm From criswell at cs.uiuc.edu Tue Nov 25 13:59:06 2003 From: criswell at cs.uiuc.edu (John Criswell) Date: Tue Nov 25 13:59:06 2003 Subject: [llvm-commits] CVS: llvm/projects/sample/autoconf/autom4te.cache/ Message-ID: <200311251958.NAA10327@choi.cs.uiuc.edu> Changes in directory llvm/projects/sample/autoconf/autom4te.cache: --- Log message: Directory /home/vadve/shared/PublicCVS/llvm/projects/sample/autoconf/autom4te.cache added to the repository --- Diffs of the changes: (+0 -0) From criswell at cs.uiuc.edu Tue Nov 25 14:00:01 2003 From: criswell at cs.uiuc.edu (John Criswell) Date: Tue Nov 25 14:00:01 2003 Subject: [llvm-commits] CVS: llvm/projects/ModuleMaker/autoconf/ Message-ID: <200311251959.NAA10362@choi.cs.uiuc.edu> Changes in directory llvm/projects/ModuleMaker/autoconf: --- Log message: Directory /home/vadve/shared/PublicCVS/llvm/projects/ModuleMaker/autoconf added to the repository --- Diffs of the changes: (+0 -0) From criswell at cs.uiuc.edu Tue Nov 25 14:00:06 2003 From: criswell at cs.uiuc.edu (John Criswell) Date: Tue Nov 25 14:00:06 2003 Subject: [llvm-commits] CVS: llvm/projects/ModuleMaker/Makefile.common.in Makefile.common Message-ID: <200311251959.NAA10347@choi.cs.uiuc.edu> Changes in directory llvm/projects/ModuleMaker: Makefile.common.in added (r1.1) Makefile.common (r1.2) removed --- Log message: Auto-conf'ed the ModuleMaker code. Moved Makefile.common to Makefile.common.in. --- Diffs of the changes: (+23 -0) Index: llvm/projects/ModuleMaker/Makefile.common.in diff -c /dev/null llvm/projects/ModuleMaker/Makefile.common.in:1.1 *** /dev/null Tue Nov 25 13:59:31 2003 --- llvm/projects/ModuleMaker/Makefile.common.in Tue Nov 25 13:59:21 2003 *************** *** 0 **** --- 1,23 ---- + # + # Configure the location of the LLVM object root. We know it is two + # directories up. The source tree location we do not know; let the LLVM + # Makefiles find it for us. + # + LLVM_OBJ_ROOT=$(LEVEL)/../.. + + # + # Grab the LLVM configuration file. + # + include $(LEVEL)/../../Makefile.config + + # + # Reconfigure the source directories + # + BUILD_SRC_ROOT:=$(LLVM_SRC_ROOT)/projects/ModuleMaker + BUILD_SRC_DIR := $(subst //,/,$(BUILD_SRC_ROOT)/$(patsubst $(BUILD_OBJ_ROOT)%,%,$(BUILD_OBJ_DIR))) + + # + # Include LLVM's build rules. + # + include $(LLVM_SRC_ROOT)/Makefile.rules + From criswell at cs.uiuc.edu Tue Nov 25 14:01:02 2003 From: criswell at cs.uiuc.edu (John Criswell) Date: Tue Nov 25 14:01:02 2003 Subject: [llvm-commits] CVS: llvm/projects/ModuleMaker/autoconf/LICENSE.TXT aclocal.m4 config.guess config.sub configure.ac install-sh ltmain.sh mkinstalldirs Message-ID: <200311252000.OAA10392@choi.cs.uiuc.edu> Changes in directory llvm/projects/ModuleMaker/autoconf: LICENSE.TXT added (r1.1) aclocal.m4 added (r1.1) config.guess added (r1.1) config.sub added (r1.1) configure.ac added (r1.1) install-sh added (r1.1) ltmain.sh added (r1.1) mkinstalldirs added (r1.1) --- Log message: Auto-confed ModuleMaker. --- Diffs of the changes: (+15771 -0) Index: llvm/projects/ModuleMaker/autoconf/LICENSE.TXT diff -c /dev/null llvm/projects/ModuleMaker/autoconf/LICENSE.TXT:1.1 *** /dev/null Tue Nov 25 14:00:09 2003 --- llvm/projects/ModuleMaker/autoconf/LICENSE.TXT Tue Nov 25 13:59:58 2003 *************** *** 0 **** --- 1,24 ---- + ------------------------------------------------------------------------------ + Autoconf Files + ------------------------------------------------------------------------------ + All autoconf files are licensed under the LLVM license with the following + additions: + + llvm/autoconf/install-sh: + This script is licensed under the LLVM license, with the following + additional copyrights and restrictions: + + Copyright 1991 by the Massachusetts Institute of Technology + + Permission to use, copy, modify, distribute, and sell this software and its + documentation for any purpose is hereby granted without fee, provided that + the above copyright notice appear in all copies and that both that + copyright notice and this permission notice appear in supporting + documentation, and that the name of M.I.T. not be used in advertising or + publicity pertaining to distribution of the software without specific, + written prior permission. M.I.T. makes no representations about the + suitability of this software for any purpose. It is provided "as is" + without express or implied warranty. + + Please see the source files for additional copyrights. + Index: llvm/projects/ModuleMaker/autoconf/aclocal.m4 diff -c /dev/null llvm/projects/ModuleMaker/autoconf/aclocal.m4:1.1 *** /dev/null Tue Nov 25 14:00:09 2003 --- llvm/projects/ModuleMaker/autoconf/aclocal.m4 Tue Nov 25 13:59:59 2003 *************** *** 0 **** --- 1,6168 ---- + # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- + ## Copyright 1996, 1997, 1998, 1999, 2000, 2001 + ## Free Software Foundation, Inc. + ## Originally by Gordon Matzigkeit , 1996 + ## + ## This program is free software; you can redistribute it and/or modify + ## it under the terms of the GNU General Public License as published by + ## the Free Software Foundation; either version 2 of the License, or + ## (at your option) any later version. + ## + ## This program is distributed in the hope that it will be useful, but + ## WITHOUT ANY WARRANTY; without even the implied warranty of + ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ## General Public License for more details. + ## + ## You should have received a copy of the GNU General Public License + ## along with this program; if not, write to the Free Software + ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + ## + ## As a special exception to the GNU General Public License, if you + ## distribute this file as part of a program that contains a + ## configuration script generated by Autoconf, you may include it under + ## the same distribution terms that you use for the rest of that program. + + # serial 47 AC_PROG_LIBTOOL + + + # AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) + # ----------------------------------------------------------- + # If this macro is not defined by Autoconf, define it here. + m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + + # AC_PROG_LIBTOOL + # --------------- + AC_DEFUN([AC_PROG_LIBTOOL], + [AC_REQUIRE([_AC_PROG_LIBTOOL])dnl + dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX + dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) + dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 + ])]) + + dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. + dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run + dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) + ])])# AC_PROG_LIBTOOL + + + # _AC_PROG_LIBTOOL + # ---------------- + AC_DEFUN([_AC_PROG_LIBTOOL], + [AC_REQUIRE([AC_LIBTOOL_SETUP])dnl + AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl + AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl + AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + + # This can be used to rebuild libtool when needed + LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + + # Always use our own libtool. + LIBTOOL='$(SHELL) $(top_builddir)/mklib' + AC_SUBST(LIBTOOL)dnl + + # Prevent multiple expansion + define([AC_PROG_LIBTOOL], []) + ])# _AC_PROG_LIBTOOL + + + # AC_LIBTOOL_SETUP + # ---------------- + AC_DEFUN([AC_LIBTOOL_SETUP], + [AC_PREREQ(2.50)dnl + AC_REQUIRE([AC_ENABLE_SHARED])dnl + AC_REQUIRE([AC_ENABLE_STATIC])dnl + AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + AC_REQUIRE([AC_CANONICAL_BUILD])dnl + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_PROG_LD])dnl + AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl + AC_REQUIRE([AC_PROG_NM])dnl + + AC_REQUIRE([AC_PROG_LN_S])dnl + AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl + # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! + AC_REQUIRE([AC_OBJEXT])dnl + AC_REQUIRE([AC_EXEEXT])dnl + dnl + + AC_LIBTOOL_SYS_MAX_CMD_LEN + AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + AC_LIBTOOL_OBJDIR + + AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + _LT_AC_PROG_ECHO_BACKSLASH + + case $host_os in + aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; + esac + + # Sed substitution that helps us do robust quoting. It backslashifies + # metacharacters that are still active within double-quoted strings. + Xsed='sed -e s/^X//' + [sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + + # Same as above, but do not quote variable references. + [double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + + # Sed substitution to delay expansion of an escaped shell variable in a + # double_quote_subst'ed string. + delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + + # Sed substitution to avoid accidental globbing in evaled expressions + no_glob_subst='s/\*/\\\*/g' + + # Constants: + rm="rm -f" + + # Global variables: + default_ofile=mklib + can_build_shared=yes + + # All known linkers require a `.a' archive for static linking (except M$VC, + # which needs '.lib'). + libext=a + ltmain="$ac_aux_dir/ltmain.sh" + ofile="$default_ofile" + with_gnu_ld="$lt_cv_prog_gnu_ld" + + AC_CHECK_TOOL(AR, ar, false) + AC_CHECK_TOOL(RANLIB, ranlib, :) + AC_CHECK_TOOL(STRIP, strip, :) + + old_CC="$CC" + old_CFLAGS="$CFLAGS" + + # Set sane defaults for various variables + test -z "$AR" && AR=ar + test -z "$AR_FLAGS" && AR_FLAGS=cru + test -z "$AS" && AS=as + test -z "$CC" && CC=cc + test -z "$LTCC" && LTCC=$CC + test -z "$DLLTOOL" && DLLTOOL=dlltool + test -z "$LD" && LD=ld + test -z "$LN_S" && LN_S="ln -s" + test -z "$MAGIC_CMD" && MAGIC_CMD=file + test -z "$NM" && NM=nm + test -z "$SED" && SED=sed + test -z "$OBJDUMP" && OBJDUMP=objdump + test -z "$RANLIB" && RANLIB=: + test -z "$STRIP" && STRIP=: + test -z "$ac_objext" && ac_objext=o + + # Determine commands to create old-style static archives. + old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' + old_postinstall_cmds='chmod 644 $oldlib' + old_postuninstall_cmds= + + if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" + fi + + # Only perform the check for file, if the check method requires it + case $deplibs_check_method in + file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; + esac + + AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) + AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], + enable_win32_dll=yes, enable_win32_dll=no) + + AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) + test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + + AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) + test -z "$pic_mode" && pic_mode=default + + # Use C for the default configuration in the libtool script + tagname= + AC_LIBTOOL_LANG_C_CONFIG + _LT_AC_TAGCONFIG + ])# AC_LIBTOOL_SETUP + + + # _LT_AC_SYS_COMPILER + # ------------------- + AC_DEFUN([_LT_AC_SYS_COMPILER], + [AC_REQUIRE([AC_PROG_CC])dnl + + # If no C compiler was specified, use CC. + LTCC=${LTCC-"$CC"} + + # Allow CC to be a program name with arguments. + compiler=$CC + ])# _LT_AC_SYS_COMPILER + + + # _LT_AC_SYS_LIBPATH_AIX + # ---------------------- + # Links a minimal program and checks the executable + # for the system default hardcoded library path. In most cases, + # this is /usr/lib:/lib, but when the MPI compilers are used + # the location of the communication and MPI libs are included too. + # If we don't find anything, use the default library path according + # to the aix ld manual. + AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], + [AC_LINK_IFELSE(AC_LANG_PROGRAM,[ + aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } + }'` + # Check for a 64-bit object if we didn't find anything. + if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } + }'`; fi],[]) + if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + ])# _LT_AC_SYS_LIBPATH_AIX + + + # _LT_AC_SHELL_INIT(ARG) + # ---------------------- + AC_DEFUN([_LT_AC_SHELL_INIT], + [ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) + $1 + AC_DIVERT_POP + ])# _LT_AC_SHELL_INIT + + + # _LT_AC_PROG_ECHO_BACKSLASH + # -------------------------- + # Add some code to the start of the generated configure script which + # will find an echo command which doesn't interpret backslashes. + AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], + [_LT_AC_SHELL_INIT([ + # Check that we are running under the correct shell. + SHELL=${CONFIG_SHELL-/bin/sh} + + case X$ECHO in + X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; + esac + + echo=${ECHO-echo} + if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : + elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : + else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} + fi + + if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done + fi + + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : + else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi + fi + fi + + # Copy echo and quote the copy suitably for passing to libtool from + # the Makefile, instead of quoting the original, which is used later. + ECHO=$echo + if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" + fi + + AC_SUBST(ECHO) + ])])# _LT_AC_PROG_ECHO_BACKSLASH + + + # _LT_AC_LOCK + # ----------- + AC_DEFUN([_LT_AC_LOCK], + [AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) + test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + + # Some flags need to be propagated to the compiler or linker for good + # libtool support. + case $host in + ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; + *-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + + x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + + *-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; + AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], + [*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) + esac + + need_locks="$enable_libtool_lock" + + ])# _LT_AC_LOCK + + + # AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, + # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) + # ---------------------------------------------------------------- + # Check whether the given compiler option works + AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], + [AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + $2=yes + fi + fi + $rm conftest* + ]) + + if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) + else + ifelse([$6], , :, [$6]) + fi + ])# AC_LIBTOOL_COMPILER_OPTION + + + # AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, + # [ACTION-SUCCESS], [ACTION-FAILURE]) + # ------------------------------------------------------------ + # Check whether the given compiler option works + AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], + [AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + else + $2=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" + ]) + + if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) + else + ifelse([$5], , :, [$5]) + fi + ])# AC_LIBTOOL_LINKER_OPTION + + + # AC_LIBTOOL_SYS_MAX_CMD_LEN + # -------------------------- + AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], + [# find the maximum length of command line arguments + AC_MSG_CHECKING([the maximum length of command line arguments]) + AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + testring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$testring" 2>/dev/null` \ + = "XX$testring") >/dev/null 2>&1 && + new_result=`expr "X$testring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + testring=$testring$testring + done + testring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac + ]) + if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) + else + AC_MSG_RESULT(none) + fi + ])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + + # _LT_AC_CHECK_DLFCN + # -------------------- + AC_DEFUN([_LT_AC_CHECK_DLFCN], + [AC_CHECK_HEADERS(dlfcn.h)dnl + ])# _LT_AC_CHECK_DLFCN + + + # _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, + # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) + # ------------------------------------------------------------------ + AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], + [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl + if test "$cross_compiling" = yes; then : + [$4] + else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < + #endif + + #include + + #ifdef RTLD_GLOBAL + # define LT_DLGLOBAL RTLD_GLOBAL + #else + # ifdef DL_GLOBAL + # define LT_DLGLOBAL DL_GLOBAL + # else + # define LT_DLGLOBAL 0 + # endif + #endif + + /* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ + #ifndef LT_DLLAZY_OR_NOW + # ifdef RTLD_LAZY + # define LT_DLLAZY_OR_NOW RTLD_LAZY + # else + # ifdef DL_LAZY + # define LT_DLLAZY_OR_NOW DL_LAZY + # else + # ifdef RTLD_NOW + # define LT_DLLAZY_OR_NOW RTLD_NOW + # else + # ifdef DL_NOW + # define LT_DLLAZY_OR_NOW DL_NOW + # else + # define LT_DLLAZY_OR_NOW 0 + # endif + # endif + # endif + # endif + #endif + + #ifdef __cplusplus + extern "C" void exit (int); + #endif + + void fnord() { int i=42;} + int main () + { + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); + }] + EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_unknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi + fi + rm -fr conftest* + ])# _LT_AC_TRY_DLOPEN_SELF + + + # AC_LIBTOOL_DLOPEN_SELF + # ------------------- + AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], + [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl + if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown + else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac + fi + ])# AC_LIBTOOL_DLOPEN_SELF + + + # AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) + # --------------------------------- + # Check to see if options -c and -o are simultaneously supported by compiler + AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], + [AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + # According to Tom Tromey, Ian Lance Taylor reported there are C compilers + # that will create temporary files in the current directory regardless of + # the output directory. Thus, making CWD read-only will cause this test + # to fail, enabling locking or at least warning the user not to do parallel + # builds. + chmod -w . + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . + $rm conftest* out/* + rmdir out + cd .. + rmdir conftest + $rm conftest* + ]) + ])# AC_LIBTOOL_PROG_CC_C_O + + + # AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) + # ----------------------------------------- + # Check to see if we can do hard links to lock some files if needed + AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], + [AC_REQUIRE([_LT_AC_LOCK])dnl + + hard_links="nottested" + if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi + else + need_locks=no + fi + ])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + + # AC_LIBTOOL_OBJDIR + # ----------------- + AC_DEFUN([AC_LIBTOOL_OBJDIR], + [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], + [rm -f .libs 2>/dev/null + mkdir .libs 2>/dev/null + if test -d .libs; then + lt_cv_objdir=.libs + else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs + fi + rmdir .libs 2>/dev/null]) + objdir=$lt_cv_objdir + ])# AC_LIBTOOL_OBJDIR + + + # AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) + # ---------------------------------------------- + # Check hardcoding attributes. + AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], + [AC_MSG_CHECKING([how to hardcode library paths into programs]) + _LT_AC_TAGVAR(hardcode_action, $1)= + if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi + else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported + fi + AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + + if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no + elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless + fi + ])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + + # AC_LIBTOOL_SYS_LIB_STRIP + # ------------------------ + AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], + [striplib= + old_striplib= + AC_MSG_CHECKING([whether stripping libraries is possible]) + if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) + else + # FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac + fi + ])# AC_LIBTOOL_SYS_LIB_STRIP + + + # AC_LIBTOOL_SYS_DYNAMIC_LINKER + # ----------------------------- + # PORTME Fill in your ld.so characteristics + AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], + [AC_MSG_CHECKING([dynamic linker characteristics]) + library_names_spec= + libname_spec='lib$name' + soname_spec= + shrext=".so" + postinstall_cmds= + postuninstall_cmds= + finish_cmds= + finish_eval= + shlibpath_var= + shlibpath_overrides_runpath=unknown + version_type=none + dynamic_linker="$host_os ld.so" + sys_lib_dlsearch_path_spec="/lib /usr/lib" + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + fi + need_lib_prefix=unknown + hardcode_into_libs=no + + # when you set need_version to no, make sure it does not cause -set_version + # flags to be left without arguments + need_version=unknown + + case $host_os in + aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + + aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + + amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' + ;; + + beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + + bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + + cygwin* | mingw* | pw32*) + version_type=windows + shrext=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/lib /lib/w32api /usr/lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + + darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + + dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + + freebsd1*) + dynamic_linker=no + ;; + + freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + + gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + + hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + + irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + + # No shared lib support for Linux oldld, aout, or coff. + linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + + # This must be Linux ELF. + linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + + netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + + newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + + nto-qnx) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + + openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + + os2*) + libname_spec='$name' + shrext=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + + osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + + sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + + solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + + sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + + uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + + *) + dynamic_linker=no + ;; + esac + AC_MSG_RESULT([$dynamic_linker]) + test "$dynamic_linker" = no && can_build_shared=no + ])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + + # _LT_AC_TAGCONFIG + # ---------------- + AC_DEFUN([_LT_AC_TAGCONFIG], + [AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + + if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && test "X$CXX" != "Xno"; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi + fi + ])# _LT_AC_TAGCONFIG + + + # AC_LIBTOOL_DLOPEN + # ----------------- + # enable checks for dlopen support + AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) + ])# AC_LIBTOOL_DLOPEN + + + # AC_LIBTOOL_WIN32_DLL + # -------------------- + # declare package support for building win32 dll's + AC_DEFUN([AC_LIBTOOL_WIN32_DLL], + [AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) + ])# AC_LIBTOOL_WIN32_DLL + + + # AC_ENABLE_SHARED([DEFAULT]) + # --------------------------- + # implement the --enable-shared flag + # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. + AC_DEFUN([AC_ENABLE_SHARED], + [define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl + AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) + ])# AC_ENABLE_SHARED + + + # AC_DISABLE_SHARED + # ----------------- + #- set the default shared flag to --disable-shared + AC_DEFUN([AC_DISABLE_SHARED], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_ENABLE_SHARED(no) + ])# AC_DISABLE_SHARED + + + # AC_ENABLE_STATIC([DEFAULT]) + # --------------------------- + # implement the --enable-static flag + # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. + AC_DEFUN([AC_ENABLE_STATIC], + [define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl + AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) + ])# AC_ENABLE_STATIC + + + # AC_DISABLE_STATIC + # ----------------- + # set the default static flag to --disable-static + AC_DEFUN([AC_DISABLE_STATIC], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_ENABLE_STATIC(no) + ])# AC_DISABLE_STATIC + + + # AC_ENABLE_FAST_INSTALL([DEFAULT]) + # --------------------------------- + # implement the --enable-fast-install flag + # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. + AC_DEFUN([AC_ENABLE_FAST_INSTALL], + [define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl + AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) + ])# AC_ENABLE_FAST_INSTALL + + + # AC_DISABLE_FAST_INSTALL + # ----------------------- + # set the default to --disable-fast-install + AC_DEFUN([AC_DISABLE_FAST_INSTALL], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_ENABLE_FAST_INSTALL(no) + ])# AC_DISABLE_FAST_INSTALL + + + # AC_LIBTOOL_PICMODE([MODE]) + # -------------------------- + # implement the --with-pic flag + # MODE is either `yes' or `no'. If omitted, it defaults to `both'. + AC_DEFUN([AC_LIBTOOL_PICMODE], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + pic_mode=ifelse($#,1,$1,default) + ])# AC_LIBTOOL_PICMODE + + + # AC_PROG_EGREP + # ------------- + # This is predefined starting with Autoconf 2.54, so this conditional + # definition can be removed once we require Autoconf 2.54 or later. + m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], + [AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) + ])]) + + + # AC_PATH_TOOL_PREFIX + # ------------------- + # find a file program which can recognise shared library + AC_DEFUN([AC_PATH_TOOL_PREFIX], + [AC_REQUIRE([AC_PROG_EGREP])dnl + AC_MSG_CHECKING([for $1]) + AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, + [case $MAGIC_CMD in + [[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; + *) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + dnl $ac_dummy forces splitting on constant user-supplied paths. + dnl POSIX.2 word splitting is done only on the output of word expansions, + dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + + *** Warning: the command libtool uses to detect shared libraries, + *** $file_magic_cmd, produces output that libtool cannot recognize. + *** The result is that libtool may fail to recognize shared libraries + *** as such. This will affect the creation of libtool libraries that + *** depend on shared libraries, but programs linked with such libtool + *** libraries will work regardless of this problem. Nevertheless, you + *** may want to report the problem to your system manager and/or to + *** bug-libtool at gnu.org + + EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; + esac]) + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) + else + AC_MSG_RESULT(no) + fi + ])# AC_PATH_TOOL_PREFIX + + + # AC_PATH_MAGIC + # ------------- + # find a file program which can recognise a shared library + AC_DEFUN([AC_PATH_MAGIC], + [AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) + if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi + fi + ])# AC_PATH_MAGIC + + + # AC_PROG_LD + # ---------- + # find the path to the GNU or non-GNU linker + AC_DEFUN([AC_PROG_LD], + [AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) + AC_REQUIRE([LT_AC_PROG_SED])dnl + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + AC_REQUIRE([AC_CANONICAL_BUILD])dnl + ac_prog=ld + if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac + elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) + else + AC_MSG_CHECKING([for non-GNU ld]) + fi + AC_CACHE_VAL(lt_cv_path_LD, + [if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + + gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + + hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case "$host_cpu" in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + + irix5* | irix6* | nonstopux*) + case $host_os in + irix5* | nonstopux*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1" + ;; + esac + lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` + lt_cv_deplibs_check_method=pass_all + ;; + + # This must be Linux ELF. + linux*) + case $host_cpu in + alpha* | hppa* | i*86 | ia64* | m68* | mips | mipsel | powerpc* | sparc* | s390* | sh*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + + newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + + nto-qnx) + lt_cv_deplibs_check_method=unknown + ;; + + openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + + osf3* | osf4* | osf5*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' + lt_cv_file_magic_test_file=/shlib/libc.so + lt_cv_deplibs_check_method=pass_all + ;; + + sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + + solaris*) + lt_cv_deplibs_check_method=pass_all + lt_cv_file_magic_test_file=/lib/libc.so + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ]) + file_magic_cmd=$lt_cv_file_magic_cmd + deplibs_check_method=$lt_cv_deplibs_check_method + test -z "$deplibs_check_method" && deplibs_check_method=unknown + ])# AC_DEPLIBS_CHECK_METHOD + + + # AC_PROG_NM + # ---------- + # find the path to a BSD-compatible name lister + AC_DEFUN([AC_PROG_NM], + [AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, + [if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" + else + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + esac + fi + done + IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm + fi]) + NM="$lt_cv_path_NM" + ])# AC_PROG_NM + + + # AC_CHECK_LIBM + # ------------- + # check for math library + AC_DEFUN([AC_CHECK_LIBM], + [AC_REQUIRE([AC_CANONICAL_HOST])dnl + LIBM= + case $host in + *-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; + *-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; + *) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; + esac + ])# AC_CHECK_LIBM + + + # AC_LIBLTDL_CONVENIENCE([DIRECTORY]) + # ----------------------------------- + # sets LIBLTDL to the link flags for the libltdl convenience library and + # LTDLINCL to the include flags for the libltdl header and adds + # --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL + # and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If + # DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will + # be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with + # '${top_srcdir}/' (note the single quotes!). If your package is not + # flat and you're not using automake, define top_builddir and + # top_srcdir appropriately in the Makefiles. + AC_DEFUN([AC_LIBLTDL_CONVENIENCE], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" + ])# AC_LIBLTDL_CONVENIENCE + + + # AC_LIBLTDL_INSTALLABLE([DIRECTORY]) + # ----------------------------------- + # sets LIBLTDL to the link flags for the libltdl installable library and + # LTDLINCL to the include flags for the libltdl header and adds + # --enable-ltdl-install to the configure arguments. Note that LIBLTDL + # and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If + # DIRECTORY is not provided and an installed libltdl is not found, it is + # assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' + # and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single + # quotes!). If your package is not flat and you're not using automake, + # define top_builddir and top_srcdir appropriately in the Makefiles. + # In the future, this macro may have to be called after AC_PROG_LIBTOOL. + AC_DEFUN([AC_LIBLTDL_INSTALLABLE], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" + ])# AC_LIBLTDL_INSTALLABLE + + + # AC_LIBTOOL_CXX + # -------------- + # enable support for C++ libraries + AC_DEFUN([AC_LIBTOOL_CXX], + [AC_REQUIRE([_LT_AC_LANG_CXX]) + ])# AC_LIBTOOL_CXX + + + # _LT_AC_LANG_CXX + # --------------- + AC_DEFUN([_LT_AC_LANG_CXX], + [AC_REQUIRE([AC_PROG_CXX]) + AC_REQUIRE([AC_PROG_CXXCPP]) + _LT_AC_SHELL_INIT([tagnames=`echo "$tagnames,CXX" | sed 's/^,//'`]) + ])# _LT_AC_LANG_CXX + + + # AC_LIBTOOL_F77 + # -------------- + # enable support for Fortran 77 libraries + AC_DEFUN([AC_LIBTOOL_F77], + [AC_REQUIRE([_LT_AC_LANG_F77]) + ])# AC_LIBTOOL_F77 + + + # _LT_AC_LANG_F77 + # --------------- + AC_DEFUN([_LT_AC_LANG_F77], + [AC_REQUIRE([AC_PROG_F77]) + _LT_AC_SHELL_INIT([tagnames=`echo "$tagnames,F77" | sed 's/^,//'`]) + ])# _LT_AC_LANG_F77 + + + # AC_LIBTOOL_GCJ + # -------------- + # enable support for GCJ libraries + AC_DEFUN([AC_LIBTOOL_GCJ], + [AC_REQUIRE([_LT_AC_LANG_GCJ]) + ])# AC_LIBTOOL_GCJ + + + # _LT_AC_LANG_GCJ + # --------------- + AC_DEFUN([_LT_AC_LANG_GCJ], + [AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) + _LT_AC_SHELL_INIT([tagnames=`echo "$tagnames,GCJ" | sed 's/^,//'`]) + ])# _LT_AC_LANG_GCJ + + + # AC_LIBTOOL_RC + # -------------- + # enable support for Windows resource files + AC_DEFUN([AC_LIBTOOL_RC], + [AC_REQUIRE([LT_AC_PROG_RC]) + _LT_AC_SHELL_INIT([tagnames=`echo "$tagnames,RC" | sed 's/^,//'`]) + ])# AC_LIBTOOL_RC + + + # AC_LIBTOOL_LANG_C_CONFIG + # ------------------------ + # Ensure that the configuration vars for the C compiler are + # suitably defined. Those variables are subsequently used by + # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. + AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) + AC_DEFUN([_LT_AC_LANG_C_CONFIG], + [lt_save_CC="$CC" + AC_LANG_PUSH(C) + + # Source file extension for C test sources. + ac_ext=c + + # Object file extension for compiled C test sources. + objext=o + _LT_AC_TAGVAR(objext, $1)=$objext + + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;\n" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(){return(0);}\n' + + _LT_AC_SYS_COMPILER + + # + # Check for any special shared library compilation flags. + # + _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= + if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' + ;; + esac + fi + if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then + AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) + if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$]_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[[ ]]" >/dev/null; then : + else + AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) + _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no + fi + fi + + + # + # Check to make sure the static flag actually works. + # + AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), + $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) + + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) + AC_LIBTOOL_PROG_COMPILER_PIC($1) + AC_LIBTOOL_PROG_CC_C_O($1) + AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) + AC_LIBTOOL_PROG_LD_SHLIBS($1) + AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + AC_LIBTOOL_SYS_LIB_STRIP + AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) + AC_LIBTOOL_DLOPEN_SELF($1) + + # Report which librarie types wil actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case "$host_os" in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix4*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + darwin* | rhapsody*) + if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + test -z ${LD_TWOLEVEL_NAMESPACE} && _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + esac + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. Also zsh mangles + # `"' quotes if we put them in here... so don't! + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC -bundle $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -bundle $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + AC_LIBTOOL_CONFIG($1) + + AC_LANG_POP + CC="$lt_save_CC" + ])# AC_LIBTOOL_LANG_C_CONFIG + + + # AC_LIBTOOL_LANG_CXX_CONFIG + # -------------------------- + # Ensure that the configuration vars for the C compiler are + # suitably defined. Those variables are subsequently used by + # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. + AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) + AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], + [AC_LANG_PUSH(C++) + AC_REQUIRE([AC_PROG_CXX]) + AC_REQUIRE([AC_PROG_CXXCPP]) + + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds + _LT_AC_TAGVAR(no_undefined_flag, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + + # Dependencies to place before and after the object being linked: + _LT_AC_TAGVAR(predep_objects, $1)= + _LT_AC_TAGVAR(postdep_objects, $1)= + _LT_AC_TAGVAR(predeps, $1)= + _LT_AC_TAGVAR(postdeps, $1)= + _LT_AC_TAGVAR(compiler_lib_search_path, $1)= + + # Source file extension for C++ test sources. + ac_ext=cc + + # Object file extension for compiled C++ test sources. + objext=o + _LT_AC_TAGVAR(objext, $1)=$objext + + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;\n" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_AC_SYS_COMPILER + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + compiler=$CC + _LT_AC_TAGVAR(compiler, $1)=$CC + cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + + # We don't want -fno-exception wen compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + darwin* | rhapsody*) + if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + test -z ${LD_TWOLEVEL_NAMESPACE} && _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC -bundle ${wl}-bind_at_load $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags' + + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -bundle $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + fi + ;; + + dgux*) + case $cc_basename in + ec++) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | egrep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case "$host_cpu" in + ia64*|hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + irix5* | irix6*) + case $cc_basename in + CC) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc) + # Intel C++ + with_gnu_ld=yes + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + cxx) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + osf3*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sco*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) + test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_AC_TAGVAR(GCC, $1)="$GXX" + _LT_AC_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + AC_LIBTOOL_POSTDEP_PREDEP($1) + AC_LIBTOOL_PROG_COMPILER_PIC($1) + AC_LIBTOOL_PROG_CC_C_O($1) + AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) + AC_LIBTOOL_PROG_LD_SHLIBS($1) + AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + AC_LIBTOOL_SYS_LIB_STRIP + AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) + AC_LIBTOOL_DLOPEN_SELF($1) + + AC_LIBTOOL_CONFIG($1) + + AC_LANG_POP + CC=$lt_save_CC + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ldcxx=$with_gnu_ld + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld + ])# AC_LIBTOOL_LANG_CXX_CONFIG + + # AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) + # ------------------------ + # Figure out "hidden" library dependencies from verbose + # compiler output when linking a shared library. + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ + dnl we can't use the lt_simple_compile_test_code here, + dnl because it contains code intended for an executable, + dnl not a library. It's possible we should let each + dnl tag define a new lt_????_link_test_code variable, + dnl but it's only used here... + ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" + ifelse([$1], [], + [#! $SHELL + + # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. + # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) + # NOTE: Changes made to this file will be lost: look at ltmain.sh. + # + # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 + # Free Software Foundation, Inc. + # + # This file is part of GNU Libtool: + # Originally by Gordon Matzigkeit , 1996 + # + # This program is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 2 of the License, or + # (at your option) any later version. + # + # This program is distributed in the hope that it will be useful, but + # WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + # General Public License for more details. + # + # You should have received a copy of the GNU General Public License + # along with this program; if not, write to the Free Software + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + # + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + + # A sed program that does not truncate output. + SED=$lt_SED + + # Sed that helps us avoid accidentally triggering echo(1) options like -n. + Xsed="$SED -e s/^X//" + + # The HP-UX ksh and POSIX shell print the target directory to stdout + # if CDPATH is set. + if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + + # The names of the tagged configurations supported by this script. + available_tags= + + # ### BEGIN LIBTOOL CONFIG], + [# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + + # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + + # Shell to use when invoking shell scripts. + SHELL=$lt_SHELL + + # Whether or not to build shared libraries. + build_libtool_libs=$enable_shared + + # Whether or not to build static libraries. + build_old_libs=$enable_static + + # Whether or not to add -lc for building shared libraries. + build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + + # Whether or not to disallow shared libs when runtime libs are static + allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + + # Whether or not to optimize for fast installation. + fast_install=$enable_fast_install + + # The host system. + host_alias=$host_alias + host=$host + + # An echo program that does not interpret backslashes. + echo=$lt_echo + + # The archiver. + AR=$lt_AR + AR_FLAGS=$lt_AR_FLAGS + + # A C compiler. + LTCC=$lt_LTCC + + # A language-specific compiler. + CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + + # Is the compiler the GNU C compiler? + with_gcc=$_LT_AC_TAGVAR(GCC, $1) + + # An ERE matcher. + EGREP=$lt_EGREP + + # The linker used to build libraries. + LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + + # Whether we need hard or soft links. + LN_S=$lt_LN_S + + # A BSD-compatible nm program. + NM=$lt_NM + + # A symbol stripping program + STRIP=$STRIP + + # Used to examine libraries when file_magic_cmd begins "file" + MAGIC_CMD=$MAGIC_CMD + + # Used on cygwin: DLL creation program. + DLLTOOL="$DLLTOOL" + + # Used on cygwin: object dumper. + OBJDUMP="$OBJDUMP" + + # Used on cygwin: assembler. + AS="$AS" + + # The name of the directory that contains temporary libtool files. + objdir=$objdir + + # How to create reloadable object files. + reload_flag=$lt_reload_flag + reload_cmds=$lt_reload_cmds + + # How to pass a linker flag through the compiler. + wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + + # Object file suffix (normally "o"). + objext="$ac_objext" + + # Old archive suffix (normally "a"). + libext="$libext" + + # Shared library suffix (normally ".so"). + shrext='$shrext' + + # Executable file suffix (normally ""). + exeext="$exeext" + + # Additional compiler flags for building library objects. + pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) + pic_mode=$pic_mode + + # What is the maximum length of a command? + max_cmd_len=$lt_cv_sys_max_cmd_len + + # Does compiler simultaneously support -c and -o options? + compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + + # Must we lock files when doing compilation ? + need_locks=$lt_need_locks + + # Do we need the lib prefix for modules? + need_lib_prefix=$need_lib_prefix + + # Do we need a version for libraries? + need_version=$need_version + + # Whether dlopen is supported. + dlopen_support=$enable_dlopen + + # Whether dlopen of programs is supported. + dlopen_self=$enable_dlopen_self + + # Whether dlopen of statically linked programs is supported. + dlopen_self_static=$enable_dlopen_self_static + + # Compiler flag to prevent dynamic linking. + link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + + # Compiler flag to turn off builtin functions. + no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + + # Compiler flag to allow reflexive dlopens. + export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + + # Compiler flag to generate shared objects directly from archives. + whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + + # Compiler flag to generate thread-safe objects. + thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + + # Library versioning type. + version_type=$version_type + + # Format of library name prefix. + libname_spec=$lt_libname_spec + + # List of archive names. First name is the real one, the rest are links. + # The last name is the one that the linker finds with -lNAME. + library_names_spec=$lt_library_names_spec + + # The coded name of the library, if different from the real name. + soname_spec=$lt_soname_spec + + # Commands used to build and install an old-style archive. + RANLIB=$lt_RANLIB + old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) + old_postinstall_cmds=$lt_old_postinstall_cmds + old_postuninstall_cmds=$lt_old_postuninstall_cmds + + # Create an old-style archive from a shared archive. + old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + + # Create a temporary old-style archive to link instead of a shared archive. + old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + + # Commands used to build and install a shared archive. + archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) + archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) + postinstall_cmds=$lt_postinstall_cmds + postuninstall_cmds=$lt_postuninstall_cmds + + # Commands used to build a loadable module (assumed same as above if empty) + module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) + module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + + # Commands to strip libraries. + old_striplib=$lt_old_striplib + striplib=$lt_striplib + + # Dependencies to place before the objects being linked to create a + # shared library. + predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + + # Dependencies to place after the objects being linked to create a + # shared library. + postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + + # Dependencies to place before the objects being linked to create a + # shared library. + predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + + # Dependencies to place after the objects being linked to create a + # shared library. + postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + + # The library search path used internally by the compiler when linking + # a shared library. + compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + + # Method to check whether dependent libraries are shared objects. + deplibs_check_method=$lt_deplibs_check_method + + # Command to use when deplibs_check_method == file_magic. + file_magic_cmd=$lt_file_magic_cmd + + # Flag that allows shared libraries with undefined symbols to be built. + allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + + # Flag that forces no undefined symbols. + no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + + # Commands used to finish a libtool library installation in a directory. + finish_cmds=$lt_finish_cmds + + # Same as above, but a single script fragment to be evaled but not shown. + finish_eval=$lt_finish_eval + + # Take the output of nm and produce a listing of raw symbols and C names. + global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + + # Transform the output of nm in a proper C declaration + global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + + # Transform the output of nm in a C name address pair + global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + + # This is the shared library runtime path variable. + runpath_var=$runpath_var + + # This is the shared library path variable. + shlibpath_var=$shlibpath_var + + # Is shlibpath searched before the hard-coded library search path? + shlibpath_overrides_runpath=$shlibpath_overrides_runpath + + # How to hardcode a shared library path into an executable. + hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + + # Whether we should hardcode library paths into libraries. + hardcode_into_libs=$hardcode_into_libs + + # Flag to hardcode \$libdir into a binary during linking. + # This must work even if \$libdir does not exist. + hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + + # If ld is used when linking, flag to hardcode \$libdir into + # a binary during linking. This must work even if \$libdir does + # not exist. + hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) + + # Whether we need a single -rpath flag with a separated argument. + hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + + # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the + # resulting binary. + hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + + # Set to yes if using the -LDIR flag during linking hardcodes DIR into the + # resulting binary. + hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + + # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into + # the resulting binary. + hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + + # Set to yes if building a shared library automatically hardcodes DIR into the library + # and all subsequent libraries and executables linked against it. + hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) + + # Variables whose values should be saved in libtool wrapper scripts and + # restored at relink time. + variables_saved_for_relink="$variables_saved_for_relink" + + # Whether libtool must link a program against all its dependency libraries. + link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + + # Compile-time system search path for libraries + sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + + # Run-time system search path for libraries + sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + + # Fix the shell variable \$srcfile for the compiler. + fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" + + # Set to yes if exported symbols are required. + always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + + # The commands to list exported symbols. + export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + + # The commands to extract the exported symbol list from a shared archive. + extract_expsyms_cmds=$lt_extract_expsyms_cmds + + # Symbols that should not be listed in the preloaded symbols. + exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + + # Symbols that must always be exported. + include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + + ifelse([$1],[], + [# ### END LIBTOOL CONFIG], + [# ### END LIBTOOL TAG CONFIG: $tagname]) + + __EOF__ + + ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + ]) + else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + test -f Makefile && make "$ltmain" + fi + ])# AC_LIBTOOL_CONFIG + + + # AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) + # ------------------------------------------- + AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], + [AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) + fi + ])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + + # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + # --------------------------------- + AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], + [AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_PROG_NM]) + AC_REQUIRE([AC_OBJEXT]) + # Check for command to grab the raw symbol name followed by C symbol from nm. + AC_MSG_CHECKING([command to parse $NM output from $compiler object]) + AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], + [ + # These are sane defaults that work on at least a few old systems. + # [They come from Ultrix. What could be older than Ultrix?!! ;)] + + # Character class describing NM global symbol codes. + symcode='[[BCDEGRST]]' + + # Regexp to match symbols that can be accessed directly from C. + sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + + # Transform the above into a raw symbol and a C symbol. + symxfrm='\1 \2\3 \3' + + # Transform an extracted symbol line into a proper C declaration + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + + # Transform an extracted symbol line into symbol name and symbol address + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + + # Define system-specific variables. + case $host_os in + aix*) + symcode='[[BCDT]]' + ;; + cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; + hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; + irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; + osf*) + symcode='[[BCDEGQRST]]' + ;; + solaris* | sysv5*) + symcode='[[BDT]]' + ;; + sysv4) + symcode='[[DFNSTU]]' + ;; + esac + + # Handle CRLF in mingw tool chain + opt_cr= + case $build_os in + mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; + esac + + # If we're using GNU nm, then use its standard symbol codes. + case `$NM -V 2>&1` in + *GNU* | *'with BFD'*) + symcode='[[ABCDGISTW]]' ;; + esac + + # Try without a prefix undercore, then with it. + for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext + #ifdef __cplusplus + extern "C" { + #endif + + EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext + #if defined (__STDC__) && __STDC__ + # define lt_ptr_t void * + #else + # define lt_ptr_t char * + # define const + #endif + + /* The mapping between symbol names and symbols. */ + const struct { + const char *name; + lt_ptr_t address; + } + lt_preloaded_symbols[[]] = + { + EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} + }; + + #ifdef __cplusplus + } + #endif + EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi + done + ]) + if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= + fi + if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) + else + AC_MSG_RESULT(ok) + fi + ]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + + # AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) + # --------------------------------------- + AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], + [_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + + AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + icpc) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + cxx) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + sco*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + *) + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + unixware*) + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi + ], + [ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux*) + case $CC in + icc|ecc) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + ccc) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi + ]) + AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + + # + # Check to make sure the PIC flag actually works. + # + if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) + fi + case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; + esac + ]) + + + # AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) + # ------------------------------------ + # See if the linker supports building shared libraries. + AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], + [AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + ],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + + *** Warning: the GNU linker, at least up to release 2.9.1, is reported + *** to be unable to reliably create shared libraries on AIX. + *** Therefore, libtool is disabling shared libraries support. If you + *** really care for shared libraries, you may want to modify your PATH + *** so that a non-GNU linker is found, and then restart. + + EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + + *** Warning: The releases 2.8.* of the GNU linker cannot reliably + *** create shared libraries on Solaris systems. Therefore, libtool + *** is disabling shared libraries support. We urge you to upgrade GNU + *** binutils to release 2.9.1 or newer. Another option is to modify + *** your PATH or compiler configuration so that the native linker is + *** used, and then restart. + + EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi4*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + test -z ${LD_TWOLEVEL_NAMESPACE} && _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + esac + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. Also zsh mangles + # `"' quotes if we put them in here... so don't! + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC -bundle ${wl}-bind_at_load $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -bundle $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + fi + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4.2uw2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv5*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ]) + AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) + test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + variables_saved_for_relink="PATH $shlibpath_var $runpath_var" + if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + fi + + # + # Do we need to explicitly link libc? + # + case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in + x|xyes) + # Assume -lc should be added + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; + esac + ])# AC_LIBTOOL_PROG_LD_SHLIBS + + + # _LT_AC_FILE_LTDLL_C + # ------------------- + # Be careful that the start marker always follows a newline. + AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ + # /* ltdll.c starts here */ + # #define WIN32_LEAN_AND_MEAN + # #include + # #undef WIN32_LEAN_AND_MEAN + # #include + # + # #ifndef __CYGWIN__ + # # ifdef __CYGWIN32__ + # # define __CYGWIN__ __CYGWIN32__ + # # endif + # #endif + # + # #ifdef __cplusplus + # extern "C" { + # #endif + # BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); + # #ifdef __cplusplus + # } + # #endif + # + # #ifdef __CYGWIN__ + # #include + # DECLARE_CYGWIN_DLL( DllMain ); + # #endif + # HINSTANCE __hDllInstance_base; + # + # BOOL APIENTRY + # DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) + # { + # __hDllInstance_base = hInst; + # return TRUE; + # } + # /* ltdll.c ends here */ + ])# _LT_AC_FILE_LTDLL_C + + + # _LT_AC_TAGVAR(VARNAME, [TAGNAME]) + # --------------------------------- + AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) + + + # old names + AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) + AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) + AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) + AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) + AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + + # This is just to silence aclocal about the macro not being used + ifelse([AC_DISABLE_FAST_INSTALL]) + + AC_DEFUN([LT_AC_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) + ]) + + AC_DEFUN([LT_AC_PROG_RC], + [AC_CHECK_TOOL(RC, windres, no) + ]) + + ############################################################ + # NOTE: This macro has been submitted for inclusion into # + # GNU Autoconf as AC_PROG_SED. When it is available in # + # a released version of Autoconf we should remove this # + # macro and use it instead. # + ############################################################ + # LT_AC_PROG_SED + # -------------- + # Check for a fully-functional sed program, that truncates + # as few characters as possible. Prefer GNU sed if found. + AC_DEFUN([LT_AC_PROG_SED], + [AC_MSG_CHECKING([for a sed that does not truncate output]) + AC_CACHE_VAL(lt_cv_path_SED, + [# Loop through the user's path and test for sed and gsed. + # Then use that list of sed's as ones to test for truncation. + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done + done + lt_ac_max=0 + lt_ac_count=0 + # Add /usr/xpg4/bin/sed as it is typically found on Solaris + # along with /bin/sed that truncates output. + for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && break + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done + done + SED=$lt_cv_path_SED + ]) + AC_MSG_RESULT([$SED]) + ]) + ############################################################################# + # Additional Macros + ############################################################################# + + # + # Check for C++ namespace support. This is from + # http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_namespaces.html + # + AC_DEFUN([AC_CXX_NAMESPACES], + [AC_CACHE_CHECK(whether the compiler implements namespaces, + ac_cv_cxx_namespaces, + [AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([namespace Outer { namespace Inner { int i = 0; }}], + [using namespace Outer::Inner; return i;], + ac_cv_cxx_namespaces=yes, ac_cv_cxx_namespaces=no) + AC_LANG_RESTORE + ]) + if test "$ac_cv_cxx_namespaces" = yes; then + AC_DEFINE(HAVE_NAMESPACES,,[define if the compiler implements namespaces]) + fi + ]) + + # + # Check for hash_map extension. This is from + # http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_have_ext_hash_map.html + # + AC_DEFUN([AC_CXX_HAVE_EXT_HASH_MAP], + [AC_CACHE_CHECK(whether the compiler has ext/hash_map, + ac_cv_cxx_have_ext_hash_map, + [AC_REQUIRE([AC_CXX_NAMESPACES]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([#include + #ifdef HAVE_NAMESPACES + using namespace std; + #endif],[hash_map t; return 0;], + ac_cv_cxx_have_ext_hash_map=std, ac_cv_cxx_have_ext_hash_map=no) + AC_TRY_COMPILE([#include + #ifdef HAVE_NAMESPACES + using namespace __gnu_cxx; + #endif],[hash_map t; return 0;], + ac_cv_cxx_have_ext_hash_map=gnu, ac_cv_cxx_have_ext_hash_map=no) + AC_LANG_RESTORE + ]) + if test "$ac_cv_cxx_have_ext_hash_map" = std; then + AC_DEFINE(HAVE_STD_EXT_HASH_MAP,,[define if the compiler has ext/hash_map]) + fi + if test "$ac_cv_cxx_have_ext_hash_map" = gnu; then + AC_DEFINE(HAVE_GNU_EXT_HASH_MAP,,[define if the compiler has ext/hash_map]) + fi + ]) + + # + # Check for hash_set extension. This is modified from + # http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_have_ext_hash_set.html + # + AC_DEFUN([AC_CXX_HAVE_EXT_HASH_SET], + [AC_CACHE_CHECK(whether the compiler has ext/hash_set, + ac_cv_cxx_have_ext_hash_set, + [AC_REQUIRE([AC_CXX_NAMESPACES]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([#include + #ifdef HAVE_NAMESPACES + using namespace std; + #endif],[hash_set t; return 0;], + ac_cv_cxx_have_ext_hash_set=std, ac_cv_cxx_have_ext_hash_set=no) + AC_TRY_COMPILE([#include + #ifdef HAVE_NAMESPACES + using namespace __gnu_cxx; + #endif],[hash_set t; return 0;], + ac_cv_cxx_have_ext_hash_set=gnu, ac_cv_cxx_have_ext_hash_set=no) + AC_LANG_RESTORE + ]) + if test "$ac_cv_cxx_have_ext_hash_set" = std; then + AC_DEFINE(HAVE_STD_EXT_HASH_SET,,[define if the compiler has ext/hash_set in std]) + fi + if test "$ac_cv_cxx_have_ext_hash_set" = gnu; then + AC_DEFINE(HAVE_GNU_EXT_HASH_SET,,[define if the compiler has ext/hash_set in __gnu_cc]) + fi + ]) + + # + # Check for standard iterator extension. This is modified from + # http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_have_ext_hash_set.html + # + AC_DEFUN([AC_CXX_HAVE_STD_ITERATOR], + [AC_CACHE_CHECK(whether the compiler has the standard iterator, + ac_cv_cxx_have_std_iterator, + [AC_REQUIRE([AC_CXX_NAMESPACES]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([#include + #ifdef HAVE_NAMESPACES + using namespace std; + #endif],[iterator t; return 0;], + ac_cv_cxx_have_std_iterator=yes, ac_cv_cxx_have_std_iterator=no) + AC_LANG_RESTORE + ]) + if test "$ac_cv_cxx_have_std_iterator" = yes; then + AC_DEFINE(HAVE_STD_ITERATOR,,[define if the compiler has STL iterators]) + fi + ]) + + # + # Check for bidirectional iterator extension. This is modified from + # http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_have_ext_hash_set.html + # + AC_DEFUN([AC_CXX_HAVE_BI_ITERATOR], + [AC_CACHE_CHECK(whether the compiler has the bidirectional iterator, + ac_cv_cxx_have_bi_iterator, + [AC_REQUIRE([AC_CXX_NAMESPACES]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([#include + #ifdef HAVE_NAMESPACES + using namespace std; + #endif],[bidirectional_iterator t; return 0;], + ac_cv_cxx_have_bi_iterator=yes, ac_cv_cxx_have_bi_iterator=no) + AC_LANG_RESTORE + ]) + if test "$ac_cv_cxx_have_bi_iterator" = yes; then + AC_DEFINE(HAVE_BI_ITERATOR,,[define if the compiler has bidirectional iterator]) + fi + ]) + + # + # Check for forward iterator extension. This is modified from + # http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_have_ext_hash_set.html + # + AC_DEFUN([AC_CXX_HAVE_FWD_ITERATOR], + [AC_CACHE_CHECK(whether the compiler has forward iterators, + ac_cv_cxx_have_fwd_iterator, + [AC_REQUIRE([AC_CXX_NAMESPACES]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([#include + #ifdef HAVE_NAMESPACES + using namespace std; + #endif],[forward_iterator t; return 0;], + ac_cv_cxx_have_fwd_iterator=yes, ac_cv_cxx_have_fwd_iterator=no) + AC_LANG_RESTORE + ]) + if test "$ac_cv_cxx_have_fwd_iterator" = yes; then + AC_DEFINE(HAVE_FWD_ITERATOR,,[define if the compiler has STL iterators]) + fi + ]) + + # + # Check for slist extension. This is from + # http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_have_ext_slist.html + # + AC_DEFUN([AC_CXX_HAVE_EXT_SLIST], + [AC_CACHE_CHECK(whether the compiler has ext/slist, + ac_cv_cxx_have_ext_slist, + [AC_REQUIRE([AC_CXX_NAMESPACES]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([#include + #ifdef HAVE_NAMESPACES + using namespace std; + #endif],[slist s; return 0;], + ac_cv_cxx_have_ext_slist=std, ac_cv_cxx_have_ext_slist=no) + AC_TRY_COMPILE([#include + #ifdef HAVE_NAMESPACES + using namespace __gnu_cxx; + #endif],[slist s; return 0;], + ac_cv_cxx_have_ext_slist=gnu, ac_cv_cxx_have_ext_slist=no) + + AC_LANG_RESTORE + ]) + if test "$ac_cv_cxx_have_ext_slist" = std; then + AC_DEFINE(HAVE_EXT_SLIST,std,[define if the compiler has ext/slist]) + fi + if test "$ac_cv_cxx_have_ext_slist" = gnu; then + AC_DEFINE(HAVE_EXT_SLIST,gnu,[define if the compiler has ext/slist]) + fi + ]) + + # + # Check for FLEX. This is modified from + # http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_namespaces.html + # + AC_DEFUN([AC_PROG_FLEX], + [AC_CACHE_CHECK(, + ac_cv_has_flex, + [AC_PROG_LEX() + ]) + if test "$LEX" != "flex"; then + AC_MSG_ERROR([flex not found but required]) + fi + ]) + + # + # Check for Bison. This is modified from + # http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_namespaces.html + # + AC_DEFUN([AC_PROG_BISON], + [AC_CACHE_CHECK(, + ac_cv_has_bison, + [AC_PROG_YACC() + ]) + if test "$YACC" != "bison -y"; then + AC_MSG_ERROR([bison not found but required]) + else + AC_SUBST(YACC,[bison],[location of bison]) + fi + ]) + + # + # Check for GNU Make. This is from + # http://www.gnu.org/software/ac-archive/htmldoc/check_gnu_make.html + # + AC_DEFUN( + [CHECK_GNU_MAKE], [ AC_CACHE_CHECK( for GNU make,_cv_gnu_make_command, + _cv_gnu_make_command='' ; + dnl Search all the common names for GNU make + for a in "$MAKE" make gmake gnumake ; do + if test -z "$a" ; then continue ; fi ; + if ( sh -c "$a --version" 2> /dev/null | grep GNU 2>&1 > /dev/null ) ; then + _cv_gnu_make_command=$a ; + break; + fi + done ; + ) ; + dnl If there was a GNU version, then set @ifGNUmake@ to the empty string, '#' otherwise + if test "x$_cv_gnu_make_command" != "x" ; then + ifGNUmake='' ; + else + ifGNUmake='#' ; + AC_MSG_RESULT("Not found"); + fi + AC_SUBST(ifGNUmake) + ] ) + + # + # Check for the ability to mmap a file. This is modified from + # http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_have_ext_slist.html + # + AC_DEFUN([AC_FUNC_MMAP_FILE], + [AC_CACHE_CHECK(for mmap of files, + ac_cv_func_mmap_file, + [AC_LANG_SAVE + AC_LANG_C + AC_TRY_RUN([ + #ifdef HAVE_SYS_MMAN_H + #include + #endif + + #ifdef HAVE_SYS_TYPES_H + #include + #endif + + #ifdef HAVE_FCNTL_H + #include + #endif + + int fd; + int main () { + fd = creat ("foo",0777); fd = (int) mmap (0, 1, PROT_READ, MAP_SHARED, fd, 0); unlink ("foo"); return (fd != MAP_FAILED);}], + ac_cv_func_mmap_file=yes, ac_cv_func_mmap_file=no) + AC_LANG_RESTORE + ]) + if test "$ac_cv_func_mmap_file" = yes; then + AC_DEFINE(HAVE_MMAP_FILE) + AC_SUBST(MMAP_FILE,[yes]) + fi + ]) + + # + # Check for anonymous mmap macros. This is modified from + # http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_have_ext_slist.html + # + AC_DEFUN([AC_HEADER_MMAP_ANONYMOUS], + [AC_CACHE_CHECK(for MAP_ANONYMOUS vs. MAP_ANON, + ac_cv_header_mmap_anon, + [AC_LANG_SAVE + AC_LANG_C + AC_TRY_COMPILE([#include + #include + #include ], + [mmap (0, 1, PROT_READ, MAP_ANONYMOUS, -1, 0); return (0);], + ac_cv_header_mmap_anon=yes, ac_cv_header_mmap_anon=no) + AC_LANG_RESTORE + ]) + if test "$ac_cv_header_mmap_anon" = yes; then + AC_DEFINE(HAVE_MMAP_ANONYMOUS) + fi + ]) + + # + # Configure a Makefile without clobbering it if it exists and is not out of + # date. This is modified from: + # http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_have_ext_slist.html + # + AC_DEFUN([AC_CONFIG_MAKEFILE], + [AC_CONFIG_COMMANDS($1,${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/$1 $1,${srcdir}/autoconf/mkinstalldirs `dirname $1`) + ]) + + Index: llvm/projects/ModuleMaker/autoconf/config.guess diff -c /dev/null llvm/projects/ModuleMaker/autoconf/config.guess:1.1 *** /dev/null Tue Nov 25 14:00:09 2003 --- llvm/projects/ModuleMaker/autoconf/config.guess Tue Nov 25 13:59:59 2003 *************** *** 0 **** --- 1,1388 ---- + #! /bin/sh + # Attempt to guess a canonical system name. + # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, + # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + + timestamp='2003-02-22' + + # This file is free software; you can redistribute it and/or modify it + # under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 2 of the License, or + # (at your option) any later version. + # + # This program is distributed in the hope that it will be useful, but + # WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + # General Public License for more details. + # + # You should have received a copy of the GNU General Public License + # along with this program; if not, write to the Free Software + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + # + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + + # Originally written by Per Bothner . + # Please send patches to . Submit a context + # diff and a properly formatted ChangeLog entry. + # + # This script attempts to guess a canonical system name similar to + # config.sub. If it succeeds, it prints the system name on stdout, and + # exits with 0. Otherwise, it exits with 1. + # + # The plan is that this can be called by configure scripts if you + # don't specify an explicit build system type. + + me=`echo "$0" | sed -e 's,.*/,,'` + + usage="\ + Usage: $0 [OPTION] + + Output the configuration name of the system \`$me' is run on. + + Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + + Report bugs and patches to ." + + version="\ + GNU config.guess ($timestamp) + + Originally written by Per Bothner. + Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 + Free Software Foundation, Inc. + + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + + help=" + Try \`$me --help' for more information." + + # Parse command line + while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac + done + + if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 + fi + + trap 'exit 1' 1 2 15 + + # CC_FOR_BUILD -- compiler used by this script. Note that the use of a + # compiler to aid in system detection is discouraged as it requires + # temporary files to be created and, as you can see below, it is a + # headache to deal with in a portable fashion. + + # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still + # use `HOST_CC' if defined, but it is deprecated. + + # Portable tmp directory creation inspired by the Autoconf team. + + set_cc_for_build=' + trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; + trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; + : ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; + dummy=$tmp/dummy ; + tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; + case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac ;' + + # This is needed to find uname on a Pyramid OSx when run in the BSD universe. + # (ghazi at noc.rutgers.edu 1994-08-24) + if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH + fi + + UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown + UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown + UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown + UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + + # Note: order is significant - the case branches are not exclusive. + + case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mipseb-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee at wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + DRS?6000:UNIX_SV:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7 && exit 0 ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __cplusplus + #include /* for printf() prototype */ + int main (int argc, char *argv[]) { + #else + int main (argc, argv) int argc; char *argv[]; { + #endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } + EOF + $CC_FOR_BUILD -o $dummy $dummy.c \ + && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && exit 0 + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } + EOF + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } + EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + # avoid double evaluation of $set_cc_for_build + test -n "$CC_FOR_BUILD" || eval $set_cc_for_build + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } + EOF + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + *:UNICOS/mp:*:*) + echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + # Determine whether the default compiler uses glibc. + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #if __GLIBC__ >= 2 + LIBC=gnu + #else + LIBC= + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + x86:Interix*:3*) + echo i586-pc-interix3 + exit 0 ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit 0 ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit 0 ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit 0 ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #ifdef __INTEL_COMPILER + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit 0 ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit 0 ;; + i*86:*:5:[78]*) + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit 0 ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit 0 ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf at swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + *:VOS:*:*) + # From Paul.Green at stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + case `uname -p` in + *86) UNAME_PROCESSOR=i686 ;; + powerpc) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; + esac + + #echo '(No uname command or uname output not recognized.)' 1>&2 + #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + + eval $set_cc_for_build + cat >$dummy.c < + # include + #endif + main () + { + #if defined (sony) + #if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); + #else + #include + printf ("m68k-sony-newsos%s\n", + #ifdef NEWSOS4 + "4" + #else + "" + #endif + ); exit (0); + #endif + #endif + + #if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); + #endif + + #if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); + #endif + + #if defined (NeXT) + #if !defined (__ARCHITECTURE__) + #define __ARCHITECTURE__ "m68k" + #endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); + #endif + + #if defined (MULTIMAX) || defined (n16) + #if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); + #else + #if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); + #else + printf ("ns32k-encore-bsd\n"); exit (0); + #endif + #endif + #endif + + #if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); + #endif + + #if defined (sequent) + #if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); + #endif + #if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); + #endif + #endif + + #if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + + #endif + + #if defined (vax) + # if !defined (ultrix) + # include + # if defined (BSD) + # if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); + # else + # if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); + # else + printf ("vax-dec-bsd\n"); exit (0); + # endif + # endif + # else + printf ("vax-dec-bsd\n"); exit (0); + # endif + # else + printf ("vax-dec-ultrix\n"); exit (0); + # endif + #endif + + #if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); + #endif + + exit (1); + } + EOF + + $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 + + # Apollos put the system type in the environment. + + test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + + # Convex versions that predate uname can use getsysinfo(1) + + if [ -x /usr/convex/getsysinfo ] + then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac + fi + + cat >&2 < in order to provide the needed + information to handle your system. + + config.guess timestamp = $timestamp + + uname -m = `(uname -m) 2>/dev/null || echo unknown` + uname -r = `(uname -r) 2>/dev/null || echo unknown` + uname -s = `(uname -s) 2>/dev/null || echo unknown` + uname -v = `(uname -v) 2>/dev/null || echo unknown` + + /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` + /bin/uname -X = `(/bin/uname -X) 2>/dev/null` + + hostinfo = `(hostinfo) 2>/dev/null` + /bin/universe = `(/bin/universe) 2>/dev/null` + /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` + /bin/arch = `(/bin/arch) 2>/dev/null` + /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` + /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + + UNAME_MACHINE = ${UNAME_MACHINE} + UNAME_RELEASE = ${UNAME_RELEASE} + UNAME_SYSTEM = ${UNAME_SYSTEM} + UNAME_VERSION = ${UNAME_VERSION} + EOF + + exit 1 + + # Local variables: + # eval: (add-hook 'write-file-hooks 'time-stamp) + # time-stamp-start: "timestamp='" + # time-stamp-format: "%:y-%02m-%02d" + # time-stamp-end: "'" + # End: Index: llvm/projects/ModuleMaker/autoconf/config.sub diff -c /dev/null llvm/projects/ModuleMaker/autoconf/config.sub:1.1 *** /dev/null Tue Nov 25 14:00:09 2003 --- llvm/projects/ModuleMaker/autoconf/config.sub Tue Nov 25 13:59:59 2003 *************** *** 0 **** --- 1,1489 ---- + #! /bin/sh + # Configuration validation subroutine script. + # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, + # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + + timestamp='2003-02-22' + + # This file is (in principle) common to ALL GNU software. + # The presence of a machine in this file suggests that SOME GNU software + # can handle that machine. It does not imply ALL GNU software can. + # + # This file is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 2 of the License, or + # (at your option) any later version. + # + # This program is distributed in the hope that it will be useful, + # but WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + # GNU General Public License for more details. + # + # You should have received a copy of the GNU General Public License + # along with this program; if not, write to the Free Software + # Foundation, Inc., 59 Temple Place - Suite 330, + # Boston, MA 02111-1307, USA. + + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + + # Please send patches to . Submit a context + # diff and a properly formatted ChangeLog entry. + # + # Configuration subroutine to validate and canonicalize a configuration type. + # Supply the specified configuration type as an argument. + # If it is invalid, we print an error message on stderr and exit with code 1. + # Otherwise, we print the canonical config type on stdout and succeed. + + # This file is supposed to be the same for all GNU packages + # and recognize all the CPU types, system types and aliases + # that are meaningful with *any* GNU software. + # Each package is responsible for reporting which valid configurations + # it does not support. The user should be able to distinguish + # a failure to support a valid configuration from a meaningless + # configuration. + + # The goal of this file is to map all the various variations of a given + # machine specification into a single specification in the form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM + # or in some cases, the newer four-part form: + # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM + # It is wrong to echo any other type of specification. + + me=`echo "$0" | sed -e 's,.*/,,'` + + usage="\ + Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + + Canonicalize a configuration name. + + Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + + Report bugs and patches to ." + + version="\ + GNU config.sub ($timestamp) + + Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 + Free Software Foundation, Inc. + + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + + help=" + Try \`$me --help' for more information." + + # Parse command line + while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit 0;; + + * ) + break ;; + esac + done + + case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; + esac + + # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in + nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; + esac + + ### Let's recognize common machines as not being operating systems so + ### that things like config.sub decstation-3100 work. We also + ### recognize some manufacturers as not being operating systems, so we + ### can provide default operating systems below. + case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + esac + + # Decode aliases for certain CPU-COMPANY combinations. + case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k \ + | m32r | m68000 | m68k | m88k | mcore \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | msp430 \ + | ns16k | ns32k \ + | openrisc | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* \ + | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* \ + | m32r-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | msp430-* \ + | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ + | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ + | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + # I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nv1) + basic_machine=nv1-cray + os=-unicosmp + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + or32 | or32-*) + basic_machine=or32-unknown + os=-coff + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i686-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic4x | c4x*) + basic_machine=tic4x-unknown + os=-coff + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparc | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + esac + + # Here we canonicalize certain aliases for manufacturers. + case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; + esac + + # Decode manufacturer-specific aliases for certain operating systems. + + if [ x"$os" != x"" ] + then + case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; + esac + else + + # Here we handle the default operating systems that come with various machines. + # The value should be what the vendor currently ships out the door with their + # machine or put another way, the most popular os provided with the machine. + + # Note that if you're going to try to match "-MANUFACTURER" here (say, + # "-sun"), then you have to tell the case statement up towards the top + # that MANUFACTURER isn't an operating system. Otherwise, code above + # will signal an error saying that MANUFACTURER isn't an operating + # system, and we'll never get to this point. + + case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; + esac + fi + + # Here we handle the case where we know the os, and the CPU type, but not the + # manufacturer. We pick the logical manufacturer. + vendor=unknown + case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; + esac + + echo $basic_machine$os + exit 0 + + # Local variables: + # eval: (add-hook 'write-file-hooks 'time-stamp) + # time-stamp-start: "timestamp='" + # time-stamp-format: "%:y-%02m-%02d" + # time-stamp-end: "'" + # End: Index: llvm/projects/ModuleMaker/autoconf/configure.ac diff -c /dev/null llvm/projects/ModuleMaker/autoconf/configure.ac:1.1 *** /dev/null Tue Nov 25 14:00:09 2003 --- llvm/projects/ModuleMaker/autoconf/configure.ac Tue Nov 25 13:59:59 2003 *************** *** 0 **** --- 1,60 ---- + dnl ************************************************************************** + dnl * Initialize + dnl ************************************************************************** + AC_INIT([[[ModuleMaker]]],[[[x.xx]]],[bugs at yourdomain]) + + dnl Place all of the extra autoconf files into the config subdirectory + AC_CONFIG_AUX_DIR([autoconf]) + + dnl Configure a header file + + dnl Configure Makefiles + dnl List every Makefile that exists within your source tree + + AC_CONFIG_MAKEFILE(Makefile) + + dnl ************************************************************************** + dnl * Determine which system we are building on + dnl ************************************************************************** + + dnl ************************************************************************** + dnl * Check for programs. + dnl ************************************************************************** + + dnl Verify that the source directory is valid + AC_CONFIG_SRCDIR(["Makefile.common.in"]) + + dnl ************************************************************************** + dnl * Check for libraries. + dnl ************************************************************************** + + dnl ************************************************************************** + dnl * Checks for header files. + dnl ************************************************************************** + + dnl ************************************************************************** + dnl * Checks for typedefs, structures, and compiler characteristics. + dnl ************************************************************************** + + dnl ************************************************************************** + dnl * Checks for library functions. + dnl ************************************************************************** + + dnl ************************************************************************** + dnl * Enable various compile-time options + dnl ************************************************************************** + + dnl ************************************************************************** + dnl * Set the location of various third-party software packages + dnl ************************************************************************** + + dnl Location of LLVM source code + AC_ARG_WITH(llvmsrc,AC_HELP_STRING([--with-llvmsrc],[Location of LLVM Source Code]),AC_SUBST(LLVM_SRC,[$withval]),AC_SUBST(LLVM_SRC,[`cd ${srcdir}/../..; pwd`])) + + dnl Location of LLVM object code + AC_ARG_WITH(llvmobj,AC_HELP_STRING([--with-llvmobj],[Location of LLVM Object Code]),AC_SUBST(LLVM_OBJ,[$withval]),AC_SUBST(LLVM_OBJ,[`cd ../..; pwd`])) + + dnl ************************************************************************** + dnl * Create the output files + dnl ************************************************************************** + AC_OUTPUT(Makefile.common) Index: llvm/projects/ModuleMaker/autoconf/install-sh diff -c /dev/null llvm/projects/ModuleMaker/autoconf/install-sh:1.1 *** /dev/null Tue Nov 25 14:00:09 2003 --- llvm/projects/ModuleMaker/autoconf/install-sh Tue Nov 25 13:59:59 2003 *************** *** 0 **** --- 1,251 ---- + #!/bin/sh + # + # install - install a program, script, or datafile + # This comes from X11R5 (mit/util/scripts/install.sh). + # + # Copyright 1991 by the Massachusetts Institute of Technology + # + # Permission to use, copy, modify, distribute, and sell this software and its + # documentation for any purpose is hereby granted without fee, provided that + # the above copyright notice appear in all copies and that both that + # copyright notice and this permission notice appear in supporting + # documentation, and that the name of M.I.T. not be used in advertising or + # publicity pertaining to distribution of the software without specific, + # written prior permission. M.I.T. makes no representations about the + # suitability of this software for any purpose. It is provided "as is" + # without express or implied warranty. + # + # Calling this script install-sh is preferred over install.sh, to prevent + # `make' implicit rules from creating a file called install from it + # when there is no Makefile. + # + # This script is compatible with the BSD install script, but was written + # from scratch. It can only install one file at a time, a restriction + # shared with many OS's install programs. + + + # set DOITPROG to echo to test this script + + # Don't use :- since 4.3BSD and earlier shells don't like it. + doit="${DOITPROG-}" + + + # put in absolute paths if you don't have them in your path; or use env. vars. + + mvprog="${MVPROG-mv}" + cpprog="${CPPROG-cp}" + chmodprog="${CHMODPROG-chmod}" + chownprog="${CHOWNPROG-chown}" + chgrpprog="${CHGRPPROG-chgrp}" + stripprog="${STRIPPROG-strip}" + rmprog="${RMPROG-rm}" + mkdirprog="${MKDIRPROG-mkdir}" + + transformbasename="" + transform_arg="" + instcmd="$mvprog" + chmodcmd="$chmodprog 0755" + chowncmd="" + chgrpcmd="" + stripcmd="" + rmcmd="$rmprog -f" + mvcmd="$mvprog" + src="" + dst="" + dir_arg="" + + while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac + done + + if [ x"$src" = x ] + then + echo "install: no input file specified" + exit 1 + else + : + fi + + if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + chmodcmd="" + else + instcmd=$mkdirprog + fi + else + + # Waiting for this to be detected by the "$instcmd $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + : + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + : + fi + + # If destination is a directory, append the input filename; if your system + # does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + : + fi + fi + + ## this sed command emulates the dirname command + dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + + # Make sure that the destination directory exists. + # this part is taken from Noah Friedman's mkinstalldirs script + + # Skip lots of stat calls in the usual case. + if [ ! -d "$dstdir" ]; then + defaultIFS=' + ' + IFS="${IFS-${defaultIFS}}" + + oIFS="${IFS}" + # Some sh's can't handle IFS=/ for some reason. + IFS='%' + set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` + IFS="${oIFS}" + + pathcomp='' + + while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + : + fi + + pathcomp="${pathcomp}/" + done + fi + + if [ x"$dir_arg" != x ] + then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi + else + + # If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + + # don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + : + fi + + # Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + + # Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + + # and set any options; do chmod last to preserve setuid bits + + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi && + + # Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + + fi && + + + exit 0 Index: llvm/projects/ModuleMaker/autoconf/ltmain.sh diff -c /dev/null llvm/projects/ModuleMaker/autoconf/ltmain.sh:1.1 *** /dev/null Tue Nov 25 14:00:09 2003 --- llvm/projects/ModuleMaker/autoconf/ltmain.sh Tue Nov 25 13:59:59 2003 *************** *** 0 **** --- 1,6290 ---- + # ltmain.sh - Provide generalized library-building support services. + # NOTE: Changing this file will not affect anything until you rerun configure. + # + # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003 + # Free Software Foundation, Inc. + # Originally by Gordon Matzigkeit , 1996 + # + # This program is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 2 of the License, or + # (at your option) any later version. + # + # This program is distributed in the hope that it will be useful, but + # WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + # General Public License for more details. + # + # You should have received a copy of the GNU General Public License + # along with this program; if not, write to the Free Software + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + # + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + + # Check that we have a working $echo. + if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : + elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : + else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$0" --no-reexec ${1+"$@"} + fi + + if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 + fi + + # Global variables. + mode=$default_mode + nonopt= + prev= + prevopt= + run= + show="$echo" + show_help= + execute_dlfiles= + lo2o="s/\\.lo\$/.${objext}/" + o2lo="s/\\.${objext}\$/.lo/" + + ##################################### + # Shell function definitions: + # This seems to be the best place for them + + # Need a lot of goo to handle *both* DLLs and import libs + # Has to be a shell function in order to 'eat' the argument + # that is supplied when $file_magic_command is called. + win32_libid () { + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + grep -E 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ + sed -n -e '1,100{/ I /{x;/import/!{s/^/import/;h;p;};x;};}'` + if test "X$win32_nmres" = "Ximport" ; then + win32_libid_type="x86 archive import" + else + win32_libid_type="x86 archive static" + fi + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $echo $win32_libid_type + } + + # End of Shell function definitions + ##################################### + + # Parse our command line options once, thoroughly. + while test "$#" -gt 0 + do + arg="$1" + shift + + case $arg in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + execute_dlfiles) + execute_dlfiles="$execute_dlfiles $arg" + ;; + tag) + tagname="$arg" + + # Check whether tagname contains only valid characters + case $tagname in + *[!-_A-Za-z0-9,/]*) + $echo "$progname: invalid tag name: $tagname" 1>&2 + exit 1 + ;; + esac + + case $tagname in + CC) + # Don't test for the "default" C tag, as we know, it's there, but + # not specially marked. + ;; + *) + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$0" > /dev/null; then + taglist="$taglist $tagname" + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $0`" + else + $echo "$progname: ignoring unknown tag $tagname" 1>&2 + fi + ;; + esac + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case $arg in + --help) + show_help=yes + ;; + + --version) + $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" + $echo + $echo "Copyright (C) 2003 Free Software Foundation, Inc." + $echo "This is free software; see the source for copying conditions. There is NO" + $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + exit 0 + ;; + + --config) + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $0 + # Now print the configurations for the tags. + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$0" + done + exit 0 + ;; + + --debug) + $echo "$progname: enabling shell trace mode" + set -x + ;; + + --dry-run | -n) + run=: + ;; + + --features) + $echo "host: $host" + if test "$build_libtool_libs" = yes; then + $echo "enable shared libraries" + else + $echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + $echo "enable static libraries" + else + $echo "disable static libraries" + fi + exit 0 + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --preserve-dup-deps) duplicate_deps="yes" ;; + + --quiet | --silent) + show=: + ;; + + --tag) prevopt="--tag" prev=tag ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift + prev=tag + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *) + nonopt="$arg" + break + ;; + esac + done + + if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # If this variable is set in any of the actions, the command in it + # will be execed at the end. This prevents here-documents from being + # left over by shells. + exec_cmd= + + if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 + $echo "*** Future versions of Libtool will require -mode=MODE be specified." 1>&2 + case $nonopt in + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + mode=link + for arg + do + case $arg in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case $mode in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_output= + arg_mode=normal + libobj= + + for arg + do + case "$arg_mode" in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + if test -n "$libobj" ; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit 1 + fi + arg_mode=target + continue + ;; + + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + base_compile="$base_compile $lastarg" + continue + ;; + + * ) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + base_compile="$base_compile $lastarg" + done # for arg + + case $arg_mode in + arg) + $echo "$modename: you must specify an argument for -Xcompile" + exit 1 + ;; + target) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit 1 + ;; + *) + # Get the name of the library object. + [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSifmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.ii) xform=ii ;; + *.class) xform=class ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.f90) xform=f90 ;; + *.for) xform=for ;; + *.java) xform=java ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case $libobj in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit 1 + ;; + esac + + # Infer tagged configuration to use if any are available and + # if one wasn't chosen via the "--tag" command line option. + # Only attempt this if the compiler in the base compile + # command doesn't match the default compiler. + if test -n "$available_tags" && test -z "$tagname"; then + case $base_compile in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$0" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $0`" + case "$base_compile " in + "$CC "* | " $CC "* | "`$echo $CC` "* | " `$echo $CC` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit 1 + # else + # $echo "$modename: using $tagname tagged configuration" + fi + ;; + esac + fi + + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir= + else + xdir=$xdir/ + fi + lobj=${xdir}$objdir/$objname + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit 1" 1 2 15 + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit 1" 1 2 15 + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $run ln "$0" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $echo "\ + *** ERROR, $lockfile exists and contains: + `cat $lockfile 2>/dev/null` + + This indicates that another process is trying to use the same + temporary object file, and libtool could not work around it because + your compiler does not support \`-c' and \`-o' together. If you + repeat this compilation, it may succeed, by chance, but you had better + avoid parallel builds (make -j) in this platform, or get a better + compiler." + + $run $rm $removelist + exit 1 + fi + $echo $srcfile > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + + $run $rm "$libobj" "${libobj}T" + + # Create a libtool object file (analogous to a ".la" file), + # but don't create it if we're doing a dry run. + test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ + *** ERROR, $lockfile contains: + `cat $lockfile 2>/dev/null` + + but it should contain: + $srcfile + + This indicates that another process is trying to use the same + temporary object file, and libtool could not work around it because + your compiler does not support \`-c' and \`-o' together. If you + repeat this compilation, it may succeed, by chance, but you had better + avoid parallel builds (make -j) in this platform, or get a better + compiler." + + $run $rm $removelist + exit 1 + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + $show "$mv $output_obj $lobj" + if $run $mv $output_obj $lobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the PIC object to the libtool object file. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ + *** ERROR, $lockfile contains: + `cat $lockfile 2>/dev/null` + + but it should contain: + $srcfile + + This indicates that another process is trying to use the same + temporary object file, and libtool could not work around it because + your compiler does not support \`-c' and \`-o' together. If you + repeat this compilation, it may succeed, by chance, but you had better + avoid parallel builds (make -j) in this platform, or get a better + compiler." + + $run $rm $removelist + exit 1 + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + else + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + fi + build_libtool_libs=no + build_old_libs=yes + prefer_static_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + base_compile="$base_compile $arg" + shift + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test + ;; + *) qarg=$arg ;; + esac + libtool_args="$libtool_args $qarg" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit 1 + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat $save_arg` + do + # moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit 1 + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit 1 + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + done + else + $echo "$modename: link input file \`$save_arg' does not exist" + exit 1 + fi + arg=$save_arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit 1 + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + compile_command="$compile_command $wl$qarg" + finalize_command="$finalize_command $wl$qarg" + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: more than one -exported-symbols argument is not allowed" + exit 1 + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + ;; + esac + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 + exit 1 + fi + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-pw32* | *-*-beos*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-mingw* | *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs -framework System" + continue + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # gcc -m* arguments should be passed to the linker via $compiler_flags + # in order to pass architecture information to the linker + # (e.g. 32 vs 64-bit). This may also be accomplished via -Wl,-mfoo + # but this is not reliable with gcc because gcc may use -mfoo to + # select a different linker, different libraries, etc, while + # -Wl,-mfoo simply passes -mfoo to the linker. + -m*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + if test "$with_gcc" = "yes" ; then + compiler_flags="$compiler_flags $arg" + fi + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + # The PATH hackery in wrapper scripts is required on Windows + # in order for the loader to find any dlls it needs. + $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 + $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit 1 + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -static) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Wl,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $wl$flag" + linker_flags="$linker_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit 1 + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit 1 + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done # argument parsing loop + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Infer tagged configuration to use if any are available and + # if one wasn't chosen via the "--tag" command line option. + # Only attempt this if the compiler in the base link + # command doesn't match the default compiler. + if test -n "$available_tags" && test -z "$tagname"; then + case $base_compile in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + "$CC "* | " $CC "* | "`$echo $CC` "* | " `$echo $CC` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$0" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $0`" + case $base_compile in + "$CC "* | " $CC "* | "`$echo $CC` "* | " `$echo $CC` "*) + # The compiler in $compile_command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit 1 + # else + # $echo "$modename: using $tagname tagged configuration" + fi + ;; + esac + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + # Create the object directory. + if test ! -d "$output_objdir"; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + status=$? + if test "$status" -ne 0 && test ! -d "$output_objdir"; then + exit $status + fi + fi + + # Determine the type of output + case $output in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + case $host in + *cygwin* | *mingw* | *pw32*) + # don't eliminate duplcations in $postdeps and $predeps + duplicate_compiler_generated_deps=yes + ;; + *) + duplicate_compiler_generated_deps=$duplicate_deps + ;; + esac + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if test "X$duplicate_deps" = "Xyes" ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + case $linkmode in + lib) + passes="conv link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 + exit 1 + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + for pass in $passes; do + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + continue + fi + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do + # Search the libtool library + lib="$searchdir/lib${name}.la" + if test -f "$lib"; then + found=yes + break + fi + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if (${SED} -e '2q' $lib | + grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + library_names= + old_library= + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + if test "$deplibs_check_method" != pass_all; then + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because the file extensions .$libext of this argument makes me believe" + $echo "*** that it is just a static archive that I should not used here." + else + $echo + $echo "*** Warning: Linking the shared library $output against the" + $echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test "$found" = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib'" 1>&2 + exit 1 + fi + + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit 1 + fi + + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + + # Read the .la file + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit 1 + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + $echo "$modename: \`$lib' is not a convenience library" 1>&2 + exit 1 + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit 1 + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 + exit 1 + fi + if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + abs_ladir="$ladir" + fi + ;; + esac + laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + $echo "$modename: warning: library \`$lib' was moved." 1>&2 + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 + exit 1 + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var"; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $dir" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + # This is a shared library + + # Warn about portability, can't link against -module's on some systems (darwin) + if test "$shouldnotlink" = yes && test "$pass" = link ; then + $echo + if test "$linkmode" = prog; then + $echo "*** Warning: Linking the executable $output against the loadable module" + else + $echo "*** Warning: Linking the shared library $output against the loadable module" + fi + $echo "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + realname="$2" + shift; shift + libname=`eval \\$echo \"$libname_spec\"` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw*) + major=`expr $current - $age` + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + soname=`$echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + $show "extracting exported symbol list from \`$soname'" + save_ifs="$IFS"; IFS='~' + eval cmds=\"$extract_expsyms_cmds\" + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + $show "generating import library for \`$soname'" + save_ifs="$IFS"; IFS='~' + eval cmds=\"$old_archive_from_expsyms_cmds\" + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5* ) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a module then we can not link against it, someone + # is ignoring the new warnings I added + if /usr/bin/file -L $add 2> /dev/null | grep "bundle" >/dev/null ; then + $echo "** Warning, lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $echo + $echo "** And there doesn't seem to be a static archive available" + $echo "** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case "$libdir" in + [\\/]*) + add_dir="-L$inst_prefix_dir$libdir $add_dir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit 1 + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && \ + test "$hardcode_minus_L" != yes && \ + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case "$libdir" in + [\\/]*) + add_dir="-L$inst_prefix_dir$libdir $add_dir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $echo + $echo "*** Warning: This system can not link to static lib archive $lib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $echo "*** But as you try to build a module library, libtool will still create " + $echo "*** a static module, that should work as long as the dlopening application" + $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + convenience="$convenience $dir/$old_library" + old_convenience="$old_convenience $dir/$old_library" + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$deplib" && dir="." + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + fi + ;; + esac + if grep "^installed=no" $deplib > /dev/null; then + path="$absdir/$objdir" + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit 1 + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="$absdir" + fi + depdepl= + case $host in + *-*-darwin*) + # we do not want to link against static libs, but need to link against shared + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$path/$depdepl" ; then + depdepl="$path/$depdepl" + fi + newlib_search_path="$newlib_search_path $path" + path="" + fi + ;; + *) + path="-L$path" + ;; + esac + + ;; + -l*) + case $host in + *-*-darwin*) + # Again, we only want to link against shared libraries + eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` + for tmp in $newlib_search_path ; do + if test -f "$tmp/lib$tmp_libs.dylib" ; then + eval depdepl="$tmp/lib$tmp_libs.dylib" + break + fi + done + path="" + ;; + *) continue ;; + esac + ;; + *) continue ;; + esac + case " $deplibs " in + *" $depdepl "*) ;; + *) deplibs="$deplibs $depdepl" ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$deplibs $path" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval shared_ext=\"$shrext\" + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval shared_ext=\"$shrext\" + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 + exit 1 + else + $echo + $echo "*** Warning: Linking the shared library $output against the non-libtool" + $echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + if test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test "$#" -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$2" + number_minor="$3" + number_revision="$4" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + current=`expr $number_major + $number_minor - 1` + age="$number_minor" + revision="$number_minor" + ;; + esac + ;; + no) + current="$2" + revision="$3" + age="$4" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; + *) + $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case $revision in + 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; + *) + $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case $age in + 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; + *) + $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + if test "$age" -gt "$current"; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + irix | nonstopux) + major=`expr $current - $age + 1` + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=.`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + major=`expr $current - $age` + versuffix="-$major" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + fi + + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$echo "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + removelist="$removelist $p" + ;; + *) ;; + esac + done + if test -n "$removelist"; then + $show "${rm}r $removelist" + $run ${rm}r $removelist + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + for path in $notinst_path; do + lib_search_path=`$echo "$lib_search_path " | ${SED} -e 's% $path % %g'` + deplibs=`$echo "$deplibs " | ${SED} -e 's% -L$path % %g'` + dependency_libs=`$echo "$dependency_libs " | ${SED} -e 's% -L$path % %g'` + done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs -framework System" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs="$deplibs -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for file magic test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a file magic. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do + name="`expr $a_deplib : '-l\(.*\)'`" + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval \\$echo \"$libname_spec\"` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval $echo \"$potent_lib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a regex pattern. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` + done + fi + if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ + | grep . >/dev/null; then + $echo + if test "X$deplibs_check_method" = "Xnone"; then + $echo "*** Warning: inter-library dependencies are not supported in this platform." + else + $echo "*** Warning: inter-library dependencies are not known to be supported." + fi + $echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $echo + $echo "*** Warning: libtool could not satisfy all declared inter-library" + $echo "*** dependencies of module $libname. Therefore, libtool will create" + $echo "*** a static module, that should work as long as the dlopening" + $echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $echo "*** The inter-library dependencies that have been dropped here will be" + $echo "*** automatically added whenever a program is linked with this library" + $echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + $echo + $echo "*** Since this library must not contain undefined symbols," + $echo "*** because either the platform does not support them or" + $echo "*** it was explicitly requested with -no-undefined," + $echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" + shift; shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + for link + do + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + eval cmds=\"$export_symbols_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + if len=`expr "X$cmd" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + $show "$cmd" + $run eval "$cmd" || exit $? + skipped_export=false + else + # The command line is too long to execute in one step. + $show "using reloadable object file for export list..." + skipped_export=: + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex"; then + $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + status=$? + if test "$status" -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case $xlib in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "$mkdir $xdir" + $run $mkdir "$xdir" + status=$? + if test "$status" -ne 0 && test ! -d "$xdir"; then + exit $status + fi + # We will extract separately just the conflicting names and we will no + # longer touch any unique names. It is faster to leave these extract + # automatically by $AR in one run. + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 + $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 + $AR t "$xabs" | sort | uniq -cd | while read -r count name + do + i=1 + while test "$i" -le "$count" + do + # Put our $i before any first dot (extension) + # Never overwrite any file + name_to="$name" + while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" + do + name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` + done + $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" + $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? + i=`expr $i + 1` + done + done + fi + + libobjs="$libobjs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval cmds=\"$module_expsym_cmds\" + else + eval cmds=\"$module_cmds\" + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval cmds=\"$archive_expsym_cmds\" + else + eval cmds=\"$archive_cmds\" + fi + fi + + if test "X$skipped_export" != "X:" && len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise. + $echo "creating reloadable object files..." + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + delfiles= + last_robj= + k=1 + output=$output_objdir/$save_output-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || + { len=`expr "X$test_cmds" : ".*"` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" + fi + last_robj=$output_objdir/$save_output-${k}.$objext + k=`expr $k + 1` + output=$output_objdir/$save_output-${k}.$objext + objlist=$obj + len=1 + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + + if ${skipped_export-false}; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + libobjs=$output + # Append the command to create the export file. + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi + + # Set up a command to remove the reloadale object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` + delfiles="$delfiles $output_objdir/$save_output-${i}.$objext" + done + + $echo "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval cmds=\"$archive_expsym_cmds\" + else + eval cmds=\"$archive_cmds\" + fi + + # Append the command to remove the reloadable object files + # to the just-reset $cmds. + eval cmds=\"\$cmds~$rm $delfiles\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? + exit 0 + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case $output in + *.lo) + if test -n "$objs$old_deplibs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit 1 + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${obj}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + status=$? + if test "$status" -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case $xlib in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "$mkdir $xdir" + $run $mkdir "$xdir" + status=$? + if test "$status" -ne 0 && test ! -d "$xdir"; then + exit $status + fi + # We will extract separately just the conflicting names and we will no + # longer touch any unique names. It is faster to leave these extract + # automatically by $AR in one run. + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 + $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 + $AR t "$xabs" | sort | uniq -cd | while read -r count name + do + i=1 + while test "$i" -le "$count" + do + # Put our $i before any first dot (extension) + # Never overwrite any file + name_to="$name" + while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" + do + name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` + done + $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" + $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? + i=`expr $i + 1` + done + done + fi + + reload_conv_objs="$reload_objs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + eval cmds=\"$reload_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit 0 + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $run eval "echo timestamp > $libobj" || exit $? + exit 0 + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + eval cmds=\"$reload_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit 0 + ;; + + prog) + case $host in + *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + esac + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + if test "$tagname" = CXX ; then + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + fi + ;; + esac + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case $dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ + /* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ + /* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + + #ifdef __cplusplus + extern \"C\" { + #endif + + /* Prevent the only kind of declaration conflicts we can make. */ + #define lt_preloaded_symbols some_other_symbol + + /* External symbol declarations for the compiler. */\ + " + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$output.exp" + $run $rm $export_symbols + $run eval "${SED} -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + else + $run eval "${SED} -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' + $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval '$echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + grep -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' + else + $echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + + #undef lt_preloaded_symbols + + #if defined (__STDC__) && __STDC__ + # define lt_ptr void * + #else + # define lt_ptr char * + # define const + #endif + + /* The mapping between symbol names and symbols. */ + const struct { + const char *name; + lt_ptr address; + } + lt_preloaded_symbols[] = + {\ + " + + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr) 0} + }; + + /* This works around a problem in FreeBSD linker */ + #ifdef FREEBSD_WORKAROUND + static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; + } + #endif + + #ifdef __cplusplus + } + #endif\ + " + fi + + pic_flag_for_symtable= + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit 1 + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi + + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $run $rm $output + # Link the executable and exit + $show "$link_command" + $run eval "$link_command" || exit $? + exit 0 + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $0 --fallback-echo"; then + case $0 in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";; + *) qecho="$SHELL `pwd`/$0 --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + cwrappersource=`$echo ${objdir}/lt-${output}.c` + cwrapper=`$echo ${output}.exe` + $rm $cwrappersource $cwrapper + trap "$rm $cwrappersource $cwrapper; exit 1" 1 2 15 + + cat > $cwrappersource <> $cwrappersource<<"EOF" + #include + #include + #include + #include + #include + #include + + #if defined(PATH_MAX) + # define LT_PATHMAX PATH_MAX + #elif defined(MAXPATHLEN) + # define LT_PATHMAX MAXPATHLEN + #else + # define LT_PATHMAX 1024 + #endif + + #ifndef DIR_SEPARATOR + #define DIR_SEPARATOR '/' + #endif + + #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) + #define HAVE_DOS_BASED_FILE_SYSTEM + #ifndef DIR_SEPARATOR_2 + #define DIR_SEPARATOR_2 '\\' + #endif + #endif + + #ifndef DIR_SEPARATOR_2 + # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) + #else /* DIR_SEPARATOR_2 */ + # define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) + #endif /* DIR_SEPARATOR_2 */ + + #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) + #define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ + } while (0) + + const char *program_name = NULL; + + void * xmalloc (size_t num); + char * xstrdup (const char *string); + char * basename (const char *name); + char * fnqualify(const char *path); + char * strendzap(char *str, const char *pat); + void lt_fatal (const char *message, ...); + + int + main (int argc, char *argv[]) + { + char **newargz; + int i; + + program_name = (char *) xstrdup ((char *) basename (argv[0])); + newargz = XMALLOC(char *, argc+2); + EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" + newargz[1] = fnqualify(argv[0]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; + EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" + } + + void * + xmalloc (size_t num) + { + void * p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; + } + + char * + xstrdup (const char *string) + { + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL + ; + } + + char * + basename (const char *name) + { + const char *base; + + #if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha (name[0]) && name[1] == ':') + name += 2; + #endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return (char *) base; + } + + char * + fnqualify(const char *path) + { + size_t size; + char *p; + char tmp[LT_PATHMAX + 1]; + + assert(path != NULL); + + /* Is it qualified already? */ + #if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha (path[0]) && path[1] == ':') + return xstrdup (path); + #endif + if (IS_DIR_SEPARATOR (path[0])) + return xstrdup (path); + + /* prepend the current directory */ + /* doesn't handle '~' */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + size = strlen(tmp) + 1 + strlen(path) + 1; /* +2 for '/' and '\0' */ + p = XMALLOC(char, size); + sprintf(p, "%s%c%s", tmp, DIR_SEPARATOR, path); + return p; + } + + char * + strendzap(char *str, const char *pat) + { + size_t len, patlen; + + assert(str != NULL); + assert(pat != NULL); + + len = strlen(str); + patlen = strlen(pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp(str, pat) == 0) + *str = '\0'; + } + return str; + } + + static void + lt_error_core (int exit_status, const char * mode, + const char * message, va_list ap) + { + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); + } + + void + lt_fatal (const char *message, ...) + { + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); + } + EOF + # we should really use a build-platform specific compiler + # here, but OTOH, the wrappers (shell script and this C one) + # are only useful if you want to execute the "real" binary. + # Since the "real" binary is built for $host, then this + # wrapper might as well be built for $host, too. + $run $LTCC -s -o $cwrapper $cwrappersource + ;; + esac + $rm $output + trap "$rm $output; exit 1" 1 2 15 + + $echo > $output "\ + #! $SHELL + + # $output - temporary wrapper script for $objdir/$outputname + # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP + # + # The $output program cannot be directly executed until all the libtool + # libraries that it depends on are installed. + # + # This wrapper script should never be moved out of the build directory. + # If it is, it will not operate correctly. + + # Sed substitution that helps us do robust quoting. It backslashifies + # metacharacters that are still active within double-quoted strings. + Xsed='${SED} -e 1s/^X//' + sed_quote_subst='$sed_quote_subst' + + # The HP-UX ksh and POSIX shell print the target directory to stdout + # if CDPATH is set. + if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi + + relink_command=\"$relink_command\" + + # This environment variable determines our operation mode. + if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variable: + notinst_deplibs='$notinst_deplibs' + else + # When we are sourced in execute mode, \$file and \$echo are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ + " + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" + " + + if test "$fast_install" = yes; then + $echo >> $output "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || \\ + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $mkdir \"\$progdir\" + else + $rm \"\$progdir/\$file\" + fi" + + $echo >> $output "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $echo \"\$relink_command_output\" >&2 + $rm \"\$progdir/\$file\" + exit 1 + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + $echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" + " + fi + + $echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var + " + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH + " + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + " + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \$progdir\\\\\$program \${1+\"\$@\"} + " + ;; + + *) + $echo >> $output "\ + exec \$progdir/\$program \${1+\"\$@\"} + " + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" + exit 1 + fi + else + # The program doesn't exist. + \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 + \$echo \"This script is just a wrapper for \$program.\" 1>&2 + $echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi + fi\ + " + chmod +x $output + fi + exit 0 + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + status=$? + if test "$status" -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + # Add in members from convenience archives. + for xlib in $addlibs; do + # Extract the objects. + case $xlib in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "$mkdir $xdir" + $run $mkdir "$xdir" + status=$? + if test "$status" -ne 0 && test ! -d "$xdir"; then + exit $status + fi + # We will extract separately just the conflicting names and we will no + # longer touch any unique names. It is faster to leave these extract + # automatically by $AR in one run. + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 + $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 + $AR t "$xabs" | sort | uniq -cd | while read -r count name + do + i=1 + while test "$i" -le "$count" + do + # Put our $i before any first dot (extension) + # Never overwrite any file + name_to="$name" + while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" + do + name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` + done + $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" + $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? + i=`expr $i + 1` + done + done + fi + + oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` + done + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + eval cmds=\"$old_archive_from_new_cmds\" + else + eval cmds=\"$old_archive_cmds\" + + if len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # the command line is too long to link in one step, link in parts + $echo "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + # GNU ar 2.10+ was changed to match POSIX; thus no paths are + # encoded into archives. This makes 'ar r' malfunction in + # this piecewise linking case whenever conflicting object + # names appear in distinct ar calls; check, warn and compensate. + if (for obj in $save_oldobjs + do + $echo "X$obj" | $Xsed -e 's%^.*/%%' + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; overriding AR_FLAGS to 'cq'" 1>&2 + $echo "$modename: warning: to ensure that POSIX-compatible ar will work" 1>&2 + AR_FLAGS=cq + fi + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + for obj in $save_oldobjs + do + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" + if len=`expr "X$test_cmds" : ".*"` && + test "$len" -le "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~$old_archive_cmds\" + fi + fi + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $0 --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit 1 + fi + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + for lib in $dlfiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit 1 + fi + newdlfiles="$newdlfiles $libdir/$name" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit 1 + fi + newdlprefiles="$newdlprefiles $libdir/$name" + done + dlprefiles="$newdlprefiles" + fi + $rm $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $echo > $output "\ + # $outputname - a libtool library file + # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP + # + # Please DO NOT delete this file! + # It is necessary for linking the library. + + # The name that we can dlopen(3). + dlname='$tdlname' + + # Names of this library. + library_names='$library_names' + + # The name of the static archive. + old_library='$old_library' + + # Libraries that this one depends upon. + dependency_libs='$dependency_libs' + + # Version information for $libname. + current=$current + age=$age + revision=$revision + + # Is this an already installed library? + installed=$installed + + # Should we warn about portability when linking against -modules? + shouldnotlink=$module + + # Files to dlopen/dlpreopen + dlopen='$dlfiles' + dlpreopen='$dlprefiles' + + # Directory that this library needs to be installed in: + libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $echo >> $output "\ + relink_command=\"$relink_command\"" + fi + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? + ;; + esac + exit 0 + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg="$nonopt" + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest="$arg" + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) prev="-f" ;; + -g) prev="-g" ;; + -m) prev="-m" ;; + -o) prev="-o" ;; + -s) + stripme=" -s" + continue + ;; + -*) ;; + + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest="$arg" + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit 1 + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test "$#" -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + library_names= + old_library= + relink_command= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit 1 + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + exit 1 + fi + fi + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$srcname $destdir/$realname" + $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? + if test -n "$stripme" && test -n "$striplib"; then + $show "$striplib $destdir/$realname" + $run eval "$striplib $destdir/$realname" || exit $? + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + for linkname + do + if test "$linkname" != "$realname"; then + $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + eval cmds=\"$postinstall_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit 0 + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + file=`$echo $file|${SED} 's,.exe$,,'` + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin*|*mingw*) + wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` + ;; + *) + wrapper=$file + ;; + esac + if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # To insure that "foo" is sourced, and not "foo.exe", + # finese the cygwin/MSYS system by explicitly sourcing "foo." + # which disallows the automatic-append-.exe behavior. + case $build in + *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; + *) wrapperdot=${wrapper} ;; + esac + # If there is no directory component, then add one. + case $file in + */* | *\\*) . ${wrapperdot} ;; + *) . ./${wrapperdot} ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 + exit 1 + fi + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + relink_command= + # To insure that "foo" is sourced, and not "foo.exe", + # finese the cygwin/MSYS system by explicitly sourcing "foo." + # which disallows the automatic-append-.exe behavior. + case $build in + *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; + *) wrapperdot=${wrapper} ;; + esac + # If there is no directory component, then add one. + case $file in + */* | *\\*) . ${wrapperdot} ;; + *) . ./${wrapperdot} ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir="/tmp" + test -n "$TMPDIR" && tmpdir="$TMPDIR" + tmpdir="$tmpdir/libtool-$$" + if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then : + else + $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 + continue + fi + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyways + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + ;; + esac + ;; + esac + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + if test -n "$stripme" && test -n "$striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + eval cmds=\"$old_postinstall_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $0 --finish$current_libdirs' + else + exit 0 + fi + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + eval cmds=\"$finish_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit 0 + + $echo "----------------------------------------------------------------------" + $echo "Libraries have been installed in:" + for libdir in $libdirs; do + $echo " $libdir" + done + $echo + $echo "If you ever happen to want to link against installed libraries" + $echo "in a given directory, LIBDIR, you must either use libtool, and" + $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + $echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + $echo " during execution" + fi + if test -n "$runpath_var"; then + $echo " - add LIBDIR to the \`$runpath_var' environment variable" + $echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $echo " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $echo " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + $echo + $echo "See any operating system documentation about shared libraries for" + $echo "more information, such as the ld(1) and ld.so(8) manual pages." + $echo "----------------------------------------------------------------------" + exit 0 + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit 1 + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit 1 + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + if test "${save_LC_ALL+set}" = set; then + LC_ALL="$save_LC_ALL"; export LC_ALL + fi + if test "${save_LANG+set}" = set; then + LANG="$save_LANG"; export LANG + fi + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit 0 + fi + ;; + + # libtool clean and uninstall mode + clean | uninstall) + modename="$modename: $mode" + rm="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) rm="$rm $arg"; rmforce=yes ;; + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if (test -L "$file") >/dev/null 2>&1 \ + || (test -h "$file") >/dev/null 2>&1 \ + || test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + test "$mode" = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + + if test "$mode" = uninstall; then + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + eval cmds=\"$postuninstall_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + eval cmds=\"$old_postuninstall_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. + fi + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + + # Read the .lo file + . $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" \ + && test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" \ + && test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + file=`$echo $file|${SED} 's,.exe$,,'` + noexename=`$echo $name|${SED} 's,.exe$,,'` + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$noexename + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + $show "rmdir $dir" + $run rmdir $dir >/dev/null 2>&1 + fi + done + + exit $exit_status + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 + ;; + esac + + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 + fi + fi # test -z "$show_help" + + if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit 1 + fi + + # We need to display help for each of the modes. + case $mode in + "") $echo \ + "Usage: $modename [OPTION]... [MODE-ARG]... + + Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + --version print version information + + MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + + MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for + a more detailed description of MODE. + + Report bugs to ." + exit 0 + ;; + + clean) + $echo \ + "Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + + Remove files from the build directory. + + RM is the name of the program to use to delete files associated with each FILE + (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed + to RM. + + If FILE is a libtool library, object or program, all the files associated + with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $echo \ + "Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + + Compile a source file into a libtool library object. + + This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -static always build a \`.o' file suitable for static linking + + COMPILE-COMMAND is a command to be used in creating a \`standard' object file + from the given SOURCEFILE. + + The output file name is determined by removing the directory component from + SOURCEFILE, then substituting the C source code suffix \`.c' with the + library object suffix, \`.lo'." + ;; + + execute) + $echo \ + "Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + + Automatically set library path, then run a program. + + This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + + This mode sets the library path environment variable according to \`-dlopen' + flags. + + If any of the ARGS are libtool executable wrappers, then they are translated + into their corresponding uninstalled binary, and any of their required library + directories are added to the library path. + + Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $echo \ + "Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + + Complete the installation of libtool libraries. + + Each LIBDIR is a directory that contains libtool libraries. + + The commands that this mode executes may require superuser privileges. Use + the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $echo \ + "Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + + Install executables or libraries. + + INSTALL-COMMAND is the installation command. The first component should be + either the \`install' or \`cp' program. + + The rest of the components are interpreted as arguments to that command (only + BSD-compatible install options are recognized)." + ;; + + link) + $echo \ + "Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + + Link object files or libraries together to form another library, or to + create an executable program. + + LINK-COMMAND is a command using the C compiler that you would use to create + a program from several object files. + + The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -static do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + + All other options (arguments beginning with \`-') are ignored. + + Every other argument is treated as a filename. Files ending in \`.la' are + treated as uninstalled libtool libraries, other files are standard or library + object files. + + If the OUTPUT-FILE ends in \`.la', then a libtool library is created, + only library objects (\`.lo' files) may be specified, and \`-rpath' is + required, except when creating a convenience library. + + If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created + using \`ar' and \`ranlib', or on Windows using \`lib'. + + If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file + is created, otherwise an executable program is created." + ;; + + uninstall) + $echo \ + "Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + + Remove libraries from an installation directory. + + RM is the name of the program to use to delete files associated with each FILE + (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed + to RM. + + If FILE is a libtool library, all the files associated with it are deleted. + Otherwise, only FILE itself is deleted using RM." + ;; + + *) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + esac + + $echo + $echo "Try \`$modename --help' for more information about other modes." + + exit 0 + + # The TAGs below are defined such that we never get into a situation + # in which we disable both kinds of libraries. Given conflicting + # choices, we go for a static library, that is the most portable, + # since we can't tell whether shared libraries were disabled because + # the user asked for that or because the platform doesn't support + # them. This is particularly important on AIX, because we don't + # support having both static and shared libraries enabled at the same + # time on that platform, so we default to a shared-only configuration. + # If a disable-shared tag is given, we'll fallback to a static-only + # configuration. But we'll never go from static-only to shared-only. + + # ### BEGIN LIBTOOL TAG CONFIG: disable-shared + build_libtool_libs=no + build_old_libs=yes + # ### END LIBTOOL TAG CONFIG: disable-shared + + # ### BEGIN LIBTOOL TAG CONFIG: disable-static + build_old_libs=`case $build_libtool_libs in yes) $echo no;; *) $echo yes;; esac` + # ### END LIBTOOL TAG CONFIG: disable-static + + # Local Variables: + # mode:shell-script + # sh-indentation:2 + # End: Index: llvm/projects/ModuleMaker/autoconf/mkinstalldirs diff -c /dev/null llvm/projects/ModuleMaker/autoconf/mkinstalldirs:1.1 *** /dev/null Tue Nov 25 14:00:09 2003 --- llvm/projects/ModuleMaker/autoconf/mkinstalldirs Tue Nov 25 13:59:59 2003 *************** *** 0 **** --- 1,101 ---- + #! /bin/sh + # mkinstalldirs --- make directory hierarchy + # Author: Noah Friedman + # Created: 1993-05-16 + # Public domain + + # $Id: mkinstalldirs,v 1.1 2003/11/25 19:59:59 criswell Exp $ + + errstatus=0 + dirmode="" + + usage="\ + Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." + + # process command line arguments + while test $# -gt 0 ; do + case "${1}" in + -h | --help | --h* ) # -h for help + echo "${usage}" 1>&2; exit 0 ;; + -m ) # -m PERM arg + shift + test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; } + dirmode="${1}" + shift ;; + -- ) shift; break ;; # stop option processing + -* ) echo "${usage}" 1>&2; exit 1 ;; # unknown option + * ) break ;; # first non-opt arg + esac + done + + for file + do + if test -d "$file"; then + shift + else + break + fi + done + + case $# in + 0) exit 0 ;; + esac + + case $dirmode in + '') + if mkdir -p -- . 2>/dev/null; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + fi ;; + *) + if mkdir -m "$dirmode" -p -- . 2>/dev/null; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + fi ;; + esac + + for file + do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + + lasterr="" + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp="$pathcomp/" + done + done + + exit $errstatus + + # Local Variables: + # mode: shell-script + # sh-indentation: 3 + # End: + # mkinstalldirs ends here From criswell at cs.uiuc.edu Tue Nov 25 14:03:01 2003 From: criswell at cs.uiuc.edu (John Criswell) Date: Tue Nov 25 14:03:01 2003 Subject: [llvm-commits] CVS: llvm/projects/ModuleMaker/configure Message-ID: <200311252002.OAA10489@choi.cs.uiuc.edu> Changes in directory llvm/projects/ModuleMaker: configure added (r1.1) --- Log message: Configure script for ModuleMaker. --- Diffs of the changes: (+2210 -0) Index: llvm/projects/ModuleMaker/configure diff -c /dev/null llvm/projects/ModuleMaker/configure:1.1 *** /dev/null Tue Nov 25 14:02:18 2003 --- llvm/projects/ModuleMaker/configure Tue Nov 25 14:02:07 2003 *************** *** 0 **** --- 1,2210 ---- + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. + # Generated by GNU Autoconf 2.57 for [ModuleMaker] [x.xx]. + # + # Report bugs to . + # + # Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 + # Free Software Foundation, Inc. + # This configure script is free software; the Free Software Foundation + # gives unlimited permission to copy, distribute and modify it. + ## --------------------- ## + ## M4sh Initialization. ## + ## --------------------- ## + + # Be Bourne compatible + if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix + fi + + # Support unset when possible. + if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset + else + as_unset=false + fi + + + # Work around bugs in pre-3.0 UWIN ksh. + $as_unset ENV MAIL MAILPATH + PS1='$ ' + PS2='> ' + PS4='+ ' + + # NLS nuisances. + for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME + do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi + done + + # Required to use basename. + if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr + else + as_expr=false + fi + + if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename + else + as_basename=false + fi + + + # Name of the executable. + as_me=`$as_basename "$0" || + $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || + echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + + # PATH needs CR, and LINENO needs CR and PATH. + # Avoid depending upon Character Ranges. + as_cr_letters='abcdefghijklmnopqrstuvwxyz' + as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' + as_cr_Letters=$as_cr_letters$as_cr_LETTERS + as_cr_digits='0123456789' + as_cr_alnum=$as_cr_Letters$as_cr_digits + + # The user is always right. + if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh + fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done + done + ;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit + } + + + case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' + ' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; + esac + + if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr + else + as_expr=false + fi + + rm -f conf$$ conf$$.exe conf$$.file + echo >conf$$.file + if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi + rm -f conf$$ conf$$.exe conf$$.file + + if mkdir -p . 2>/dev/null; then + as_mkdir_p=: + else + as_mkdir_p=false + fi + + as_executable_p="test -f" + + # Sed expression to map a string onto a valid CPP name. + as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + + # Sed expression to map a string onto a valid variable name. + as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + + # IFS + # We need space, tab and new line, in precisely that order. + as_nl=' + ' + IFS=" $as_nl" + + # CDPATH. + $as_unset CDPATH + + + # Name of the host. + # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, + # so uname gets run too. + ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + + exec 6>&1 + + # + # Initializations. + # + ac_default_prefix=/usr/local + ac_config_libobj_dir=. + cross_compiling=no + subdirs= + MFLAGS= + MAKEFLAGS= + SHELL=${CONFIG_SHELL-/bin/sh} + + # Maximum number of lines to put in a shell here document. + # This variable seems obsolete. It should probably be removed, and + # only ac_max_sed_lines should be used. + : ${ac_max_here_lines=38} + + # Identity of this package. + PACKAGE_NAME='[ModuleMaker]' + PACKAGE_TARNAME='--modulemaker--' + PACKAGE_VERSION='[x.xx]' + PACKAGE_STRING='[ModuleMaker] [x.xx]' + PACKAGE_BUGREPORT='bugs at yourdomain' + + ac_unique_file=""Makefile.common.in"" + ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS LLVM_SRC LLVM_OBJ LIBOBJS LTLIBOBJS' + ac_subst_files='' + + # Initialize some variables set by options. + ac_init_help= + ac_init_version=false + # The variables have the same names as the options, with + # dashes changed to underlines. + cache_file=/dev/null + exec_prefix=NONE + no_create= + no_recursion= + prefix=NONE + program_prefix=NONE + program_suffix=NONE + program_transform_name=s,x,x, + silent= + site= + srcdir= + verbose= + x_includes=NONE + x_libraries=NONE + + # Installation directory options. + # These are left unexpanded so users can "make install exec_prefix=/foo" + # and all the variables that are supposed to be based on exec_prefix + # by default will actually change. + # Use braces instead of parens because sh, perl, etc. also accept them. + bindir='${exec_prefix}/bin' + sbindir='${exec_prefix}/sbin' + libexecdir='${exec_prefix}/libexec' + datadir='${prefix}/share' + sysconfdir='${prefix}/etc' + sharedstatedir='${prefix}/com' + localstatedir='${prefix}/var' + libdir='${exec_prefix}/lib' + includedir='${prefix}/include' + oldincludedir='/usr/include' + infodir='${prefix}/info' + mandir='${prefix}/man' + + ac_prev= + for ac_option + do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option + Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac + done + + if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } + fi + + # Be sure to have absolute paths. + for ac_var in exec_prefix prefix + do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac + done + + # Be sure to have absolute paths. + for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir + do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac + done + + # There might be people who depend on the old broken behavior: `$host' + # used to hold the argument of --host etc. + # FIXME: To remove some day. + build=$build_alias + host=$host_alias + target=$target_alias + + # FIXME: To remove some day. + if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi + fi + + ac_tool_prefix= + test -n "$host_alias" && ac_tool_prefix=$host_alias- + + test "$silent" = yes && exec 6>/dev/null + + + # Find the source files, if location was not specified. + if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || + $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || + echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi + else + ac_srcdir_defaulted=no + fi + if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi + fi + (cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } + srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` + ac_env_build_alias_set=${build_alias+set} + ac_env_build_alias_value=$build_alias + ac_cv_env_build_alias_set=${build_alias+set} + ac_cv_env_build_alias_value=$build_alias + ac_env_host_alias_set=${host_alias+set} + ac_env_host_alias_value=$host_alias + ac_cv_env_host_alias_set=${host_alias+set} + ac_cv_env_host_alias_value=$host_alias + ac_env_target_alias_set=${target_alias+set} + ac_env_target_alias_value=$target_alias + ac_cv_env_target_alias_set=${target_alias+set} + ac_cv_env_target_alias_value=$target_alias + + # + # Report the --help message. + # + if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF + \`configure' configures [ModuleMaker] [x.xx] to adapt to many kinds of systems. + + Usage: $0 [OPTION]... [VAR=VALUE]... + + To assign environment variables (e.g., CC, CFLAGS...), specify them as + VAR=VALUE. See below for descriptions of some of the useful variables. + + Defaults for the options are specified in brackets. + + Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + + _ACEOF + + cat <<_ACEOF + Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + + By default, \`make install' will install all the files in + \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify + an installation prefix other than \`$ac_default_prefix' using \`--prefix', + for instance \`--prefix=\$HOME'. + + For better control, use the options below. + + Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] + _ACEOF + + cat <<\_ACEOF + _ACEOF + fi + + if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of [ModuleMaker] [x.xx]:";; + esac + cat <<\_ACEOF + + Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-llvmsrc Location of LLVM Source Code + --with-llvmobj Location of LLVM Object Code + + Report bugs to . + _ACEOF + fi + + if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + + if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` + else + ac_dir_suffix= ac_top_builddir= + fi + + case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; + esac + # Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be + # absolute. + ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` + ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` + ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` + ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_srcdir/configure.gnu; then + echo + $SHELL $ac_srcdir/configure.gnu --help=recursive + elif test -f $ac_srcdir/configure; then + echo + $SHELL $ac_srcdir/configure --help=recursive + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done + fi + + test -n "$ac_init_help" && exit 0 + if $ac_init_version; then + cat <<\_ACEOF + [ModuleMaker] configure [x.xx] + generated by GNU Autoconf 2.57 + + Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 + Free Software Foundation, Inc. + This configure script is free software; the Free Software Foundation + gives unlimited permission to copy, distribute and modify it. + _ACEOF + exit 0 + fi + exec 5>config.log + cat >&5 <<_ACEOF + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + + It was created by [ModuleMaker] $as_me [x.xx], which was + generated by GNU Autoconf 2.57. Invocation command line was + + $ $0 $@ + + _ACEOF + { + cat <<_ASUNAME + ## --------- ## + ## Platform. ## + ## --------- ## + + hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` + uname -m = `(uname -m) 2>/dev/null || echo unknown` + uname -r = `(uname -r) 2>/dev/null || echo unknown` + uname -s = `(uname -s) 2>/dev/null || echo unknown` + uname -v = `(uname -v) 2>/dev/null || echo unknown` + + /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` + /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + + /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` + /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` + /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` + hostinfo = `(hostinfo) 2>/dev/null || echo unknown` + /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` + /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` + /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + + _ASUNAME + + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" + done + + } >&5 + + cat >&5 <<_ACEOF + + + ## ----------- ## + ## Core tests. ## + ## ----------- ## + + _ACEOF + + + # Keep a trace of the command line. + # Strip out --no-create and --no-recursion so they do not pile up. + # Strip out --silent because we don't want to record it for future runs. + # Also quote any args containing shell meta-characters. + # Make two passes to allow for proper duplicate-argument suppression. + ac_configure_args= + ac_configure_args0= + ac_configure_args1= + ac_sep= + ac_must_keep_next=false + for ac_pass in 1 2 + do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done + done + $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } + $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + + # When interrupted or exit'd, cleanup temporary files, and complete + # config.log. We remove comments because anyway the quotes in there + # would cause problems or look ugly. + # WARNING: Be sure not to use single quotes in there, as some shells, + # such as our DU 5.0 friend, will then `close' the trap. + trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX + ## ---------------- ## + ## Cache variables. ## + ## ---------------- ## + _ASBOX + echo + # The following way of writing the cache mishandles newlines in values, + { + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; + } + echo + + cat <<\_ASBOX + ## ----------------- ## + ## Output variables. ## + ## ----------------- ## + _ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX + ## ------------- ## + ## Output files. ## + ## ------------- ## + _ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX + ## ----------- ## + ## confdefs.h. ## + ## ----------- ## + _ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core core.* *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 + for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal + done + ac_signal=0 + + # confdefs.h avoids OS command line length limits that DEFS can exceed. + rm -rf conftest* confdefs.h + # AIX cpp loses on an empty file, so make sure it contains at least a newline. + echo >confdefs.h + + # Predefined preprocessor variables. + + cat >>confdefs.h <<_ACEOF + #define PACKAGE_NAME "$PACKAGE_NAME" + _ACEOF + + + cat >>confdefs.h <<_ACEOF + #define PACKAGE_TARNAME "$PACKAGE_TARNAME" + _ACEOF + + + cat >>confdefs.h <<_ACEOF + #define PACKAGE_VERSION "$PACKAGE_VERSION" + _ACEOF + + + cat >>confdefs.h <<_ACEOF + #define PACKAGE_STRING "$PACKAGE_STRING" + _ACEOF + + + cat >>confdefs.h <<_ACEOF + #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" + _ACEOF + + + # Let the site file select an alternate cache file if it wants to. + # Prefer explicitly selected file to automatically selected ones. + if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi + fi + for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 + echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi + done + + if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 + echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi + else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 + echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file + fi + + # Check that the precious variables saved in the cache have kept the same + # value. + ac_cache_corrupted=false + for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 + echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 + echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 + echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 + echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 + echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi + done + if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 + echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 + echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } + fi + + ac_ext=c + ac_cpp='$CPP $CPPFLAGS' + ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' + ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' + ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ac_aux_dir= + for ac_dir in autoconf $srcdir/autoconf; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f $ac_dir/shtool; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi + done + if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in autoconf $srcdir/autoconf" >&5 + echo "$as_me: error: cannot find install-sh or install.sh in autoconf $srcdir/autoconf" >&2;} + { (exit 1); exit 1; }; } + fi + ac_config_guess="$SHELL $ac_aux_dir/config.guess" + ac_config_sub="$SHELL $ac_aux_dir/config.sub" + ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + + + + + ac_config_commands="$ac_config_commands Makefile" + + + + + + + + + + + + + + + # Check whether --with-llvmsrc or --without-llvmsrc was given. + if test "${with_llvmsrc+set}" = set; then + withval="$with_llvmsrc" + LLVM_SRC=$withval + + else + LLVM_SRC=`cd ${srcdir}/../..; pwd` + + fi; + + + # Check whether --with-llvmobj or --without-llvmobj was given. + if test "${with_llvmobj+set}" = set; then + withval="$with_llvmobj" + LLVM_OBJ=$withval + + else + LLVM_OBJ=`cd ../..; pwd` + + fi; + + ac_config_files="$ac_config_files Makefile.common" + cat >confcache <<\_ACEOF + # This file is a shell script that caches the results of configure + # tests run on this system so they can be shared between configure + # scripts and configure runs, see configure's option --config-cache. + # It is not useful on other systems. If it contains results you don't + # want to keep, you may remove or edit it. + # + # config.status only pays attention to the cache file if you give it + # the --recheck option to rerun configure. + # + # `ac_cv_env_foo' variables (set or unset) will be overridden when + # loading this file, other *unset* `ac_cv_foo' will be assigned the + # following values. + + _ACEOF + + # The following way of writing the cache mishandles newlines in values, + # but we know of no workaround that is simple, portable, and efficient. + # So, don't put newlines in cache variables' values. + # Ultrix sh set writes to stderr and can't be redirected directly, + # and sets the high bit in the cache file unless we assign to the vars. + { + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; + } | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache + if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi + fi + rm -f confcache + + test "x$prefix" = xNONE && prefix=$ac_default_prefix + # Let make expand exec_prefix. + test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + + # VPATH may cause trouble with some makes, so we remove $(srcdir), + # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and + # trailing colons and then remove the whole line if VPATH becomes empty + # (actually we leave an empty line to preserve line numbers). + if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ + s/:*\$(srcdir):*/:/; + s/:*\${srcdir}:*/:/; + s/:*@srcdir@:*/:/; + s/^\([^=]*=[ ]*\):*/\1/; + s/:*$//; + s/^[^=]*=[ ]*$//; + }' + fi + + # Transform confdefs.h into DEFS. + # Protect against shell expansion while executing Makefile rules. + # Protect against Makefile macro expansion. + # + # If the first sed substitution is executed (which looks for macros that + # take arguments), then we branch to the quote section. Otherwise, + # look for a macro that doesn't take arguments. + cat >confdef2opt.sed <<\_ACEOF + t clear + : clear + s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g + t quote + s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g + t quote + d + : quote + s,[ `~#$^&*(){}\\|;'"<>?],\\&,g + s,\[,\\&,g + s,\],\\&,g + s,\$,$$,g + p + _ACEOF + # We use echo to avoid assuming a particular line-breaking character. + # The extra dot is to prevent the shell from consuming trailing + # line-breaks from the sub-command output. A line-break within + # single-quotes doesn't work because, if this script is created in a + # platform that uses two characters for line-breaks (e.g., DOS), tr + # would break. + ac_LF_and_DOT=`echo; echo .` + DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` + rm -f confdef2opt.sed + + + ac_libobjs= + ac_ltlibobjs= + for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' + done + LIBOBJS=$ac_libobjs + + LTLIBOBJS=$ac_ltlibobjs + + + + : ${CONFIG_STATUS=./config.status} + ac_clean_files_save=$ac_clean_files + ac_clean_files="$ac_clean_files $CONFIG_STATUS" + { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 + echo "$as_me: creating $CONFIG_STATUS" >&6;} + cat >$CONFIG_STATUS <<_ACEOF + #! $SHELL + # Generated by $as_me. + # Run this file to recreate the current configuration. + # Compiler output produced by configure, useful for debugging + # configure, is in config.log if it exists. + + debug=false + ac_cs_recheck=false + ac_cs_silent=false + SHELL=\${CONFIG_SHELL-$SHELL} + _ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + ## --------------------- ## + ## M4sh Initialization. ## + ## --------------------- ## + + # Be Bourne compatible + if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix + fi + + # Support unset when possible. + if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset + else + as_unset=false + fi + + + # Work around bugs in pre-3.0 UWIN ksh. + $as_unset ENV MAIL MAILPATH + PS1='$ ' + PS2='> ' + PS4='+ ' + + # NLS nuisances. + for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME + do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi + done + + # Required to use basename. + if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr + else + as_expr=false + fi + + if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename + else + as_basename=false + fi + + + # Name of the executable. + as_me=`$as_basename "$0" || + $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || + echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + + # PATH needs CR, and LINENO needs CR and PATH. + # Avoid depending upon Character Ranges. + as_cr_letters='abcdefghijklmnopqrstuvwxyz' + as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' + as_cr_Letters=$as_cr_letters$as_cr_LETTERS + as_cr_digits='0123456789' + as_cr_alnum=$as_cr_Letters$as_cr_digits + + # The user is always right. + if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh + fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 + echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH + do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done + done + ;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 + echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit + } + + + case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' + ' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; + esac + + if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr + else + as_expr=false + fi + + rm -f conf$$ conf$$.exe conf$$.file + echo >conf$$.file + if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi + rm -f conf$$ conf$$.exe conf$$.file + + if mkdir -p . 2>/dev/null; then + as_mkdir_p=: + else + as_mkdir_p=false + fi + + as_executable_p="test -f" + + # Sed expression to map a string onto a valid CPP name. + as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + + # Sed expression to map a string onto a valid variable name. + as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + + # IFS + # We need space, tab and new line, in precisely that order. + as_nl=' + ' + IFS=" $as_nl" + + # CDPATH. + $as_unset CDPATH + + exec 6>&1 + + # Open the log real soon, to keep \$[0] and so on meaningful, and to + # report actual input values of CONFIG_FILES etc. instead of their + # values after options handling. Logging --version etc. is OK. + exec 5>>config.log + { + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX + ## Running $as_me. ## + _ASBOX + } >&5 + cat >&5 <<_CSEOF + + This file was extended by [ModuleMaker] $as_me [x.xx], which was + generated by GNU Autoconf 2.57. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + + _CSEOF + echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 + echo >&5 + _ACEOF + + # Files that config.status was made for. + if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS + fi + + if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS + fi + + if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS + fi + + if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS + fi + + cat >>$CONFIG_STATUS <<\_ACEOF + + ac_cs_usage="\ + \`$as_me' instantiates files from templates according to the + current configuration. + + Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + + Configuration files: + $config_files + + Configuration commands: + $config_commands + + Report bugs to ." + _ACEOF + + cat >>$CONFIG_STATUS <<_ACEOF + ac_cs_version="\\ + [ModuleMaker] config.status [x.xx] + configured by $0, generated by GNU Autoconf 2.57, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + + Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 + Free Software Foundation, Inc. + This config.status script is free software; the Free Software Foundation + gives unlimited permission to copy, distribute and modify it." + srcdir=$srcdir + _ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # If no file are specified by the user, then we need to provide default + # value. By we need to know if files were specified by the user. + ac_need_defaults=: + while test $# != 0 + do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_shift=: + ;; + -*) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. + _ACEOF + cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 + Try \`$0 --help' for more information." >&5 + echo "$as_me: error: ambiguous option: $1 + Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 + Try \`$0 --help' for more information." >&5 + echo "$as_me: error: unrecognized option: $1 + Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift + done + + ac_configure_extra_args= + + if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" + fi + + _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF + if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + fi + + _ACEOF + + cat >>$CONFIG_STATUS <<_ACEOF + # + # INIT-COMMANDS section. + # + + ${srcdir}/autoconf/mkinstalldirs `dirname Makefile` + + _ACEOF + + + + cat >>$CONFIG_STATUS <<\_ACEOF + for ac_config_target in $ac_config_targets + do + case "$ac_config_target" in + # Handling of arguments. + "Makefile.common" ) CONFIG_FILES="$CONFIG_FILES Makefile.common" ;; + "Makefile" ) CONFIG_COMMANDS="$CONFIG_COMMANDS Makefile" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 + echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac + done + + # If the user did not use the arguments to specify the items to instantiate, + # then the envvar interface is used. Set only those that are not. + # We use the long form for the default assignment because of an extremely + # bizarre bug on SunOS 4.1.3. + if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands + fi + + # Have a temporary directory for convenience. Make it in the build tree + # simply because there is no reason to put it here, and in addition, + # creating and moving files from /tmp can sometimes cause problems. + # Create a temporary directory, and hook for its removal unless debugging. + $debug || + { + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 + } + + # Create a (secure) tmp directory for tmp files. + + { + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" + } || + { + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) + } || + { + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } + } + + _ACEOF + + cat >>$CONFIG_STATUS <<_ACEOF + + # + # CONFIG_FILES section. + # + + # No need to generate the scripts if there are no CONFIG_FILES. + # This happens for instance when ./config.status config.h + if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF + s, at SHELL@,$SHELL,;t t + s, at PATH_SEPARATOR@,$PATH_SEPARATOR,;t t + s, at PACKAGE_NAME@,$PACKAGE_NAME,;t t + s, at PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t + s, at PACKAGE_VERSION@,$PACKAGE_VERSION,;t t + s, at PACKAGE_STRING@,$PACKAGE_STRING,;t t + s, at PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t + s, at exec_prefix@,$exec_prefix,;t t + s, at prefix@,$prefix,;t t + s, at program_transform_name@,$program_transform_name,;t t + s, at bindir@,$bindir,;t t + s, at sbindir@,$sbindir,;t t + s, at libexecdir@,$libexecdir,;t t + s, at datadir@,$datadir,;t t + s, at sysconfdir@,$sysconfdir,;t t + s, at sharedstatedir@,$sharedstatedir,;t t + s, at localstatedir@,$localstatedir,;t t + s, at libdir@,$libdir,;t t + s, at includedir@,$includedir,;t t + s, at oldincludedir@,$oldincludedir,;t t + s, at infodir@,$infodir,;t t + s, at mandir@,$mandir,;t t + s, at build_alias@,$build_alias,;t t + s, at host_alias@,$host_alias,;t t + s, at target_alias@,$target_alias,;t t + s, at DEFS@,$DEFS,;t t + s, at ECHO_C@,$ECHO_C,;t t + s, at ECHO_N@,$ECHO_N,;t t + s, at ECHO_T@,$ECHO_T,;t t + s, at LIBS@,$LIBS,;t t + s, at LLVM_SRC@,$LLVM_SRC,;t t + s, at LLVM_OBJ@,$LLVM_OBJ,;t t + s, at LIBOBJS@,$LIBOBJS,;t t + s, at LTLIBOBJS@,$LTLIBOBJS,;t t + CEOF + + _ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi + fi # test -n "$CONFIG_FILES" + + _ACEOF + cat >>$CONFIG_STATUS <<\_ACEOF + for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || + $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || + echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || + $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || + echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 + echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + + if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` + else + ac_dir_suffix= ac_top_builddir= + fi + + case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; + esac + # Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be + # absolute. + ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` + ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` + ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` + ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 + echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub + $extrasub + _ACEOF + cat >>$CONFIG_STATUS <<\_ACEOF + :t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b + s, at configure_input@,$configure_input,;t t + s, at srcdir@,$ac_srcdir,;t t + s, at abs_srcdir@,$ac_abs_srcdir,;t t + s, at top_srcdir@,$ac_top_srcdir,;t t + s, at abs_top_srcdir@,$ac_abs_top_srcdir,;t t + s, at builddir@,$ac_builddir,;t t + s, at abs_builddir@,$ac_abs_builddir,;t t + s, at top_builddir@,$ac_top_builddir,;t t + s, at abs_top_builddir@,$ac_abs_top_builddir,;t t + " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + + done + _ACEOF + cat >>$CONFIG_STATUS <<\_ACEOF + + # + # CONFIG_COMMANDS section. + # + for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue + ac_dest=`echo "$ac_file" | sed 's,:.*,,'` + ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_dir=`(dirname "$ac_dest") 2>/dev/null || + $as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_dest" : 'X\(//\)[^/]' \| \ + X"$ac_dest" : 'X\(//\)$' \| \ + X"$ac_dest" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || + echo X"$ac_dest" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + ac_builddir=. + + if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` + else + ac_dir_suffix= ac_top_builddir= + fi + + case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; + esac + # Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be + # absolute. + ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` + ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` + ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` + ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 + echo "$as_me: executing $ac_dest commands" >&6;} + case $ac_dest in + Makefile ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/Makefile Makefile ;; + esac + done + _ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + + { (exit 0); exit 0; } + _ACEOF + chmod +x $CONFIG_STATUS + ac_clean_files=$ac_clean_files_save + + + # configure is writing to config.log, and then calls config.status. + # config.status does its own redirection, appending to config.log. + # Unfortunately, on DOS this fails, as config.log is still kept open + # by configure, so config.status won't be able to write to it; its + # output is simply discarded. So we exec the FD to /dev/null, + # effectively closing config.log, so it can be properly (re)opened and + # appended to by config.status. When coming back to configure, we + # need to make the FD available again. + if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } + fi + From lattner at cs.uiuc.edu Tue Nov 25 14:11:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 14:11:01 2003 Subject: [llvm-commits] CVS: llvm/lib/Analysis/BasicAliasAnalysis.cpp Message-ID: <200311252010.OAA00618@zion.cs.uiuc.edu> Changes in directory llvm/lib/Analysis: BasicAliasAnalysis.cpp updated: 1.17 -> 1.18 --- Log message: Use gep_type_begin/end instead of looking for ubytes --- Diffs of the changes: (+7 -4) Index: llvm/lib/Analysis/BasicAliasAnalysis.cpp diff -u llvm/lib/Analysis/BasicAliasAnalysis.cpp:1.17 llvm/lib/Analysis/BasicAliasAnalysis.cpp:1.18 --- llvm/lib/Analysis/BasicAliasAnalysis.cpp:1.17 Tue Nov 25 12:33:40 2003 +++ llvm/lib/Analysis/BasicAliasAnalysis.cpp Tue Nov 25 14:10:07 2003 @@ -16,12 +16,12 @@ #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Pass.h" #include "llvm/Argument.h" -#include "llvm/iMemory.h" #include "llvm/iOther.h" #include "llvm/ConstantHandling.h" #include "llvm/GlobalValue.h" #include "llvm/DerivedTypes.h" #include "llvm/Target/TargetData.h" +#include "llvm/Support/GetElementPtrTypeIterator.h" using namespace llvm; // Make sure that anything that uses AliasAnalysis pulls in this file... @@ -288,11 +288,14 @@ // std::vector Indices1; Indices1.reserve(NumGEPOperands-1); - for (unsigned i = 1; i != FirstConstantOper; ++i) - if (GEP1->getOperand(i)->getType() == Type::UByteTy) - Indices1.push_back(GEP1->getOperand(i)); + + for (gep_type_iterator I = gep_type_begin(GEP1); + I.getOperandNum() != FirstConstantOper; ++I) + if (isa(*I)) + Indices1.push_back(I.getOperand()); else Indices1.push_back(Constant::getNullValue(Type::LongTy)); + std::vector Indices2; Indices2.reserve(NumGEPOperands-1); Indices2 = Indices1; // Copy the zeros prefix... From lattner at cs.uiuc.edu Tue Nov 25 14:12:00 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 14:12:00 2003 Subject: [llvm-commits] CVS: llvm/lib/Analysis/ValueNumbering.cpp Message-ID: <200311252011.OAA00657@zion.cs.uiuc.edu> Changes in directory llvm/lib/Analysis: ValueNumbering.cpp updated: 1.7 -> 1.8 --- Log message: Remove dead variable --- Diffs of the changes: (+0 -1) Index: llvm/lib/Analysis/ValueNumbering.cpp diff -u llvm/lib/Analysis/ValueNumbering.cpp:1.7 llvm/lib/Analysis/ValueNumbering.cpp:1.8 --- llvm/lib/Analysis/ValueNumbering.cpp:1.7 Tue Nov 11 16:41:31 2003 +++ llvm/lib/Analysis/ValueNumbering.cpp Tue Nov 25 14:11:00 2003 @@ -180,7 +180,6 @@ void BVNImpl::visitGetElementPtrInst(GetElementPtrInst &I) { Value *Op = I.getOperand(0); - Function *F = I.getParent()->getParent(); for (Value::use_iterator UI = Op->use_begin(), UE = Op->use_end(); UI != UE; ++UI) From lattner at cs.uiuc.edu Tue Nov 25 14:12:09 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 14:12:09 2003 Subject: [llvm-commits] CVS: llvm/lib/Analysis/BasicAliasAnalysis.cpp Message-ID: <200311252011.OAA00699@zion.cs.uiuc.edu> Changes in directory llvm/lib/Analysis: BasicAliasAnalysis.cpp updated: 1.18 -> 1.19 --- Log message: Fix file header --- Diffs of the changes: (+1 -1) Index: llvm/lib/Analysis/BasicAliasAnalysis.cpp diff -u llvm/lib/Analysis/BasicAliasAnalysis.cpp:1.18 llvm/lib/Analysis/BasicAliasAnalysis.cpp:1.19 --- llvm/lib/Analysis/BasicAliasAnalysis.cpp:1.18 Tue Nov 25 14:10:07 2003 +++ llvm/lib/Analysis/BasicAliasAnalysis.cpp Tue Nov 25 14:11:47 2003 @@ -1,4 +1,4 @@ -//===- llvm/Analysis/BasicAliasAnalysis.h - Alias Analysis Impl -*- C++ -*-===// +//===- BasicAliasAnalysis.cpp - Local Alias Analysis Impl -----------------===// // // The LLVM Compiler Infrastructure // From lattner at cs.uiuc.edu Tue Nov 25 14:19:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 14:19:01 2003 Subject: [llvm-commits] CVS: llvm/include/llvm/Support/GetElementPtrTypeIterator.h Message-ID: <200311252017.OAA00888@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Support: GetElementPtrTypeIterator.h updated: 1.2 -> 1.3 --- Log message: Work with gepi's and constant exprs. Also, add versions of iterator ctors that take references --- Diffs of the changes: (+12 -5) Index: llvm/include/llvm/Support/GetElementPtrTypeIterator.h diff -u llvm/include/llvm/Support/GetElementPtrTypeIterator.h:1.2 llvm/include/llvm/Support/GetElementPtrTypeIterator.h:1.3 --- llvm/include/llvm/Support/GetElementPtrTypeIterator.h:1.2 Tue Nov 25 13:58:35 2003 +++ llvm/include/llvm/Support/GetElementPtrTypeIterator.h Tue Nov 25 14:17:49 2003 @@ -24,21 +24,21 @@ : public forward_iterator { typedef forward_iterator super; - GetElementPtrInst *TheGEP; + User *TheGEP; // Either GetElemenPtrInst or ConstantExpr const Type *CurTy; unsigned Operand; gep_type_iterator() {} public: - static gep_type_iterator begin(GetElementPtrInst *gep) { + static gep_type_iterator begin(User *gep) { gep_type_iterator I; I.TheGEP = gep; I.CurTy = gep->getOperand(0)->getType(); I.Operand = 1; return I; } - static gep_type_iterator end(GetElementPtrInst *gep) { + static gep_type_iterator end(User *gep) { gep_type_iterator I; I.TheGEP = gep; I.CurTy = 0; @@ -80,12 +80,19 @@ } }; - inline gep_type_iterator gep_type_begin(GetElementPtrInst *GEP) { + inline gep_type_iterator gep_type_begin(User *GEP) { return gep_type_iterator::begin(GEP); } - inline gep_type_iterator gep_type_end(GetElementPtrInst *GEP) { + inline gep_type_iterator gep_type_end(User *GEP) { return gep_type_iterator::end(GEP); + } + inline gep_type_iterator gep_type_begin(User &GEP) { + return gep_type_iterator::begin(&GEP); + } + + inline gep_type_iterator gep_type_end(User &GEP) { + return gep_type_iterator::end(&GEP); } } // end namespace llvm From lattner at cs.uiuc.edu Tue Nov 25 14:21:03 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 14:21:03 2003 Subject: [llvm-commits] CVS: llvm/lib/Analysis/DataStructure/Local.cpp Message-ID: <200311252020.OAA00975@zion.cs.uiuc.edu> Changes in directory llvm/lib/Analysis/DataStructure: Local.cpp updated: 1.73 -> 1.74 --- Log message: Do not depend on index type to determine whether it is a structure or sequential index --- Diffs of the changes: (+12 -11) Index: llvm/lib/Analysis/DataStructure/Local.cpp diff -u llvm/lib/Analysis/DataStructure/Local.cpp:1.73 llvm/lib/Analysis/DataStructure/Local.cpp:1.74 --- llvm/lib/Analysis/DataStructure/Local.cpp:1.73 Fri Nov 14 11:09:46 2003 +++ llvm/lib/Analysis/DataStructure/Local.cpp Tue Nov 25 14:19:55 2003 @@ -17,6 +17,7 @@ #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" #include "llvm/Instructions.h" +#include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/Support/InstVisitor.h" #include "llvm/Target/TargetData.h" #include "Support/CommandLine.h" @@ -366,12 +367,17 @@ // All of these subscripts are indexing INTO the elements we have... unsigned Offset = 0; - for (unsigned i = 2, e = GEP.getNumOperands(); i < e; ++i) - if (GEP.getOperand(i)->getType() == Type::LongTy) { - // Get the type indexing into... - const SequentialType *STy = cast(CurTy); - CurTy = STy->getElementType(); + for (gep_type_iterator I = gep_type_begin(GEP), E = gep_type_end(GEP); + I != E; ++I) + if (const StructType *STy = dyn_cast(*I)) { + unsigned FieldNo = cast(I.getOperand())->getValue(); + Offset += TD.getStructLayout(STy)->MemberOffsets[FieldNo]; + } + + #if 0 + if (const SequentialType *STy = cast(*I)) { + CurTy = STy->getElementType(); if (ConstantSInt *CS = dyn_cast(GEP.getOperand(i))) { Offset += CS->getValue()*TD.getTypeSize(CurTy); } else { @@ -394,13 +400,8 @@ N->mergeIndexes(RawOffset+j, RawOffset+i*ElSize+j); } } -#endif - } else if (GEP.getOperand(i)->getType() == Type::UByteTy) { - unsigned FieldNo = cast(GEP.getOperand(i))->getValue(); - const StructType *STy = cast(CurTy); - Offset += TD.getStructLayout(STy)->MemberOffsets[FieldNo]; - CurTy = STy->getContainedType(FieldNo); } +#endif // Add in the offset calculated... Value.setOffset(Value.getOffset()+Offset); From criswell at cs.uiuc.edu Tue Nov 25 14:37:01 2003 From: criswell at cs.uiuc.edu (John Criswell) Date: Tue Nov 25 14:37:01 2003 Subject: [llvm-commits] CVS: llvm/autoconf/configure.ac Message-ID: <200311252036.OAA23378@choi.cs.uiuc.edu> Changes in directory llvm/autoconf: configure.ac updated: 1.58 -> 1.59 --- Log message: Configure all project directories contained in llvm/projects. The autoconf program will generate a warning about how we should use a literal in AC_CONFIG_SUBDIRS. This warning can be ignored. --- Diffs of the changes: (+13 -26) Index: llvm/autoconf/configure.ac diff -u llvm/autoconf/configure.ac:1.58 llvm/autoconf/configure.ac:1.59 --- llvm/autoconf/configure.ac:1.58 Tue Nov 25 11:49:22 2003 +++ llvm/autoconf/configure.ac Tue Nov 25 14:36:46 2003 @@ -30,20 +30,19 @@ fi fi -if test -d ${srcdir}/projects/sample -then - AC_CONFIG_SUBDIRS(projects/sample) -fi - -if test -d ${srcdir}/projects/reopt -then - AC_CONFIG_SUBDIRS(projects/reopt) -fi - -if test -d ${srcdir}/projects/poolalloc -then - AC_CONFIG_SUBDIRS(projects/poolalloc) -fi +dnl +dnl Configure all of the projects present in our source tree. +dnl +for i in `ls ${srcdir}/projects` +do + if test ${i} != "CVS" + then + if test -d ${srcdir}/projects/${i} + then + AC_CONFIG_SUBDIRS(projects/${i}) + fi + fi +done dnl Configure a header file AC_CONFIG_HEADERS(include/Config/config.h) @@ -94,18 +93,6 @@ AC_CONFIG_MAKEFILE(tools/Makefile) AC_CONFIG_MAKEFILE(utils/Makefile) AC_CONFIG_MAKEFILE(projects/Makefile) -AC_CONFIG_MAKEFILE(projects/ModuleMaker/Makefile) -AC_CONFIG_MAKEFILE(projects/ModuleMaker/Makefile.common) -AC_CONFIG_MAKEFILE(projects/ModuleMaker/tools/Makefile) -AC_CONFIG_MAKEFILE(projects/ModuleMaker/tools/ModuleMaker/Makefile) -AC_CONFIG_MAKEFILE(projects/Stacker/Makefile) -AC_CONFIG_MAKEFILE(projects/Stacker/lib/Makefile) -AC_CONFIG_MAKEFILE(projects/Stacker/lib/compiler/Makefile) -AC_CONFIG_MAKEFILE(projects/Stacker/lib/runtime/Makefile) -AC_CONFIG_MAKEFILE(projects/Stacker/tools/Makefile) -AC_CONFIG_MAKEFILE(projects/Stacker/tools/stkrc/Makefile) -AC_CONFIG_MAKEFILE(projects/Stacker/test/Makefile) -AC_CONFIG_MAKEFILE(projects/Stacker/samples/Makefile) dnl ************************************************************************** dnl * Determine which system we are building on From criswell at cs.uiuc.edu Tue Nov 25 14:37:11 2003 From: criswell at cs.uiuc.edu (John Criswell) Date: Tue Nov 25 14:37:11 2003 Subject: [llvm-commits] CVS: llvm/configure Message-ID: <200311252036.OAA23371@choi.cs.uiuc.edu> Changes in directory llvm: configure updated: 1.58 -> 1.59 --- Log message: Configure all project directories contained in llvm/projects. The autoconf program will generate a warning about how we should use a literal in AC_CONFIG_SUBDIRS. This warning can be ignored. --- Diffs of the changes: (+39 -123) Index: llvm/configure diff -u llvm/configure:1.58 llvm/configure:1.59 --- llvm/configure:1.58 Tue Nov 25 11:49:21 2003 +++ llvm/configure Tue Nov 25 14:36:44 2003 @@ -426,9 +426,7 @@ PACKAGE_STRING='[LLVM] [1.0]' PACKAGE_BUGREPORT='llvmbugs at cs.uiuc.edu' -ac_subdirs_all="$ac_subdirs_all projects/sample" -ac_subdirs_all="$ac_subdirs_all projects/reopt" -ac_subdirs_all="$ac_subdirs_all projects/poolalloc" +ac_subdirs_all="$ac_subdirs_all projects/${i}" # Factoring default headers for most tests. ac_includes_default="\ #include @@ -1521,29 +1519,19 @@ fi fi -if test -d ${srcdir}/projects/sample -then - - -subdirs="$subdirs projects/sample" - -fi - -if test -d ${srcdir}/projects/reopt -then - - -subdirs="$subdirs projects/reopt" - -fi - -if test -d ${srcdir}/projects/poolalloc -then +for i in `ls ${srcdir}/projects` +do + if test ${i} != "CVS" + then + if test -d ${srcdir}/projects/${i} + then -subdirs="$subdirs projects/poolalloc" +subdirs="$subdirs projects/${i}" -fi + fi + fi +done ac_config_headers="$ac_config_headers include/Config/config.h" @@ -1688,42 +1676,6 @@ ac_config_commands="$ac_config_commands projects/Makefile" - ac_config_commands="$ac_config_commands projects/ModuleMaker/Makefile" - - - ac_config_commands="$ac_config_commands projects/ModuleMaker/Makefile.common" - - - ac_config_commands="$ac_config_commands projects/ModuleMaker/tools/Makefile" - - - ac_config_commands="$ac_config_commands projects/ModuleMaker/tools/ModuleMaker/Makefile" - - - ac_config_commands="$ac_config_commands projects/Stacker/Makefile" - - - ac_config_commands="$ac_config_commands projects/Stacker/lib/Makefile" - - - ac_config_commands="$ac_config_commands projects/Stacker/lib/compiler/Makefile" - - - ac_config_commands="$ac_config_commands projects/Stacker/lib/runtime/Makefile" - - - ac_config_commands="$ac_config_commands projects/Stacker/tools/Makefile" - - - ac_config_commands="$ac_config_commands projects/Stacker/tools/stkrc/Makefile" - - - ac_config_commands="$ac_config_commands projects/Stacker/test/Makefile" - - - ac_config_commands="$ac_config_commands projects/Stacker/samples/Makefile" - - # Find a good install program. We prefer a C program (faster), @@ -4090,7 +4042,7 @@ ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 4093 "configure"' > conftest.$ac_ext + echo '#line 4045 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -4931,7 +4883,7 @@ # Provide some information about the compiler. -echo "$as_me:4934:" \ +echo "$as_me:4886:" \ "checking for Fortran 77 compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 @@ -5940,11 +5892,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:5943: $lt_compile\"" >&5) + (eval echo "\"\$as_me:5895: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:5947: \$? = $ac_status" >&5 + echo "$as_me:5899: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -6172,11 +6124,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6175: $lt_compile\"" >&5) + (eval echo "\"\$as_me:6127: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:6179: \$? = $ac_status" >&5 + echo "$as_me:6131: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -6239,11 +6191,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6242: $lt_compile\"" >&5) + (eval echo "\"\$as_me:6194: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:6246: \$? = $ac_status" >&5 + echo "$as_me:6198: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -8251,7 +8203,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5) + (eval echo "\"\$as_me:10440: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:10492: \$? = $ac_status" >&5 + echo "$as_me:10444: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -10552,11 +10504,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:10555: $lt_compile\"" >&5) + (eval echo "\"\$as_me:10507: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:10559: \$? = $ac_status" >&5 + echo "$as_me:10511: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -11795,7 +11747,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5) + (eval echo "\"\$as_me:12670: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:12722: \$? = $ac_status" >&5 + echo "$as_me:12674: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -12782,11 +12734,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12785: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12737: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:12789: \$? = $ac_status" >&5 + echo "$as_me:12741: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -14726,11 +14678,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:14729: $lt_compile\"" >&5) + (eval echo "\"\$as_me:14681: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:14733: \$? = $ac_status" >&5 + echo "$as_me:14685: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -14958,11 +14910,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:14961: $lt_compile\"" >&5) + (eval echo "\"\$as_me:14913: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:14965: \$? = $ac_status" >&5 + echo "$as_me:14917: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -15025,11 +14977,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15028: $lt_compile\"" >&5) + (eval echo "\"\$as_me:14980: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:15032: \$? = $ac_status" >&5 + echo "$as_me:14984: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -17037,7 +16989,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} @@ -24197,18 +24125,6 @@ tools/Makefile ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/tools/Makefile tools/Makefile ;; utils/Makefile ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/utils/Makefile utils/Makefile ;; projects/Makefile ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/projects/Makefile projects/Makefile ;; - projects/ModuleMaker/Makefile ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/projects/ModuleMaker/Makefile projects/ModuleMaker/Makefile ;; - projects/ModuleMaker/Makefile.common ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/projects/ModuleMaker/Makefile.common projects/ModuleMaker/Makefile.common ;; - projects/ModuleMaker/tools/Makefile ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/projects/ModuleMaker/tools/Makefile projects/ModuleMaker/tools/Makefile ;; - projects/ModuleMaker/tools/ModuleMaker/Makefile ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/projects/ModuleMaker/tools/ModuleMaker/Makefile projects/ModuleMaker/tools/ModuleMaker/Makefile ;; - projects/Stacker/Makefile ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/projects/Stacker/Makefile projects/Stacker/Makefile ;; - projects/Stacker/lib/Makefile ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/projects/Stacker/lib/Makefile projects/Stacker/lib/Makefile ;; - projects/Stacker/lib/compiler/Makefile ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/projects/Stacker/lib/compiler/Makefile projects/Stacker/lib/compiler/Makefile ;; - projects/Stacker/lib/runtime/Makefile ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/projects/Stacker/lib/runtime/Makefile projects/Stacker/lib/runtime/Makefile ;; - projects/Stacker/tools/Makefile ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/projects/Stacker/tools/Makefile projects/Stacker/tools/Makefile ;; - projects/Stacker/tools/stkrc/Makefile ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/projects/Stacker/tools/stkrc/Makefile projects/Stacker/tools/stkrc/Makefile ;; - projects/Stacker/test/Makefile ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/projects/Stacker/test/Makefile projects/Stacker/test/Makefile ;; - projects/Stacker/samples/Makefile ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/projects/Stacker/samples/Makefile projects/Stacker/samples/Makefile ;; esac done _ACEOF From criswell at cs.uiuc.edu Tue Nov 25 14:38:01 2003 From: criswell at cs.uiuc.edu (John Criswell) Date: Tue Nov 25 14:38:01 2003 Subject: [llvm-commits] CVS: llvm/projects/Makefile Message-ID: <200311252037.OAA23395@choi.cs.uiuc.edu> Changes in directory llvm/projects: Makefile updated: 1.3 -> 1.4 --- Log message: Adjusted the projects Makefile so that it picks up the name of projects by scanning the source tree (not the object tree). --- Diffs of the changes: (+4 -2) Index: llvm/projects/Makefile diff -u llvm/projects/Makefile:1.3 llvm/projects/Makefile:1.4 --- llvm/projects/Makefile:1.3 Mon Oct 20 17:27:58 2003 +++ llvm/projects/Makefile Tue Nov 25 14:37:45 2003 @@ -8,7 +8,9 @@ ##===----------------------------------------------------------------------===## LEVEL=.. +include $(LEVEL)/Makefile.config + DIRS= -OPTIONAL_DIRS:=$(shell ls | grep -v CVS) +OPTIONAL_DIRS:=$(basename $(shell ls $(SourceDir) | grep -v CVS | grep -v Makefile)) -include $(LEVEL)/Makefile.common +include $(BUILD_SRC_ROOT)/Makefile.rules From lattner at cs.uiuc.edu Tue Nov 25 14:46:03 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 14:46:03 2003 Subject: [llvm-commits] CVS: llvm/lib/ExecutionEngine/Interpreter/Execution.cpp Interpreter.h Message-ID: <200311252045.OAA01155@zion.cs.uiuc.edu> Changes in directory llvm/lib/ExecutionEngine/Interpreter: Execution.cpp updated: 1.115 -> 1.116 Interpreter.h updated: 1.54 -> 1.55 --- Log message: Do not depend on structure elements being of type UByteTy --- Diffs of the changes: (+31 -22) Index: llvm/lib/ExecutionEngine/Interpreter/Execution.cpp diff -u llvm/lib/ExecutionEngine/Interpreter/Execution.cpp:1.115 llvm/lib/ExecutionEngine/Interpreter/Execution.cpp:1.116 --- llvm/lib/ExecutionEngine/Interpreter/Execution.cpp:1.115 Thu Nov 13 00:06:01 2003 +++ llvm/lib/ExecutionEngine/Interpreter/Execution.cpp Tue Nov 25 14:44:56 2003 @@ -15,16 +15,18 @@ #include "llvm/Instructions.h" #include "llvm/DerivedTypes.h" #include "llvm/Constants.h" +#include "llvm/Support/GetElementPtrTypeIterator.h" #include "Support/Statistic.h" #include // For fmod - -namespace llvm { +using namespace llvm; namespace { Statistic<> NumDynamicInsts("lli", "Number of dynamic instructions executed"); } -Interpreter *TheEE = 0; +namespace llvm { + Interpreter *TheEE = 0; +} //===----------------------------------------------------------------------===// // Value Manipulation code @@ -42,8 +44,8 @@ case Instruction::Cast: return executeCastOperation(CE->getOperand(0), CE->getType(), SF); case Instruction::GetElementPtr: - return TheEE->executeGEPOperation(CE->getOperand(0), CE->op_begin()+1, - CE->op_end(), SF); + return TheEE->executeGEPOperation(CE->getOperand(0), gep_type_begin(CE), + gep_type_end(CE), SF); case Instruction::Add: return executeAddInst(getOperandValue(CE->getOperand(0), SF), getOperandValue(CE->getOperand(1), SF), @@ -601,33 +603,41 @@ // getElementOffset - The workhorse for getelementptr. // -GenericValue Interpreter::executeGEPOperation(Value *Ptr, User::op_iterator I, - User::op_iterator E, +GenericValue Interpreter::executeGEPOperation(Value *Ptr, gep_type_iterator I, + gep_type_iterator E, ExecutionContext &SF) { assert(isa(Ptr->getType()) && "Cannot getElementOffset of a nonpointer type!"); PointerTy Total = 0; - const Type *Ty = Ptr->getType(); for (; I != E; ++I) { - if (const StructType *STy = dyn_cast(Ty)) { + if (const StructType *STy = dyn_cast(*I)) { const StructLayout *SLO = TD.getStructLayout(STy); // Indices must be ubyte constants... const ConstantUInt *CPU = cast(*I); - assert(CPU->getType() == Type::UByteTy); unsigned Index = CPU->getValue(); Total += SLO->MemberOffsets[Index]; - Ty = STy->getElementTypes()[Index]; - } else if (const SequentialType *ST = cast(Ty)) { + } else { + const SequentialType *ST = cast(*I); // Get the index number for the array... which must be long type... - assert((*I)->getType() == Type::LongTy); - unsigned Idx = getOperandValue(*I, SF).LongVal; - Ty = ST->getElementType(); - unsigned Size = TD.getTypeSize(Ty); - Total += Size*Idx; + GenericValue IdxGV = getOperandValue(I.getOperand(), SF); + + uint64_t Idx; + switch (I.getOperand()->getType()->getPrimitiveID()) { + default: assert(0 && "Illegal getelementptr index for sequential type!"); + case Type::SByteTyID: Idx = IdxGV.SByteVal; break; + case Type::ShortTyID: Idx = IdxGV.ShortVal; break; + case Type::IntTyID: Idx = IdxGV.IntVal; break; + case Type::LongTyID: Idx = IdxGV.LongVal; break; + case Type::UByteTyID: Idx = IdxGV.UByteVal; break; + case Type::UShortTyID: Idx = IdxGV.UShortVal; break; + case Type::UIntTyID: Idx = IdxGV.UIntVal; break; + case Type::ULongTyID: Idx = IdxGV.ULongVal; break; + } + Total += TD.getTypeSize(ST->getElementType())*Idx; } } @@ -639,7 +649,7 @@ void Interpreter::visitGetElementPtrInst(GetElementPtrInst &I) { ExecutionContext &SF = ECStack.back(); SetValue(&I, TheEE->executeGEPOperation(I.getPointerOperand(), - I.idx_begin(), I.idx_end(), SF), SF); + gep_type_begin(I), gep_type_end(I), SF), SF); } void Interpreter::visitLoadInst(LoadInst &I) { @@ -912,5 +922,3 @@ visit(I); // Dispatch to one of the visit* methods... } } - -} // End llvm namespace Index: llvm/lib/ExecutionEngine/Interpreter/Interpreter.h diff -u llvm/lib/ExecutionEngine/Interpreter/Interpreter.h:1.54 llvm/lib/ExecutionEngine/Interpreter/Interpreter.h:1.55 --- llvm/lib/ExecutionEngine/Interpreter/Interpreter.h:1.54 Thu Nov 13 00:06:01 2003 +++ llvm/lib/ExecutionEngine/Interpreter/Interpreter.h Tue Nov 25 14:44:56 2003 @@ -25,6 +25,7 @@ namespace llvm { struct FunctionInfo; // Defined in ExecutionAnnotations.h +class gep_type_iterator; // AllocaHolder - Object to track all of the blocks of memory allocated by // alloca. When the function returns, this object is poped off the execution @@ -152,8 +153,8 @@ //FIXME: private: public: - GenericValue executeGEPOperation(Value *Ptr, User::op_iterator I, - User::op_iterator E, ExecutionContext &SF); + GenericValue executeGEPOperation(Value *Ptr, gep_type_iterator I, + gep_type_iterator E, ExecutionContext &SF); private: // Helper functions // SwitchToNewBasicBlock - Start execution in a new basic block and run any From lattner at cs.uiuc.edu Tue Nov 25 14:51:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 14:51:01 2003 Subject: [llvm-commits] CVS: llvm/lib/CWriter/Writer.cpp Message-ID: <200311252050.OAA01264@zion.cs.uiuc.edu> Changes in directory llvm/lib/CWriter: Writer.cpp updated: 1.145 -> 1.146 --- Log message: Do not depend on the gep index types to determine what flavor of index it is --- Diffs of the changes: (+22 -18) Index: llvm/lib/CWriter/Writer.cpp diff -u llvm/lib/CWriter/Writer.cpp:1.145 llvm/lib/CWriter/Writer.cpp:1.146 --- llvm/lib/CWriter/Writer.cpp:1.145 Fri Nov 21 23:02:56 2003 +++ llvm/lib/CWriter/Writer.cpp Tue Nov 25 14:49:55 2003 @@ -21,9 +21,10 @@ #include "llvm/Intrinsics.h" #include "llvm/Analysis/FindUsedTypes.h" #include "llvm/Analysis/ConstantsScanner.h" +#include "llvm/Support/CallSite.h" +#include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/Support/InstVisitor.h" #include "llvm/Support/InstIterator.h" -#include "llvm/Support/CallSite.h" #include "llvm/Support/Mangler.h" #include "Support/StringExtras.h" #include "Support/STLExtras.h" @@ -160,8 +161,8 @@ } void printBranchToBlock(BasicBlock *CurBlock, BasicBlock *SuccBlock, unsigned Indent); - void printIndexingExpression(Value *Ptr, User::op_iterator I, - User::op_iterator E); + void printIndexingExpression(Value *Ptr, gep_type_iterator I, + gep_type_iterator E); }; // Pass the Type* and the variable name and this prints out the variable @@ -381,8 +382,8 @@ case Instruction::GetElementPtr: Out << "(&("; - printIndexingExpression(CE->getOperand(0), - CPV->op_begin()+1, CPV->op_end()); + printIndexingExpression(CE->getOperand(0), gep_type_begin(CPV), + gep_type_end(CPV)); Out << "))"; return; case Instruction::Add: @@ -1336,8 +1337,8 @@ Out << ")"; } -void CWriter::printIndexingExpression(Value *Ptr, User::op_iterator I, - User::op_iterator E) { +void CWriter::printIndexingExpression(Value *Ptr, gep_type_iterator I, + gep_type_iterator E) { bool HasImplicitAddress = false; // If accessing a global value with no indexing, avoid *(&GV) syndrome if (GlobalValue *V = dyn_cast(Ptr)) { @@ -1357,7 +1358,7 @@ return; } - const Constant *CI = dyn_cast(I); + const Constant *CI = dyn_cast(I.getOperand()); if (HasImplicitAddress && (!CI || !CI->isNullValue())) Out << "(&"; @@ -1373,22 +1374,24 @@ if (HasImplicitAddress) { ++I; - } else if (CI && CI->isNullValue() && I+1 != E) { + } else if (CI && CI->isNullValue()) { + gep_type_iterator TmpI = I; ++TmpI; + // Print out the -> operator if possible... - if ((*(I+1))->getType() == Type::UByteTy) { + if (TmpI != E && isa(*TmpI)) { Out << (HasImplicitAddress ? "." : "->"); - Out << "field" << cast(*(I+1))->getValue(); - I += 2; - } + Out << "field" << cast(I.getOperand())->getValue(); + I = ++TmpI; + } } for (; I != E; ++I) - if ((*I)->getType() == Type::LongTy) { + if (isa(*I)) { + Out << ".field" << cast(I.getOperand())->getValue(); + } else { Out << "["; - writeOperand(*I); + writeOperand(I.getOperand()); Out << "]"; - } else { - Out << ".field" << cast(*I)->getValue(); } } @@ -1406,7 +1409,8 @@ void CWriter::visitGetElementPtrInst(GetElementPtrInst &I) { Out << "&"; - printIndexingExpression(I.getPointerOperand(), I.idx_begin(), I.idx_end()); + printIndexingExpression(I.getPointerOperand(), gep_type_begin(I), + gep_type_end(I)); } void CWriter::visitVANextInst(VANextInst &I) { From lattner at cs.uiuc.edu Tue Nov 25 15:10:04 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 15:10:04 2003 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp Message-ID: <200311252109.PAA01409@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: ScalarReplAggregates.cpp updated: 1.18 -> 1.19 --- Log message: Do not use index type to determine what it is indexing into! --- Diffs of the changes: (+26 -26) Index: llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp diff -u llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp:1.18 llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp:1.19 --- llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp:1.18 Tue Nov 11 16:41:34 2003 +++ llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp Tue Nov 25 15:09:18 2003 @@ -26,6 +26,7 @@ #include "llvm/Pass.h" #include "llvm/iMemory.h" #include "llvm/Analysis/Dominators.h" +#include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/Target/TargetData.h" #include "llvm/Transforms/Utils/PromoteMemToReg.h" #include "Support/Debug.h" @@ -222,35 +223,34 @@ /// aggregate allocation. /// bool SROA::isSafeUseOfAllocation(Instruction *User) { - if (GetElementPtrInst *GEPI = dyn_cast(User)) { - // The GEP is safe to transform if it is of the form GEP , 0, - if (GEPI->getNumOperands() <= 2 || - GEPI->getOperand(1) != Constant::getNullValue(Type::LongTy) || - !isa(GEPI->getOperand(2)) || - isa(GEPI->getOperand(2))) - return false; + if (!isa(User)) return false; - // If this is a use of an array allocation, do a bit more checking for - // sanity. - if (GEPI->getOperand(2)->getType() == Type::LongTy) { - const PointerType *PTy =cast(GEPI->getOperand(0)->getType()); - const ArrayType *AT = cast(PTy->getElementType()); - int64_t NumElements = AT->getNumElements(); - - // Check to make sure that index falls within the array. If not, - // something funny is going on, so we won't do the optimization. - // - if (cast(GEPI->getOperand(2))->getValue() >= NumElements || - cast(GEPI->getOperand(2))->getValue() < 0) - return false; - } + GetElementPtrInst *GEPI = cast(User); + gep_type_iterator I = gep_type_begin(GEPI), E = gep_type_end(GEPI); - // If there are any non-simple uses of this getelementptr, make sure to - // reject them. - if (isSafeElementUse(GEPI)) - return true; + // The GEP is safe to transform if it is of the form GEP , 0, + if (I == E || + I.getOperand() != Constant::getNullValue(I.getOperand()->getType())) + return false; + + ++I; + if (I != E || !isa(I.getOperand())) + return false; + + // If this is a use of an array allocation, do a bit more checking for sanity. + if (const ArrayType *AT = dyn_cast(*I)) { + uint64_t NumElements = AT->getNumElements(); + + // Check to make sure that index falls within the array. If not, + // something funny is going on, so we won't do the optimization. + // + if (cast(GEPI->getOperand(2))->getRawValue() >= NumElements) + return false; } - return false; + + // If there are any non-simple uses of this getelementptr, make sure to reject + // them. + return isSafeElementUse(GEPI); } /// isSafeElementUse - Check to see if this use is an allowed use for a From lattner at cs.uiuc.edu Tue Nov 25 15:21:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 15:21:01 2003 Subject: [llvm-commits] CVS: llvm/include/llvm/DerivedTypes.h Message-ID: <200311252120.PAA01500@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm: DerivedTypes.h updated: 1.47 -> 1.48 --- Log message: It is legal to index into sequential types with any integer --- Diffs of the changes: (+1 -1) Index: llvm/include/llvm/DerivedTypes.h diff -u llvm/include/llvm/DerivedTypes.h:1.47 llvm/include/llvm/DerivedTypes.h:1.48 --- llvm/include/llvm/DerivedTypes.h:1.47 Tue Nov 11 16:41:29 2003 +++ llvm/include/llvm/DerivedTypes.h Tue Nov 25 15:20:19 2003 @@ -309,7 +309,7 @@ return ElementType.get(); } virtual bool indexValid(const Value *V) const { - return V->getType() == Type::LongTy; // Must be a 'long' index + return V->getType()->isInteger(); } // getIndexType() - Return the type required of indices for this composite. From lattner at cs.uiuc.edu Tue Nov 25 15:22:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 15:22:01 2003 Subject: [llvm-commits] CVS: llvm/lib/VMCore/ConstantHandling.cpp Type.cpp Message-ID: <200311252121.PAA01557@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: ConstantHandling.cpp updated: 1.41 -> 1.42 Type.cpp updated: 1.83 -> 1.84 --- Log message: Relax constrains on GEP type indexes --- Diffs of the changes: (+16 -10) Index: llvm/lib/VMCore/ConstantHandling.cpp diff -u llvm/lib/VMCore/ConstantHandling.cpp:1.41 llvm/lib/VMCore/ConstantHandling.cpp:1.42 --- llvm/lib/VMCore/ConstantHandling.cpp:1.41 Mon Nov 17 14:19:35 2003 +++ llvm/lib/VMCore/ConstantHandling.cpp Tue Nov 25 15:21:46 2003 @@ -15,6 +15,7 @@ #include "llvm/iPHINode.h" #include "llvm/InstrTypes.h" #include "llvm/DerivedTypes.h" +#include "llvm/Support/GetElementPtrTypeIterator.h" #include using namespace llvm; @@ -159,22 +160,29 @@ // TODO If C is null and all idx's are null, return null of the right type. - if (const ConstantExpr *CE = dyn_cast(C)) { + if (ConstantExpr *CE = dyn_cast(const_cast(C))) { // Combine Indices - If the source pointer to this getelementptr instruction // is a getelementptr instruction, combine the indices of the two // getelementptr instructions into a single instruction. // if (CE->getOpcode() == Instruction::GetElementPtr) { - if (CE->getOperand(CE->getNumOperands()-1)->getType() == Type::LongTy) { + const Type *LastTy = 0; + for (gep_type_iterator I = gep_type_begin(CE), E = gep_type_end(CE); + I != E; ++I) + LastTy = *I; + + if (LastTy && isa(LastTy)) { std::vector NewIndices; NewIndices.reserve(IdxList.size() + CE->getNumOperands()); for (unsigned i = 1, e = CE->getNumOperands()-1; i != e; ++i) NewIndices.push_back(cast(CE->getOperand(i))); // Add the last index of the source with the first index of the new GEP. + // Make sure to handle the case when they are actually different types. Constant *Combined = - ConstantExpr::get(Instruction::Add, IdxList[0], - CE->getOperand(CE->getNumOperands()-1)); + ConstantExpr::get(Instruction::Add, + ConstantExpr::getCast(IdxList[0], Type::LongTy), + ConstantExpr::getCast(CE->getOperand(CE->getNumOperands()-1), Type::LongTy)); NewIndices.push_back(Combined); NewIndices.insert(NewIndices.end(), IdxList.begin()+1, IdxList.end()); Index: llvm/lib/VMCore/Type.cpp diff -u llvm/lib/VMCore/Type.cpp:1.83 llvm/lib/VMCore/Type.cpp:1.84 --- llvm/lib/VMCore/Type.cpp:1.83 Wed Nov 19 13:20:20 2003 +++ llvm/lib/VMCore/Type.cpp Tue Nov 25 15:21:46 2003 @@ -261,10 +261,10 @@ bool StructType::indexValid(const Value *V) const { - if (!isa(V)) return false; - if (V->getType() != Type::UByteTy) return false; - unsigned Idx = cast(V)->getValue(); - return Idx < ETypes.size(); + // Structure indexes require unsigned integer constants. + if (ConstantUInt *CU = dyn_cast(V)) + return CU->getValue() < ETypes.size(); + return false; } // getTypeAtIndex - Given an index value into the type, return the type of the @@ -272,11 +272,9 @@ // const Type *StructType::getTypeAtIndex(const Value *V) const { assert(isa(V) && "Structure index must be a constant!!"); - assert(V->getType() == Type::UByteTy && "Structure index must be ubyte!"); unsigned Idx = cast(V)->getValue(); assert(Idx < ETypes.size() && "Structure index out of range!"); assert(indexValid(V) && "Invalid structure index!"); // Duplicate check - return ETypes[Idx]; } From lattner at cs.uiuc.edu Tue Nov 25 15:29:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 15:29:01 2003 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Type.cpp Message-ID: <200311252128.PAA13659@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: Type.cpp updated: 1.84 -> 1.85 --- Log message: Fix const correctness --- Diffs of the changes: (+1 -1) Index: llvm/lib/VMCore/Type.cpp diff -u llvm/lib/VMCore/Type.cpp:1.84 llvm/lib/VMCore/Type.cpp:1.85 --- llvm/lib/VMCore/Type.cpp:1.84 Tue Nov 25 15:21:46 2003 +++ llvm/lib/VMCore/Type.cpp Tue Nov 25 15:28:00 2003 @@ -262,7 +262,7 @@ bool StructType::indexValid(const Value *V) const { // Structure indexes require unsigned integer constants. - if (ConstantUInt *CU = dyn_cast(V)) + if (const ConstantUInt *CU = dyn_cast(V)) return CU->getValue() < ETypes.size(); return false; } From criswell at cs.uiuc.edu Tue Nov 25 15:46:01 2003 From: criswell at cs.uiuc.edu (John Criswell) Date: Tue Nov 25 15:46:01 2003 Subject: [llvm-commits] CVS: llvm/docs/LangRef.html Message-ID: <200311252145.PAA19843@choi.cs.uiuc.edu> Changes in directory llvm/docs: LangRef.html updated: 1.41 -> 1.42 --- Log message: Fixed a small grammatical error. Explained that function return types cannot be aggregate types. Explained that functions with the same name but different type signatures are considered to be different functions. --- Diffs of the changes: (+11 -2) Index: llvm/docs/LangRef.html diff -u llvm/docs/LangRef.html:1.41 llvm/docs/LangRef.html:1.42 --- llvm/docs/LangRef.html:1.41 Mon Nov 24 19:02:51 2003 +++ llvm/docs/LangRef.html Tue Nov 25 15:45:46 2003 @@ -407,9 +407,12 @@
      Overview:

      The function type can be thought of as a function signature. It consists of a return type and a list of formal parameter types. -Function types are usually used when to build virtual function tables +Function types are usually used to build virtual function tables (which are structures of pointers to functions), for indirect function calls, and when defining a function.

      +

      +The return type of a function type cannot be an aggregate type. +

      Syntax:
        <returntype> (<parameter list>)

      Where '<parameter list>' is a comma-separated list of @@ -638,6 +641,12 @@ to have predecessor basic blocks (i.e. there can not be any branches to the entry block of a function). Because the block can have no predecessors, it also cannot have any PHI nodes.

      +

      +LLVM functions are identified by their name and type signature. Hence, two +functions with the same name but different parameter lists or return values +are considered different functions, and LLVM will resolves references to each +appropriately. +

      @@ -1683,6 +1692,6 @@ +Last modified: $Date: 2003/11/25 21:45:46 $ From criswell at cs.uiuc.edu Tue Nov 25 16:06:01 2003 From: criswell at cs.uiuc.edu (John Criswell) Date: Tue Nov 25 16:06:01 2003 Subject: [llvm-commits] CVS: llvm/test/QMTest/llvm.py Message-ID: <200311252205.QAA27465@choi.cs.uiuc.edu> Changes in directory llvm/test/QMTest: llvm.py updated: 1.24 -> 1.25 --- Log message: Improved some of the test failure reporting. --- Diffs of the changes: (+11 -6) Index: llvm/test/QMTest/llvm.py diff -u llvm/test/QMTest/llvm.py:1.24 llvm/test/QMTest/llvm.py:1.25 --- llvm/test/QMTest/llvm.py:1.24 Thu Nov 20 19:13:36 2003 +++ llvm/test/QMTest/llvm.py Tue Nov 25 16:05:45 2003 @@ -619,32 +619,36 @@ # Assemble the file. # if (ExecProgram ((as, input, '-f', '-o', bc1))): - result.Fail () + result.Fail ('Failed to assemble ' + input) + return # # Disassemble the output. # if (ExecProgram ((dis, bc1, '-f', '-o', ll1))): - result.Fail() + result.Fail('Failed to disassemble ' + bc1) + return # # Assemble the program again. # if (ExecProgram ((as, ll1, '-f', '-o', bc2))): - result.Fail() + result.Fail('Failed to assemble ' + ll1) + return # # Disassemble the program one last time. # if (ExecProgram ((dis, bc2, '-f', '-o', ll2))): - result.Fail() + result.Fail('Failed to disassemble ' + bc2) + return # # Compare the LLVM assembly output to see if it is the same. # exit_status = filecmp.cmp (ll1, ll2, 'false') if exit_status == 0: - result.Fail() + result.Fail(ll1 + ' and ' + ll2 + ' differ') return # @@ -772,13 +776,14 @@ # Construct the pathnames to the various utilities. # as = buildroot + '/tools/' + context['buildtype'] + '/llvm-as' - lli = buildroot + '/tools/' + context['buildtype'] + '/lli -force-interpreter=false ' + lli = buildroot + '/tools/' + context['buildtype'] + '/lli' # # Assemble the program. # if (ExecProgram ((as, '-f', '-o', bcfile, srcfile))): result.Fail('Failed to assemble LLVM code') + return # # Execute the program. From criswell at cs.uiuc.edu Tue Nov 25 16:42:01 2003 From: criswell at cs.uiuc.edu (John Criswell) Date: Tue Nov 25 16:42:01 2003 Subject: [llvm-commits] CVS: llvm/test/QMTest/expectations.linux.qmr Message-ID: <200311252241.QAA31658@choi.cs.uiuc.edu> Changes in directory llvm/test/QMTest: expectations.linux.qmr updated: 1.1 -> 1.2 --- Log message: Added the following tests to the list that passes: Feature.mc.constexpr Regression.C++Frontend.2003-08-28-ForwardType Regression.CFrontend.2003-08-30-LargeIntegerBitfieldMember Regression.Transforms.IndVarsSimplify.2003-09-23-NotAtTop Regression.Transforms.Inline.alloca_test Regression.Transforms.LICM.2003-08-04-TrappingInstHoist Regression.Transforms.LICM.2003-08-04-TrappingInstOkHoist --- Diffs of the changes: (+1 -1) Index: llvm/test/QMTest/expectations.linux.qmr diff -u llvm/test/QMTest/expectations.linux.qmr:1.1 llvm/test/QMTest/expectations.linux.qmr:1.2 --- llvm/test/QMTest/expectations.linux.qmr:1.1 Wed Nov 19 15:13:26 2003 +++ llvm/test/QMTest/expectations.linux.qmr Tue Nov 25 16:41:35 2003 @@ -3,13 +3,13 @@ qoq}q(U _Result__kindqUtestqU_Result__outcomeqUPASSqU_Result__annotationsq}U _Result__idq U0Regression.Assembler.2002-08-16-ConstExprInlinedq U_Result__contextq (cqm.test.context Context -q o}q (U_Context__propertiesq}U_Context__temporariesq}ubub.(hoq}q(hhhhh}h U(Regression.Transforms.PruneEH.simpletestqh (h o}q(h}h}ubub.(hoq}q(hhhhh}h U/Regression.CBackend.2002-08-19-HardConstantExprqh (h o}q(h}h}ubub.(hoq}q(hhhhh}h URegression.Jello.test-shiftqh (h o}q(h}h}ubub.(hoq}q(hhhUFAILqh}h U.Regression.Transforms.CorrelatedExprs.looptestqh (h o}q (h}h}ubub.(hoq!}q"(hhhhh}h U-Regression.Linker.2003-08-23-GlobalVarLinkingq#h (h o}q$(h}h}ubub.(hoq%}q&(hhhhh}h U?Regression.Transforms.Inline.2003-09-22-PHINodesInExceptionDestq'h (h o}q((h}h}ubub.(hoq)}q*(hhhhh}h U,Regression.CFrontend.2003-02-12-NonlocalGotoq+h (h o}q,(h}h}ubub.(hoq-}q.(hhhhh}h U2Regression.Transforms.FunctionResolve.retmismatch1q/h (h o}q0(h}h}ubub.(hoq1}q2(hhhhh}h U2Regression.Assembler.2002-01-24-ValueRefineAbsTypeq3h (h o}q4(h}h}ubub.(hoq5}q6(hhhhh}h U8Regression.Transforms.ADCE.2003-01-22-PredecessorP! roblemq7h (h o}q8(h}h}ubub.(hoq9}q:(hhhhh}h U=Regression.Transforms.LevelRaise.2002-10-08-VarArgCallInfLoopq;h (h o}q<(h}h}ubub.(hoq=}q>(hhhhh}h U5Regression.CFrontend.2003-07-22-ArrayAccessTypeSafetyq?h (h o}q@(h}h}ubub.(hoqA}qB(hhhhh}h U8Regression.C++Frontend.2003-09-29-ArgumentNumberMismatchqCh (h o}qD(h}h}ubub.(hoqE}qF(hhhhh}h U+Regression.CFrontend.2002-09-19-StarInLabelqGh (h o}qH(h}h}ubub.(hoqI}qJ(hhhhh}h U.Regression.CFrontend.2003-08-23-LocalUnionTestqKh (h o}qL(h}h}ubub.(hoqM}qN(hhhhh}h U-Regression.C++Frontend.2003-08-28-SaveExprBugqOh (h o}qP(h}h}ubub.(hoqQ}qR(hhhhh}h U"Regression.Jello.2003-06-05-PHIBugqSh (h o}qT(h}h}ubub.(hoqU}qV(hhhhh}h U/Regression.Linker.2003-04-26-NullPtrLinkProblemqWh (h o}qX(h}h}ubub.(hoqY}qZ(hhhhh}h U)Regression.Transforms.Reassociate.subtestq[h (h o}q\(h}h}ubub.(hoq]}q^(hhhhh}h U)Regression.Linker.2002-08-20-ConstantExprq_h (h o}q`(h}h}ubub.(hoqa}qb(h! hhhh}h U=Regression.Transforms.Reassociate.2002-05-15-AgressiveSub Moveqch (h o}qd(h}h}ubub.(hoqe}qf(hhhhh}h UARegression.Transforms.CorrelatedExprs.2002-10-07-DominatorProblemqgh (h o}qh(h}h}ubub.(hoqi}qj(hhhhh}h U>Regression.Transforms.InstCombine.2003-06-22-ConstantExprCrashqkh (h o}ql(h}h}ubub.(hoqm}qn(hhhhh}h U3Regression.Transforms.PiNodeInserter.substitutetestqoh (h o}qp(h}h}ubub.(hoqq}qr(hhhhh}h U4Regression.Transforms.SCCP.2003-08-26-InvokeHandlingqsh (h o}qt(h}h}ubub.(hoqu}qv(hhhhh}h U$Regression.Jello.2003-01-04-LoopTestqwh (h o}qx(h}h}ubub.(hoqy}qz(hhhhh}h U1Regression.Assembler.2002-04-04-PureVirtMethCall2q{h (h o}q|(h}h}ubub.(hoq}}q~(hhhhh}h U)Regression.CFrontend.2002-07-14-MiscTestsqh (h o}q?(h}h}ubub.(hoq?}q?(hhhhh}h U(hhhhh}h U8Regression.C++Frontend.2003-09-29-ArgumentNumberMismatchq?h (h o}q@(h}h}ubub.(hoqA}qB(hhhhh}h U+Regression.CFrontend.2002-09-19-StarInLabelqCh (h o}qD(h}h}ubub.(hoqE}qF(hhhhh}h U.Regression.CFrontend.2003-08-23-LocalUnionTestqGh (h o}qH(h}h}ubub.(hoqI}qJ(hhhhh}h U-Regression.C++Frontend.2003-08-28-SaveExprBugqKh (h o}qL(h}h}ubub.(hoqM}qN(hhhhh}h U"Regression.Jello.2003-06-05-PHIBugqOh (h o}qP(h}h}ubub.(hoqQ}qR(hhhhh}h U/Regression.Linker.2003-04-26-NullPtrLinkProblemqSh (h o}qT(h}h}ubub.(hoqU}qV(hhhhh}h U)Regression.Transforms.Reassociate.subtestqWh (h o}qX(h}h}ubub.(hoqY}qZ(hhhhh}h U)Regression.Linker.2002-08-20-ConstantExprq[h (h o}q\(h}h}ubub.(hoq]}q^(hhhhh}h U=Regression.Transforms.Reassociate.2002-05-15-AgressiveSubMoveq_h (h o}q`(h}h}ubub.(! hoqa}qb(hhhhh}h UARegression.Transforms.CorrelatedExprs.2002-10- 07-DominatorProblemqch (h o}qd(h}h}ubub.(hoqe}qf(hhhhh}h U3Regression.Transforms.PiNodeInserter.substitutetestqgh (h o}qh(h}h}ubub.(hoqi}qj(hhhhh}h U4Regression.Transforms.SCCP.2003-08-26-InvokeHandlingqkh (h o}ql(h}h}ubub.(hoqm}qn(hhhhh}h U$Regression.Jello.2003-01-04-LoopTestqoh (h o}qp(h}h}ubub.(hoqq}qr(hhhhh}h U1Regression.Assembler.2002-04-04-PureVirtMethCall2qsh (h o}qt(h}h}ubub.(hoqu}qv(hhhhh}h U)Regression.CFrontend.2002-07-14-MiscTestsqwh (h o}qx(h}h}ubub.(hoqy}qz(hhhhh}h U Changes in directory llvm/lib/CWriter: Writer.cpp updated: 1.146 -> 1.147 --- Log message: Fix bug in previous checkin --- Diffs of the changes: (+1 -1) Index: llvm/lib/CWriter/Writer.cpp diff -u llvm/lib/CWriter/Writer.cpp:1.146 llvm/lib/CWriter/Writer.cpp:1.147 --- llvm/lib/CWriter/Writer.cpp:1.146 Tue Nov 25 14:49:55 2003 +++ llvm/lib/CWriter/Writer.cpp Tue Nov 25 17:44:40 2003 @@ -1380,7 +1380,7 @@ // Print out the -> operator if possible... if (TmpI != E && isa(*TmpI)) { Out << (HasImplicitAddress ? "." : "->"); - Out << "field" << cast(I.getOperand())->getValue(); + Out << "field" << cast(TmpI.getOperand())->getValue(); I = ++TmpI; } } From lattner at cs.uiuc.edu Tue Nov 25 18:10:02 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 18:10:02 2003 Subject: [llvm-commits] CVS: llvm/lib/CWriter/Writer.cpp Message-ID: <200311260009.SAA32428@zion.cs.uiuc.edu> Changes in directory llvm/lib/CWriter: Writer.cpp updated: 1.147 -> 1.148 --- Log message: output foo(void) as appropriate --- Diffs of the changes: (+2 -0) Index: llvm/lib/CWriter/Writer.cpp diff -u llvm/lib/CWriter/Writer.cpp:1.147 llvm/lib/CWriter/Writer.cpp:1.148 --- llvm/lib/CWriter/Writer.cpp:1.147 Tue Nov 25 17:44:40 2003 +++ llvm/lib/CWriter/Writer.cpp Tue Nov 25 18:09:17 2003 @@ -941,6 +941,8 @@ if (FT->isVarArg() && !FT->getParamTypes().empty()) { if (FT->getParamTypes().size()) FunctionInnards << ", "; FunctionInnards << "..."; // Output varargs portion of signature! + } else if (!FT->isVarArg() && FT->getParamTypes().empty()) { + FunctionInnards << "void"; // ret() -> ret(void) in C. } FunctionInnards << ")"; // Print out the return type and the entire signature for that matter From lattner at cs.uiuc.edu Tue Nov 25 19:20:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 19:20:01 2003 Subject: [llvm-commits] CVS: llvm-www/releases/1.0/docs/ReleaseNotes.html Message-ID: <200311260119.TAA02688@zion.cs.uiuc.edu> Changes in directory llvm-www/releases/1.0/docs: ReleaseNotes.html updated: 1.44 -> 1.45 --- Log message: More found boogs --- Diffs of the changes: (+3 -0) Index: llvm-www/releases/1.0/docs/ReleaseNotes.html diff -u llvm-www/releases/1.0/docs/ReleaseNotes.html:1.44 llvm-www/releases/1.0/docs/ReleaseNotes.html:1.45 --- llvm-www/releases/1.0/docs/ReleaseNotes.html:1.44 Tue Nov 25 02:50:08 2003 +++ llvm-www/releases/1.0/docs/ReleaseNotes.html Tue Nov 25 19:19:01 2003 @@ -274,6 +274,8 @@
    • [llvm-gcc] Illegal union field reference
    • +

    • [llvm-gcc] crash on union initialization
    • +

    Notes:Notes:

      From lattner at cs.uiuc.edu Tue Nov 25 19:20:12 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 19:20:12 2003 Subject: [llvm-commits] CVS: llvm/docs/ReleaseNotes.html Message-ID: <200311260118.TAA02506@zion.cs.uiuc.edu> Changes in directory llvm/docs: ReleaseNotes.html updated: 1.63 -> 1.64 --- Log message: More dead boogers --- Diffs of the changes: (+3 -1) Index: llvm/docs/ReleaseNotes.html diff -u llvm/docs/ReleaseNotes.html:1.63 llvm/docs/ReleaseNotes.html:1.64 --- llvm/docs/ReleaseNotes.html:1.63 Tue Nov 25 02:49:12 2003 +++ llvm/docs/ReleaseNotes.html Tue Nov 25 19:18:49 2003 @@ -182,6 +182,8 @@

    • [llvm-gcc] Complex division is not supported
    • [llvm-gcc] Illegal union field reference
    • [llvmg++] Front-end attempts to return structure by value
    • +
    • [llvmg++] Pointer to member initializers not supported in constructors
    • +
    • [llvm-gcc] crash on union initialization
    • At this time, LLVM is known to work properly with SPEC CPU 2000 (X86 only), @@ -590,7 +592,7 @@ src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!" /> The LLVM Compiler Infrastructure
      - Last modified: $Date: 2003/11/25 08:49:12 $ + Last modified: $Date: 2003/11/26 01:18:49 $ From lattner at cs.uiuc.edu Tue Nov 25 20:43:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 20:43:01 2003 Subject: [llvm-commits] CVS: llvm/test/Programs/SingleSource/Regression/C++/EH/ConditionalExpr.cpp Message-ID: <200311260242.UAA03537@zion.cs.uiuc.edu> Changes in directory llvm/test/Programs/SingleSource/Regression/C++/EH: ConditionalExpr.cpp added (r1.1) --- Log message: Testcase for PR124 --- Diffs of the changes: (+27 -0) Index: llvm/test/Programs/SingleSource/Regression/C++/EH/ConditionalExpr.cpp diff -c /dev/null llvm/test/Programs/SingleSource/Regression/C++/EH/ConditionalExpr.cpp:1.1 *** /dev/null Tue Nov 25 20:42:51 2003 --- llvm/test/Programs/SingleSource/Regression/C++/EH/ConditionalExpr.cpp Tue Nov 25 20:42:41 2003 *************** *** 0 **** --- 1,27 ---- + #include + + static int X = 0; + + struct T { + int V; + T() : V(++X) { printf("Construct %d\n", V); } + T(const T &) : V(++X) { printf("Copy Construct %d\n", V); } + ~T() { printf("Destruct %d\n", V); } + + void operator=(const T &t) { + printf("Overwrite %d with %d\n", V, t.V); + V = t.V; + } + }; + + T func(const T &t) { return T(); } + + T test(bool C) { + return C ? T() : func(T()); + } + + int main() { + T x; + x = test(true); + return 0; + } From lattner at cs.uiuc.edu Tue Nov 25 20:49:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 20:49:01 2003 Subject: [llvm-commits] CVS: llvm-www/releases/1.0/docs/ReleaseNotes.html Message-ID: <200311260248.UAA05018@zion.cs.uiuc.edu> Changes in directory llvm-www/releases/1.0/docs: ReleaseNotes.html updated: 1.45 -> 1.46 --- Log message: boog --- Diffs of the changes: (+2 -0) Index: llvm-www/releases/1.0/docs/ReleaseNotes.html diff -u llvm-www/releases/1.0/docs/ReleaseNotes.html:1.45 llvm-www/releases/1.0/docs/ReleaseNotes.html:1.46 --- llvm-www/releases/1.0/docs/ReleaseNotes.html:1.45 Tue Nov 25 19:19:01 2003 +++ llvm-www/releases/1.0/docs/ReleaseNotes.html Tue Nov 25 20:48:09 2003 @@ -433,6 +433,8 @@

    • [llvmg++] Pointer to member initializers not supported in constructors
    • +

    • [llvmg++] ?: expressions do not run correct number of destructors!
    • +

    Notes:

    • The C++ front-end is based on a pre-release of the GCC 3.4 C++ parser. This From lattner at cs.uiuc.edu Tue Nov 25 20:49:10 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue Nov 25 20:49:10 2003 Subject: [llvm-commits] CVS: llvm/docs/ReleaseNotes.html Message-ID: <200311260248.UAA04822@zion.cs.uiuc.edu> Changes in directory llvm/docs: ReleaseNotes.html updated: 1.64 -> 1.65 --- Log message: Boogs --- Diffs of the changes: (+2 -1) Index: llvm/docs/ReleaseNotes.html diff -u llvm/docs/ReleaseNotes.html:1.64 llvm/docs/ReleaseNotes.html:1.65 --- llvm/docs/ReleaseNotes.html:1.64 Tue Nov 25 19:18:49 2003 +++ llvm/docs/ReleaseNotes.html Tue Nov 25 20:48:00 2003 @@ -184,6 +184,7 @@
    • [llvmg++] Front-end attempts to return structure by value
    • [llvmg++] Pointer to member initializers not supported in constructors
    • [llvm-gcc] crash on union initialization
    • +
    • [llvm-g++] ?: expressions do not run correct number of destructors!
    • At this time, LLVM is known to work properly with SPEC CPU 2000 (X86 only), @@ -592,7 +593,7 @@ src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!" /> The LLVM Compiler Infrastructure
      - Last modified: $Date: 2003/11/26 01:18:49 $ + Last modified: $Date: 2003/11/26 02:48:00 $ From lattner at cs.uiuc.edu Wed Nov 26 01:26:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed Nov 26 01:26:01 2003 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.y Message-ID: <200311260725.BAA15345@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: llvmAsmParser.y updated: 1.142 -> 1.143 --- Log message: To not barf when an error occurs. --- Diffs of the changes: (+9 -9) Index: llvm/lib/AsmParser/llvmAsmParser.y diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.142 llvm/lib/AsmParser/llvmAsmParser.y:1.143 --- llvm/lib/AsmParser/llvmAsmParser.y:1.142 Mon Nov 24 21:54:16 2003 +++ llvm/lib/AsmParser/llvmAsmParser.y Wed Nov 26 01:24:58 2003 @@ -554,10 +554,6 @@ } } - // Clear the symbol table so it doesn't complain when it - // gets destructed - CurFun.LocalSymtab.clear(); - ThrowException("Redefinition of value named '" + Name + "' in the '" + V->getType()->getDescription() + "' type plane!"); } @@ -572,10 +568,6 @@ // If it already exists if (Existing) { - // Clear the symbol table so it doesn't complain when it - // gets destructed - CurFun.LocalSymtab.clear(); - // Bail ThrowException("Redefinition of value named '" + Name + "' in the '" + V->getType()->getDescription() + "' type plane!"); @@ -646,7 +638,15 @@ // Allocate a new module to read CurModule.CurrentModule = new Module(Filename); - yyparse(); // Parse the file. + + try { + yyparse(); // Parse the file. + } catch (...) { + // Clear the symbol table so it doesn't complain when it + // gets destructed + CurFun.LocalSymtab.clear(); + throw; + } Module *Result = ParserResult; From lattner at cs.uiuc.edu Wed Nov 26 01:37:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed Nov 26 01:37:01 2003 Subject: [llvm-commits] CVS: llvm/test/Regression/CFrontend/2003-11-26-PointerShift.c Message-ID: <200311260736.BAA15381@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CFrontend: 2003-11-26-PointerShift.c added (r1.1) --- Log message: Testcase for PR157 --- Diffs of the changes: (+4 -0) Index: llvm/test/Regression/CFrontend/2003-11-26-PointerShift.c diff -c /dev/null llvm/test/Regression/CFrontend/2003-11-26-PointerShift.c:1.1 *** /dev/null Wed Nov 26 01:36:03 2003 --- llvm/test/Regression/CFrontend/2003-11-26-PointerShift.c Wed Nov 26 01:35:52 2003 *************** *** 0 **** --- 1,4 ---- + unsigned long do_csum(const unsigned char *buff, int len, unsigned long result) { + if (2 & (unsigned long) buff) result += 1; + return result; + } From lattner at cs.uiuc.edu Wed Nov 26 02:21:02 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed Nov 26 02:21:02 2003 Subject: [llvm-commits] CVS: llvm-www/releases/1.0/docs/ReleaseNotes.html Message-ID: <200311260820.CAA24634@zion.cs.uiuc.edu> Changes in directory llvm-www/releases/1.0/docs: ReleaseNotes.html updated: 1.46 -> 1.47 --- Log message: dye bugz die! --- Diffs of the changes: (+1 -0) Index: llvm-www/releases/1.0/docs/ReleaseNotes.html diff -u llvm-www/releases/1.0/docs/ReleaseNotes.html:1.46 llvm-www/releases/1.0/docs/ReleaseNotes.html:1.47 --- llvm-www/releases/1.0/docs/ReleaseNotes.html:1.46 Tue Nov 25 20:48:09 2003 +++ llvm-www/releases/1.0/docs/ReleaseNotes.html Wed Nov 26 02:20:49 2003 @@ -276,6 +276,7 @@

    • [llvm-gcc] crash on union initialization
    • +

    • [llvm-gcc] Pointer & constant results in invalid shift
    Notes:

      From lattner at cs.uiuc.edu Wed Nov 26 02:21:13 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed Nov 26 02:21:13 2003 Subject: [llvm-commits] CVS: llvm/docs/ReleaseNotes.html Message-ID: <200311260820.CAA24446@zion.cs.uiuc.edu> Changes in directory llvm/docs: ReleaseNotes.html updated: 1.65 -> 1.66 --- Log message: Bugz die! --- Diffs of the changes: (+5 -2) Index: llvm/docs/ReleaseNotes.html diff -u llvm/docs/ReleaseNotes.html:1.65 llvm/docs/ReleaseNotes.html:1.66 --- llvm/docs/ReleaseNotes.html:1.65 Tue Nov 25 20:48:00 2003 +++ llvm/docs/ReleaseNotes.html Wed Nov 26 02:20:34 2003 @@ -125,6 +125,8 @@

    • Methods and functions in anonymous namespaces now get internal linkage.
    • +
    • Constant initializers now generate loops instead of potentially huge amounts of straight-line code.
    • +

      In this release, the following bugs in the previous release were fixed:

      @@ -178,13 +180,14 @@
    • crash assigning into an array in a struct which contains a bitfield.
    • Oversized integer bitfields cause crash
    • gccld produces a runner script that includes command-line options to load the necessary shared objects
    • -
    • [llvm-gcc] Bitfields & large array don't mix well
    • +
    • [llvm-gcc] Bitfields & large array don't mix well
    • [llvm-gcc] Complex division is not supported
    • [llvm-gcc] Illegal union field reference
    • [llvmg++] Front-end attempts to return structure by value
    • [llvmg++] Pointer to member initializers not supported in constructors
    • [llvm-gcc] crash on union initialization
    • [llvm-g++] ?: expressions do not run correct number of destructors!
    • +
    • [llvm-gcc] Pointer & constant results in invalid shift
    • At this time, LLVM is known to work properly with SPEC CPU 2000 (X86 only), @@ -593,7 +596,7 @@ src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!" /> The LLVM Compiler Infrastructure
      - Last modified: $Date: 2003/11/26 02:48:00 $ + Last modified: $Date: 2003/11/26 08:20:34 $ From criswell at cs.uiuc.edu Wed Nov 26 08:46:01 2003 From: criswell at cs.uiuc.edu (John Criswell) Date: Wed Nov 26 08:46:01 2003 Subject: [llvm-commits] CVS: llvm/test/Regression/ExecutionEngine/test-arith.ll test-fp.ll test-shift.ll Message-ID: <200311261445.IAA04038@choi.cs.uiuc.edu> Changes in directory llvm/test/Regression/ExecutionEngine: test-arith.ll updated: 1.7 -> 1.8 test-fp.ll updated: 1.3 -> 1.4 test-shift.ll updated: 1.4 -> 1.5 --- Log message: Renamed intermediate values that used the same type and name as previous values. All of these files should assemble now. --- Diffs of the changes: (+15 -15) Index: llvm/test/Regression/ExecutionEngine/test-arith.ll diff -u llvm/test/Regression/ExecutionEngine/test-arith.ll:1.7 llvm/test/Regression/ExecutionEngine/test-arith.ll:1.8 --- llvm/test/Regression/ExecutionEngine/test-arith.ll:1.7 Sun Jan 12 18:56:27 2003 +++ llvm/test/Regression/ExecutionEngine/test-arith.ll Wed Nov 26 08:45:37 2003 @@ -21,7 +21,7 @@ %D = div int %C, %C %E = rem int %D, %D %F = div uint 5, 6 - %G = rem uint 6, 5 + %G1 = rem uint 6, 5 %A = add long 0, 12 %B = sub long %A, 1 Index: llvm/test/Regression/ExecutionEngine/test-fp.ll diff -u llvm/test/Regression/ExecutionEngine/test-fp.ll:1.3 llvm/test/Regression/ExecutionEngine/test-fp.ll:1.4 --- llvm/test/Regression/ExecutionEngine/test-fp.ll:1.3 Sun Jan 12 18:56:54 2003 +++ llvm/test/Regression/ExecutionEngine/test-fp.ll Wed Nov 26 08:45:37 2003 @@ -6,7 +6,7 @@ %X = mul double %W, %W %Y = div double %X, %X %Z = rem double %Y, %Y - %Z = div double %Z, %W + %Z1 = div double %Z, %W %Q = add double %Z, %Arg %R = cast double %Q to double store double %R, double* %DP Index: llvm/test/Regression/ExecutionEngine/test-shift.ll diff -u llvm/test/Regression/ExecutionEngine/test-shift.ll:1.4 llvm/test/Regression/ExecutionEngine/test-shift.ll:1.5 --- llvm/test/Regression/ExecutionEngine/test-shift.ll:1.4 Sat May 31 20:57:44 2003 +++ llvm/test/Regression/ExecutionEngine/test-shift.ll Wed Nov 26 08:45:37 2003 @@ -16,22 +16,22 @@ %t2 = shl ulong 1, ubyte 5 ; Right shifts... - %t1 = shr int 1, ubyte %shamt - %t2 = shr int 1, ubyte 4 + %tr1 = shr int 1, ubyte %shamt + %tr2 = shr int 1, ubyte 4 - %t1 = shr uint 1, ubyte %shamt - %t2 = shr uint 1, ubyte 5 + %tr1 = shr uint 1, ubyte %shamt + %tr2 = shr uint 1, ubyte 5 - ;%t1 = shr long 1, ubyte %shamt - %t1 = shr long 1, ubyte 4 - %t2 = shr long 1, ubyte %shamt - %t3 = shl long 1, ubyte 4 - %t4 = shl long 1, ubyte %shamt + ;%tr1 = shr long 1, ubyte %shamt + %tr1 = shr long 1, ubyte 4 + %tr2 = shr long 1, ubyte %shamt + %tr3 = shl long 1, ubyte 4 + %tr4 = shl long 1, ubyte %shamt ;%t1 = shr ulong 1, ubyte %shamt - %t1 = shr ulong 1, ubyte 5 - %t2 = shr ulong 1, ubyte %shamt - %t3 = shl ulong 1, ubyte 5 - %t4 = shl ulong 1, ubyte %shamt + %tr1 = shr ulong 1, ubyte 5 + %tr2 = shr ulong 1, ubyte %shamt + %tr3 = shl ulong 1, ubyte 5 + %tr4 = shl ulong 1, ubyte %shamt ret int 0 } From criswell at cs.uiuc.edu Wed Nov 26 14:11:02 2003 From: criswell at cs.uiuc.edu (John Criswell) Date: Wed Nov 26 14:11:02 2003 Subject: [llvm-commits] CVS: llvm/docs/ReleaseNotes.html Message-ID: <200311262010.OAA23855@choi.cs.uiuc.edu> Changes in directory llvm/docs: ReleaseNotes.html updated: 1.66 -> 1.67 --- Log message: Makefiles are now copies over to the object root directory dynamically. --- Diffs of the changes: (+22 -1) Index: llvm/docs/ReleaseNotes.html diff -u llvm/docs/ReleaseNotes.html:1.66 llvm/docs/ReleaseNotes.html:1.67 --- llvm/docs/ReleaseNotes.html:1.66 Wed Nov 26 02:20:34 2003 +++ llvm/docs/ReleaseNotes.html Wed Nov 26 14:09:49 2003 @@ -87,6 +87,27 @@ into an 'llvm' C++ namespace, for easier integration with third-party code. Note that due to a bug in GDB 5.x, to debug namespacified LLVM code, you will need to upgrade to GDB 6. + +

    • +The build system now copies Makefiles dynamically from the source tree to the +object tree as subdirectories are built. This means that: +
        +
      1. + New directories can be added to the source tree, and the build will + automatically pick them up (i.e. no need to re-run configure). +
      2. + +
      3. + You will need to build LLVM from the top of the object tree once to ensure + that all of the Makefiles are copied into the object tree subdirectories. +
      4. +
      +
    • + +
    • +The configure script will now configure all projects placed in the +llvm/projects directory. +
    • In this release, the following missing features were implemented:

      @@ -596,7 +617,7 @@ src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!" /> The LLVM Compiler Infrastructure
      - Last modified: $Date: 2003/11/26 08:20:34 $ + Last modified: $Date: 2003/11/26 20:09:49 $ From lattner at cs.uiuc.edu Thu Nov 27 01:49:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu Nov 27 01:49:01 2003 Subject: [llvm-commits] CVS: llvm/projects/Stacker/lib/runtime/stacker_rt.c Message-ID: <200311270748.BAA28081@zion.cs.uiuc.edu> Changes in directory llvm/projects/Stacker/lib/runtime: stacker_rt.c updated: 1.3 -> 1.4 --- Log message: * Squelch warning on Sun * stdlib and friends are system headers * 'long long' is the type that consistently turns into the LLVM 'long' type. --- Diffs of the changes: (+6 -6) Index: llvm/projects/Stacker/lib/runtime/stacker_rt.c diff -u llvm/projects/Stacker/lib/runtime/stacker_rt.c:1.3 llvm/projects/Stacker/lib/runtime/stacker_rt.c:1.4 --- llvm/projects/Stacker/lib/runtime/stacker_rt.c:1.3 Sun Nov 23 20:57:25 2003 +++ llvm/projects/Stacker/lib/runtime/stacker_rt.c Thu Nov 27 01:48:45 2003 @@ -17,12 +17,12 @@ // //===----------------------------------------------------------------------===// -#include "ctype.h" -#include "stdio.h" -#include "stdlib.h" +#include +#include +#include -extern long _index_; -extern int _stack_[1024]; +extern long long _index_; +extern int _stack_[]; extern void _MAIN_(); void @@ -49,7 +49,7 @@ // so that they get popped in the order presented while ( a > 0 ) { - if ( isdigit( argv[--a][0] ) ) + if ( isdigit( (int) argv[--a][0] ) ) { _stack_[_index_++] = atoi( argv[a] ); } From lattner at cs.uiuc.edu Thu Nov 27 03:53:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu Nov 27 03:53:01 2003 Subject: [llvm-commits] CVS: llvm-www/releases/1.0/docs/ReleaseNotes.html Message-ID: <200311270952.DAA02802@zion.cs.uiuc.edu> Changes in directory llvm-www/releases/1.0/docs: ReleaseNotes.html updated: 1.47 -> 1.48 --- Log message: PR11 is now fixed for 1.1! --- Diffs of the changes: (+4 -3) Index: llvm-www/releases/1.0/docs/ReleaseNotes.html diff -u llvm-www/releases/1.0/docs/ReleaseNotes.html:1.47 llvm-www/releases/1.0/docs/ReleaseNotes.html:1.48 --- llvm-www/releases/1.0/docs/ReleaseNotes.html:1.47 Wed Nov 26 02:20:49 2003 +++ llvm-www/releases/1.0/docs/ReleaseNotes.html Thu Nov 27 03:52:13 2003 @@ -436,6 +436,10 @@
    • [llvmg++] ?: expressions do not run correct number of destructors!
    • +

    • Code for executing destructors when + unwinding is not shared (this is a quality of implementation problem, + which does not effect functionality).

      +

    Notes:

    • The C++ front-end is based on a pre-release of the GCC 3.4 C++ parser. This @@ -460,9 +464,6 @@ different from the model used in the Itanium ABI, so exceptions will not interact correctly.

      -

    • Code for executing destructors when - unwinding is not shared (this is a quality of implementation problem, - which does not effect functionality).


    Known problems with the X86 back-end

    @@ -617,7 +615,7 @@ src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!" /> The LLVM Compiler Infrastructure
    - Last modified: $Date: 2003/11/26 20:09:49 $ + Last modified: $Date: 2003/11/27 09:52:03 $ From lattner at cs.uiuc.edu Thu Nov 27 03:53:20 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu Nov 27 03:53:20 2003 Subject: [llvm-commits] CVS: llvm/docs/ReleaseNotes.html Message-ID: <200311270952.DAA02602@zion.cs.uiuc.edu> Changes in directory llvm/docs: ReleaseNotes.html updated: 1.67 -> 1.68 --- Log message: PR11 is now fixed for 1.1 --- Diffs of the changes: (+3 -5) Index: llvm/docs/ReleaseNotes.html diff -u llvm/docs/ReleaseNotes.html:1.67 llvm/docs/ReleaseNotes.html:1.68 --- llvm/docs/ReleaseNotes.html:1.67 Wed Nov 26 14:09:49 2003 +++ llvm/docs/ReleaseNotes.html Thu Nov 27 03:51:54 2003 @@ -148,6 +148,8 @@
  • Constant initializers now generate loops instead of potentially huge amounts of straight-line code.
  • +
  • Code for running C++ destructors is now properly shared when possible. Before, the C++ front-end +generated N^2 amounts of duplicated cleanup code in some cases.
  • In this release, the following bugs in the previous release were fixed:

    @@ -513,10 +515,6 @@ different from the model used in the Itanium ABI, so exceptions will not interact correctly. -
  • Code for executing destructors when - unwinding is not shared (this is a quality of implementation problem, - which does not effect functionality).
  • - @@ -617,7 +615,7 @@ src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!" /> The LLVM Compiler Infrastructure
    - Last modified: $Date: 2003/11/26 20:09:49 $ + Last modified: $Date: 2003/11/27 09:51:54 $ From lattner at cs.uiuc.edu Thu Nov 27 14:48:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu Nov 27 14:48:01 2003 Subject: [llvm-commits] CVS: llvm/test/Regression/CFrontend/2003-11-27-ConstructorCast.c Message-ID: <200311272047.OAA11901@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CFrontend: 2003-11-27-ConstructorCast.c added (r1.1) --- Log message: testcase for PR159 --- Diffs of the changes: (+12 -0) Index: llvm/test/Regression/CFrontend/2003-11-27-ConstructorCast.c diff -c /dev/null llvm/test/Regression/CFrontend/2003-11-27-ConstructorCast.c:1.1 *** /dev/null Thu Nov 27 14:47:26 2003 --- llvm/test/Regression/CFrontend/2003-11-27-ConstructorCast.c Thu Nov 27 14:47:16 2003 *************** *** 0 **** --- 1,12 ---- + struct i387_soft_struct { + long cwd; + }; + union i387_union { + struct i387_soft_struct soft; + }; + struct thread_struct { + union i387_union i387; + }; + void _init_task_union(void) { + struct thread_struct thread = (struct thread_struct) { {{0}} }; + } From lattner at cs.uiuc.edu Thu Nov 27 15:18:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu Nov 27 15:18:01 2003 Subject: [llvm-commits] CVS: llvm/docs/ProgrammersManual.html Message-ID: <200311272117.PAA12213@zion.cs.uiuc.edu> Changes in directory llvm/docs: ProgrammersManual.html updated: 1.51 -> 1.52 --- Log message: Fix grammaro --- Diffs of the changes: (+1 -1) Index: llvm/docs/ProgrammersManual.html diff -u llvm/docs/ProgrammersManual.html:1.51 llvm/docs/ProgrammersManual.html:1.52 --- llvm/docs/ProgrammersManual.html:1.51 Mon Nov 24 19:02:51 2003 +++ llvm/docs/ProgrammersManual.html Thu Nov 27 15:17:48 2003 @@ -388,7 +388,7 @@

      $ opt < a.bc > /dev/null -mypass
    <no output>
    $ opt < a.bc > /dev/null -mypass -debug
    I am here!
    $

    Using the DEBUG() macro instead of a home-brewed solution -allows you to now have to create "yet another" command line option for +allows you to not have to create "yet another" command line option for the debug output for your pass. Note that DEBUG() macros are disabled for optimized builds, so they do not cause a performance impact at all (for the same reason, they should also not contain From lattner at cs.uiuc.edu Thu Nov 27 15:26:07 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu Nov 27 15:26:07 2003 Subject: [llvm-commits] CVS: llvm/test/Regression/CFrontend/2003-11-27-UnionCtorInitialization.c Message-ID: <200311272125.PAA12276@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CFrontend: 2003-11-27-UnionCtorInitialization.c added (r1.1) --- Log message: New testcase for PR158 --- Diffs of the changes: (+14 -0) Index: llvm/test/Regression/CFrontend/2003-11-27-UnionCtorInitialization.c diff -c /dev/null llvm/test/Regression/CFrontend/2003-11-27-UnionCtorInitialization.c:1.1 *** /dev/null Thu Nov 27 15:25:17 2003 --- llvm/test/Regression/CFrontend/2003-11-27-UnionCtorInitialization.c Thu Nov 27 15:25:07 2003 *************** *** 0 **** --- 1,14 ---- + struct i387_soft_struct { + long cwd; + long twd; + long fip; + }; + union i387_union { + struct i387_soft_struct soft; + }; + struct thread_struct { + union i387_union i387; + }; + void _init_task_union(void) { + struct thread_struct thread = (struct thread_struct) { {{0}} }; + } From lattner at cs.uiuc.edu Thu Nov 27 19:33:06 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu Nov 27 19:33:06 2003 Subject: [llvm-commits] CVS: llvm/test/Regression/C++Frontend/2003-11-27-MultipleInheritanceThunk.cpp Message-ID: <200311280132.TAA16450@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/C++Frontend: 2003-11-27-MultipleInheritanceThunk.cpp added (r1.1) --- Log message: Testcase for PR160 --- Diffs of the changes: (+26 -0) Index: llvm/test/Regression/C++Frontend/2003-11-27-MultipleInheritanceThunk.cpp diff -c /dev/null llvm/test/Regression/C++Frontend/2003-11-27-MultipleInheritanceThunk.cpp:1.1 *** /dev/null Thu Nov 27 19:32:13 2003 --- llvm/test/Regression/C++Frontend/2003-11-27-MultipleInheritanceThunk.cpp Thu Nov 27 19:32:03 2003 *************** *** 0 **** --- 1,26 ---- + + struct CallSite { + int X; + + CallSite(const CallSite &CS); + }; + + struct AliasAnalysis { + int TD; + + virtual int getModRefInfo(CallSite CS); + }; + + + struct Pass { + int X; + virtual int foo(); + }; + + struct AliasAnalysisCounter : public Pass, public AliasAnalysis { + int getModRefInfo(CallSite CS) { + return 0; + } + }; + + AliasAnalysisCounter AAC; From lattner at cs.uiuc.edu Thu Nov 27 19:47:00 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu Nov 27 19:47:00 2003 Subject: [llvm-commits] CVS: llvm/include/llvm/Support/InstVisitor.h Message-ID: <200311280146.TAA19689@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Support: InstVisitor.h updated: 1.26 -> 1.27 --- Log message: fix gcc 3.4 compatibility problem --- Diffs of the changes: (+1 -1) Index: llvm/include/llvm/Support/InstVisitor.h diff -u llvm/include/llvm/Support/InstVisitor.h:1.26 llvm/include/llvm/Support/InstVisitor.h:1.27 --- llvm/include/llvm/Support/InstVisitor.h:1.26 Tue Nov 11 16:41:31 2003 +++ llvm/include/llvm/Support/InstVisitor.h Thu Nov 27 19:46:06 2003 @@ -50,7 +50,7 @@ #ifndef LLVM_SUPPORT_INSTVISITOR_H #define LLVM_SUPPORT_INSTVISITOR_H -#include "llvm/Instruction.h" +#include "llvm/Function.h" namespace llvm { From lattner at cs.uiuc.edu Fri Nov 28 01:45:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri Nov 28 01:45:01 2003 Subject: [llvm-commits] CVS: llvm/tools/gccld/Linker.cpp gccld.h Message-ID: <200311280744.BAA29253@zion.cs.uiuc.edu> Changes in directory llvm/tools/gccld: Linker.cpp updated: 1.18 -> 1.19 gccld.h updated: 1.6 -> 1.7 --- Log message: * The return value of LinkLibraries is ignored, so remove it. * Finegrainify namespacification of Linker.cpp * If linking a library in fails, do not STOP LINKING IN LIBRARIES AND CONTINUE ANYWAY! Instead, just output the warning, and keep going. :) --- Diffs of the changes: (+31 -43) Index: llvm/tools/gccld/Linker.cpp diff -u llvm/tools/gccld/Linker.cpp:1.18 llvm/tools/gccld/Linker.cpp:1.19 --- llvm/tools/gccld/Linker.cpp:1.18 Thu Nov 20 13:08:06 2003 +++ llvm/tools/gccld/Linker.cpp Fri Nov 28 01:44:09 2003 @@ -29,8 +29,7 @@ #include #include #include - -namespace llvm { +using namespace llvm; /// FindLib - Try to convert Filename into the name of a file that we can open, /// if it does not already name a file we can open, by first trying to open @@ -39,9 +38,9 @@ /// named by the value of the environment variable LLVM_LIB_SEARCH_PATH. Returns /// an empty string if no matching file can be found. /// -std::string FindLib(const std::string &Filename, - const std::vector &Paths, - bool SharedObjectOnly) { +std::string llvm::FindLib(const std::string &Filename, + const std::vector &Paths, + bool SharedObjectOnly) { // Determine if the pathname can be found as it stands. if (FileOpenable(Filename)) return Filename; @@ -79,7 +78,8 @@ /// GetAllDefinedSymbols - Modifies its parameter DefinedSymbols to contain the /// name of each externally-visible symbol defined in M. /// -void GetAllDefinedSymbols(Module *M, std::set &DefinedSymbols) { +void llvm::GetAllDefinedSymbols(Module *M, + std::set &DefinedSymbols) { for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I) if (I->hasName() && !I->isExternal() && !I->hasInternalLinkage()) DefinedSymbols.insert(I->getName()); @@ -101,7 +101,8 @@ /// undefined symbols. /// void -GetAllUndefinedSymbols(Module *M, std::set &UndefinedSymbols) { +llvm::GetAllUndefinedSymbols(Module *M, + std::set &UndefinedSymbols) { std::set DefinedSymbols; UndefinedSymbols.clear(); // Start out empty @@ -134,8 +135,8 @@ /// module it contains (wrapped in an auto_ptr), or 0 and set ErrorMessage if an /// error occurs. /// -std::auto_ptr LoadObject(const std::string &FN, - std::string &ErrorMessage) { +std::auto_ptr llvm::LoadObject(const std::string &FN, + std::string &ErrorMessage) { std::string ParserErrorMessage; Module *Result = ParseBytecodeFile(FN, &ParserErrorMessage); if (Result) return std::auto_ptr(Result); @@ -280,11 +281,8 @@ /// FALSE - No errors. /// TRUE - Some error occurred. /// -bool LinkFiles(const char *progname, - Module *HeadModule, - const std::vector &Files, - bool Verbose) -{ +bool llvm::LinkFiles(const char *progname, Module *HeadModule, + const std::vector &Files, bool Verbose) { // String in which to receive error messages. std::string ErrorMessage; @@ -359,13 +357,10 @@ /// FALSE - No error. /// TRUE - Error. /// -bool LinkLibraries(const char *progname, - Module *HeadModule, - const std::vector &Libraries, - const std::vector &LibPaths, - bool Verbose, - bool Native) -{ +void llvm::LinkLibraries(const char *progname, Module *HeadModule, + const std::vector &Libraries, + const std::vector &LibPaths, + bool Verbose, bool Native) { // String in which to receive error messages. std::string ErrorMessage; @@ -377,9 +372,9 @@ // we're doing a native link and give an error if we're doing a bytecode // link. if (!Native) { - PrintAndReturn(progname, "Cannot find library -l" + Libraries[i] - + "\n"); - return true; + std::cerr << progname << ": WARNING: Cannot find library -l" + << Libraries[i] << "\n"; + continue; } } @@ -391,10 +386,10 @@ << Libraries[i] << ")\n"; if (LinkInArchive(HeadModule, Pathname, ErrorMessage, Verbose)) { - PrintAndReturn(progname, ErrorMessage, - ": Error linking in archive '" + Pathname - + "' (-l" + Libraries[i] + ")"); - return true; + std::cerr << progname << ": " << ErrorMessage + << ": Error linking in archive '" << Pathname << "' (-l" + << Libraries[i] << ")\n"; + exit(1); } } else if (IsBytecode(Pathname)) { if (Verbose) @@ -402,15 +397,11 @@ << "' (-l" << Libraries[i] << ")\n"; if (LinkInFile(HeadModule, Pathname, ErrorMessage, Verbose)) { - PrintAndReturn(progname, ErrorMessage, - ": error linking in bytecode file '" + Pathname - + "' (-l" + Libraries[i] + ")"); - return true; + std::cerr << progname << ": " << ErrorMessage + << ": error linking in bytecode file '" << Pathname << "' (-l" + << Libraries[i] << ")\n"; + exit(1); } } } - - return false; } - -} // End llvm namespace Index: llvm/tools/gccld/gccld.h diff -u llvm/tools/gccld/gccld.h:1.6 llvm/tools/gccld/gccld.h:1.7 --- llvm/tools/gccld/gccld.h:1.6 Thu Nov 20 13:08:06 2003 +++ llvm/tools/gccld/gccld.h Fri Nov 28 01:44:09 2003 @@ -62,13 +62,10 @@ const std::vector &Paths, bool SharedObjectOnly = false); -bool -LinkLibraries (const char * progname, - Module * HeadModule, - const std::vector & Libraries, - const std::vector & LibPaths, - bool Verbose, - bool Native); +void LinkLibraries (const char * progname, Module* HeadModule, + const std::vector & Libraries, + const std::vector & LibPaths, + bool Verbose, bool Native); bool LinkFiles (const char * progname, Module * HeadModule, From lattner at cs.uiuc.edu Fri Nov 28 03:45:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri Nov 28 03:45:01 2003 Subject: [llvm-commits] CVS: llvm/tools/gccld/GenerateCode.cpp Message-ID: <200311280944.DAA16196@zion.cs.uiuc.edu> Changes in directory llvm/tools/gccld: GenerateCode.cpp updated: 1.15 -> 1.16 --- Log message: The function resolving pass must be run, even if -disable-opt is specified --- Diffs of the changes: (+6 -6) Index: llvm/tools/gccld/GenerateCode.cpp diff -u llvm/tools/gccld/GenerateCode.cpp:1.15 llvm/tools/gccld/GenerateCode.cpp:1.16 --- llvm/tools/gccld/GenerateCode.cpp:1.15 Thu Nov 20 00:26:15 2003 +++ llvm/tools/gccld/GenerateCode.cpp Fri Nov 28 03:44:03 2003 @@ -74,6 +74,12 @@ // Add an appropriate TargetData instance for this module... addPass(Passes, new TargetData("gccld", M)); + // Often if the programmer does not specify proper prototypes for the + // functions they are calling, they end up calling a vararg version of the + // function that does not get a body filled in (the real function has typed + // arguments). This pass merges the two functions. + addPass(Passes, createFunctionResolvingPass()); + if (!DisableOptimizations) { // Linking modules together can lead to duplicated global constants, only // keep one copy of each constant... @@ -84,12 +90,6 @@ // supporting. if (Strip) addPass(Passes, createSymbolStrippingPass()); - - // Often if the programmer does not specify proper prototypes for the - // functions they are calling, they end up calling a vararg version of the - // function that does not get a body filled in (the real function has typed - // arguments). This pass merges the two functions. - addPass(Passes, createFunctionResolvingPass()); if (Internalize) { // Now that composite has been compiled, scan through the module, looking From lattner at cs.uiuc.edu Fri Nov 28 23:20:00 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri Nov 28 23:20:00 2003 Subject: [llvm-commits] CVS: llvm/test/Regression/Transforms/LevelRaise/2003-11-28-IllegalTypeConversion.ll Message-ID: <200311290519.XAA06863@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Transforms/LevelRaise: 2003-11-28-IllegalTypeConversion.ll added (r1.1) --- Log message: new testcase for problem causing 2003-10-12-GlobalVarInitializers failures --- Diffs of the changes: (+10 -0) Index: llvm/test/Regression/Transforms/LevelRaise/2003-11-28-IllegalTypeConversion.ll diff -c /dev/null llvm/test/Regression/Transforms/LevelRaise/2003-11-28-IllegalTypeConversion.ll:1.1 *** /dev/null Fri Nov 28 23:19:26 2003 --- llvm/test/Regression/Transforms/LevelRaise/2003-11-28-IllegalTypeConversion.ll Fri Nov 28 23:19:15 2003 *************** *** 0 **** --- 1,10 ---- + ; The program should not just cast 2143289344 to float and store it! + ; + ; RUN: llvm-as < %s | opt -raise | llvm-dis | not grep 41DFF + + void %test() { + %mem_tmp = alloca float + %tmp.0 = cast float* %mem_tmp to uint* + store uint 2143289344, uint* %tmp.0 + ret void + } From lattner at cs.uiuc.edu Fri Nov 28 23:32:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri Nov 28 23:32:01 2003 Subject: [llvm-commits] CVS: llvm/lib/Transforms/ExprTypeConvert.cpp Message-ID: <200311290531.XAA06931@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms: ExprTypeConvert.cpp updated: 1.83 -> 1.84 --- Log message: Fix test: Transforms/LevelRaise/2003-11-28-IllegalTypeConversion.ll Some gep generalization changes --- Diffs of the changes: (+7 -6) Index: llvm/lib/Transforms/ExprTypeConvert.cpp diff -u llvm/lib/Transforms/ExprTypeConvert.cpp:1.83 llvm/lib/Transforms/ExprTypeConvert.cpp:1.84 --- llvm/lib/Transforms/ExprTypeConvert.cpp:1.83 Tue Nov 11 16:41:33 2003 +++ llvm/lib/Transforms/ExprTypeConvert.cpp Fri Nov 28 23:31:25 2003 @@ -257,7 +257,6 @@ // and we could convert this to an appropriate GEP for the new type. // if (GEP->getNumOperands() == 2 && - GEP->getOperand(1)->getType() == Type::LongTy && GEP->getType() == PointerType::get(Type::SByteTy)) { // Do not Check to see if our incoming pointer can be converted @@ -285,7 +284,6 @@ // getelemenptr [[int] *] * %reg115, long %reg138 ; [int]** // if (GEP->getNumOperands() == 2 && - GEP->getOperand(1)->getType() == Type::LongTy && PTy->getElementType()->isSized() && TD.getTypeSize(PTy->getElementType()) == TD.getTypeSize(GEP->getType()->getElementType())) { @@ -466,11 +464,10 @@ } if (Res == 0 && GEP->getNumOperands() == 2 && - GEP->getOperand(1)->getType() == Type::LongTy && GEP->getType() == PointerType::get(Type::SByteTy)) { // Otherwise, we can convert a GEP from one form to the other iff the - // current gep is of the form 'getelementptr [sbyte]*, unsigned N + // current gep is of the form 'getelementptr sbyte*, unsigned N // and we could convert this to an appropriate GEP for the new type. // const PointerType *NewSrcTy = PointerType::get(PVTy); @@ -774,8 +771,12 @@ TD.getTypeSize(ElTy) != TD.getTypeSize(I->getOperand(0)->getType())) return false; - // Can convert store if the incoming value is convertible... - return ExpressionConvertibleToType(I->getOperand(0), ElTy, CTMap, TD); + // Can convert store if the incoming value is convertible and if the + // result will preserve semantics... + const Type *Op0Ty = I->getOperand(0)->getType(); + if (!(Op0Ty->isIntegral() ^ ElTy->isIntegral()) && + !(Op0Ty->isFloatingPoint() ^ ElTy->isFloatingPoint())) + return ExpressionConvertibleToType(I->getOperand(0), ElTy, CTMap, TD); } return false; } From lattner at cs.uiuc.edu Sat Nov 29 03:12:15 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sat Nov 29 03:12:15 2003 Subject: [llvm-commits] CVS: llvm/test/Regression/C++Frontend/2003-11-29-DuplicatedCleanupTest.cpp Message-ID: <200311290911.DAA13924@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/C++Frontend: 2003-11-29-DuplicatedCleanupTest.cpp added (r1.1) --- Log message: Testcase for duplicated cleanup work (PR11). Note that this testcase is not actually tested automatically, so it is practically useless. However, it seemed silly to throw away my testcase, so here it is. --- Diffs of the changes: (+39 -0) Index: llvm/test/Regression/C++Frontend/2003-11-29-DuplicatedCleanupTest.cpp diff -c /dev/null llvm/test/Regression/C++Frontend/2003-11-29-DuplicatedCleanupTest.cpp:1.1 *** /dev/null Sat Nov 29 03:11:01 2003 --- llvm/test/Regression/C++Frontend/2003-11-29-DuplicatedCleanupTest.cpp Sat Nov 29 03:10:50 2003 *************** *** 0 **** --- 1,39 ---- + + void doesntThrow() throw(); + struct F { + ~F() { doesntThrow(); } + }; + + void atest() { + F A; + lab: + F B; + goto lab; + } + + void test(int val) { + label: { + F A; + F B; + if (val == 0) goto label; + if (val == 1) goto label; + } + } + + void test3(int val) { + label: { + F A; + F B; + if (val == 0) { doesntThrow(); goto label; } + if (val == 1) { doesntThrow(); goto label; } + } + } + + void test4(int val) { + label: { + F A; + F B; + if (val == 0) { F C; goto label; } + if (val == 1) { F D; goto label; } + } + } From lattner at cs.uiuc.edu Sat Nov 29 03:23:11 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sat Nov 29 03:23:11 2003 Subject: [llvm-commits] CVS: llvm/runtime/GCCLibraries/crtend/README.txt Makefile Message-ID: <200311290923.DAA15538@zion.cs.uiuc.edu> Changes in directory llvm/runtime/GCCLibraries/crtend: README.txt added (r1.1) Makefile updated: 1.7 -> 1.8 --- Log message: Add readme and spiff up makefile header --- Diffs of the changes: (+22 -1) Index: llvm/runtime/GCCLibraries/crtend/README.txt diff -c /dev/null llvm/runtime/GCCLibraries/crtend/README.txt:1.1 *** /dev/null Sat Nov 29 03:23:04 2003 --- llvm/runtime/GCCLibraries/crtend/README.txt Sat Nov 29 03:22:53 2003 *************** *** 0 **** --- 1,15 ---- + This directory contains the C and C++ runtime libraries for the LLVM GCC + front-ends. It is composed of four distinct pieces: + + 1. __main and static ctor/dtor support. This is used by both C and C++ codes. + + 2. Generic EH support routines. This is used by C/C++ programs that use + setjmp/longjmp, and by C++ programs that make use of exceptions. + + 3. setjmp/longjmp EH support. This is used by C/C++ programs that call SJLJ. + + 4. C++ exception handling runtime support. + + These four components are compiled together into an archive file, so that + applications using a subset of the four do not pull in unnecessary code and + dependencies. Index: llvm/runtime/GCCLibraries/crtend/Makefile diff -u llvm/runtime/GCCLibraries/crtend/Makefile:1.7 llvm/runtime/GCCLibraries/crtend/Makefile:1.8 --- llvm/runtime/GCCLibraries/crtend/Makefile:1.7 Mon Oct 20 17:28:47 2003 +++ llvm/runtime/GCCLibraries/crtend/Makefile Sat Nov 29 03:22:53 2003 @@ -1,4 +1,4 @@ -##===- runtime/GCCLibraries/crtend/Makefile ------------------------------*- Makefile -*-===## +##===- runtime/GCCLibraries/crtend/Makefile ----------------*- Makefile -*-===## # # The LLVM Compiler Infrastructure # @@ -6,6 +6,12 @@ # the University of Illinois Open Source License. See LICENSE.TXT for details. # ##===----------------------------------------------------------------------===## +# +# This directory contains the C and C++ runtime libraries for the LLVM GCC +# front-ends. +# +##===----------------------------------------------------------------------===## + LEVEL = ../../.. BYTECODE_LIBRARY=1 DONT_BUILD_RELINKED=1 From lattner at cs.uiuc.edu Sat Nov 29 03:50:03 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sat Nov 29 03:50:03 2003 Subject: [llvm-commits] CVS: llvm/test/Makefile.tests Message-ID: <200311290949.DAA23376@zion.cs.uiuc.edu> Changes in directory llvm/test: Makefile.tests updated: 1.80 -> 1.81 --- Log message: Move rule to top-level makefile --- Diffs of the changes: (+1 -2) Index: llvm/test/Makefile.tests diff -u llvm/test/Makefile.tests:1.80 llvm/test/Makefile.tests:1.81 --- llvm/test/Makefile.tests:1.80 Tue Sep 16 15:02:22 2003 +++ llvm/test/Makefile.tests Sat Nov 29 03:49:14 2003 @@ -45,8 +45,7 @@ LLI = $(TOOLS)/lli LLC = $(TOOLS)/llc LGCCAS = $(TOOLS)/gccas -LGCCLD = $(TOOLS)/gccld -L$(LLVMGCCDIR)/lib/gcc/$(LLVMGCCARCH) -L$(LLVMGCCDIR)/lib -LGCCLDPROG = $(TOOLS)/gccld +LGCCLD = $(LGCCLDPROG) -L$(LLVMGCCDIR)/lib/gcc/$(LLVMGCCARCH) -L$(LLVMGCCDIR)/lib LDIS = $(TOOLS)/llvm-dis LOPT = $(TOOLS)/opt LLINK = $(TOOLS)/llvm-link From lattner at cs.uiuc.edu Sat Nov 29 03:51:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sat Nov 29 03:51:01 2003 Subject: [llvm-commits] CVS: llvm/Makefile.rules Message-ID: <200311290950.DAA23428@zion.cs.uiuc.edu> Changes in directory llvm: Makefile.rules updated: 1.161 -> 1.162 --- Log message: Simplify some rules Move LGCCLDPROG from test/Makefile.tests --- Diffs of the changes: (+8 -8) Index: llvm/Makefile.rules diff -u llvm/Makefile.rules:1.161 llvm/Makefile.rules:1.162 --- llvm/Makefile.rules:1.161 Tue Nov 25 13:32:22 2003 +++ llvm/Makefile.rules Sat Nov 29 03:50:15 2003 @@ -243,9 +243,10 @@ #-------------------------------------------------------------------------- # Utilities used while building the LLVM tree, which live in the utils dir # -BURG := $(LLVMTOOLCURRENT)/burg -RunBurg := $(BURG) $(BURG_OPTS) -TBLGEN := $(LLVMTOOLCURRENT)/tblgen +BURG := $(LLVMTOOLCURRENT)/burg +RunBurg := $(BURG) $(BURG_OPTS) +TBLGEN := $(LLVMTOOLCURRENT)/tblgen +LGCCLDPROG := $(LLVMTOOLCURRENT)/gccld #-------------------------------------------------------------------------- # The LLVM GCC front-end in C and C++ flavors @@ -374,11 +375,10 @@ # Libtool Objects # Srcs := $(sort $(basename $(Source))) -Objs := $(addsuffix .lo, $(Srcs)) -ObjectsO := $(addprefix $(BUILD_OBJ_DIR)/Release/,$(Objs)) -ObjectsP := $(addprefix $(BUILD_OBJ_DIR)/Profile/,$(Objs)) -ObjectsG := $(addprefix $(BUILD_OBJ_DIR)/Debug/,$(Objs)) -ObjectsBC := $(addprefix $(BUILD_OBJ_DIR)/BytecodeObj/,$(addsuffix .bc, $(Srcs))) +ObjectsO := $(Srcs:%=$(BUILD_OBJ_DIR)/Release/%.lo) +ObjectsP := $(Srcs:%=$(BUILD_OBJ_DIR)/Profile/%.lo) +ObjectsG := $(Srcs:%=$(BUILD_OBJ_DIR)/Debug/%.lo) +ObjectsBC := $(Srcs:%=$(BUILD_OBJ_DIR)/BytecodeObj/%.bc) # # The real objects underlying the libtool objects From lattner at cs.uiuc.edu Sat Nov 29 04:06:03 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sat Nov 29 04:06:03 2003 Subject: [llvm-commits] CVS: llvm/runtime/GCCLibraries/crtend/comp_cxxeh.lst comp_genericeh.lst comp_main.lst comp_sjljeh.lst Makefile exported_symbol_list.lst Message-ID: <200311291005.EAA26102@zion.cs.uiuc.edu> Changes in directory llvm/runtime/GCCLibraries/crtend: comp_cxxeh.lst added (r1.1) comp_genericeh.lst added (r1.1) comp_main.lst added (r1.1) comp_sjljeh.lst added (r1.1) Makefile updated: 1.8 -> 1.9 exported_symbol_list.lst (r1.1) removed --- Log message: Rewrite makefile logic to build an archive instead of a .o file. This is intended to address PR142 --- Diffs of the changes: (+79 -10) Index: llvm/runtime/GCCLibraries/crtend/comp_cxxeh.lst diff -c /dev/null llvm/runtime/GCCLibraries/crtend/comp_cxxeh.lst:1.1 *** /dev/null Sat Nov 29 04:05:41 2003 --- llvm/runtime/GCCLibraries/crtend/comp_cxxeh.lst Sat Nov 29 04:05:30 2003 *************** *** 0 **** --- 1,11 ---- + __llvm_cxxeh_allocate_exception + __llvm_cxxeh_free_exception + __llvm_cxxeh_throw + __llvm_cxxeh_call_terminate + __llvm_cxxeh_current_uncaught_exception_isa + __llvm_cxxeh_begin_catch + __llvm_cxxeh_begin_catch_if_isa + __llvm_cxxeh_end_catch + __llvm_cxxeh_rethrow + __llvm_cxxeh_get_last_caught + __llvm_cxxeh_check_eh_spec Index: llvm/runtime/GCCLibraries/crtend/comp_genericeh.lst diff -c /dev/null llvm/runtime/GCCLibraries/crtend/comp_genericeh.lst:1.1 *** /dev/null Sat Nov 29 04:05:41 2003 --- llvm/runtime/GCCLibraries/crtend/comp_genericeh.lst Sat Nov 29 04:05:30 2003 *************** *** 0 **** --- 1,9 ---- + __main + llvm.global_ctors + llvm.global_dtors + + __llvm_eh_has_uncaught_exception + __llvm_eh_current_uncaught_exception_type + __llvm_eh_add_uncaught_exception + __llvm_eh_get_uncaught_exception + __llvm_eh_pop_from_uncaught_stack Index: llvm/runtime/GCCLibraries/crtend/comp_main.lst diff -c /dev/null llvm/runtime/GCCLibraries/crtend/comp_main.lst:1.1 *** /dev/null Sat Nov 29 04:05:41 2003 --- llvm/runtime/GCCLibraries/crtend/comp_main.lst Sat Nov 29 04:05:30 2003 *************** *** 0 **** --- 1,3 ---- + __main + llvm.global_ctors + llvm.global_dtors Index: llvm/runtime/GCCLibraries/crtend/comp_sjljeh.lst diff -c /dev/null llvm/runtime/GCCLibraries/crtend/comp_sjljeh.lst:1.1 *** /dev/null Sat Nov 29 04:05:41 2003 --- llvm/runtime/GCCLibraries/crtend/comp_sjljeh.lst Sat Nov 29 04:05:30 2003 *************** *** 0 **** --- 1,7 ---- + __llvm_sjljeh_throw_longjmp + __llvm_sjljeh_init_setjmpmap + __llvm_sjljeh_destroy_setjmpmap + __llvm_sjljeh_add_setjmp_to_map + __llvm_sjljeh_is_longjmp_exception + __llvm_sjljeh_get_longjmp_value + __llvm_sjljeh_try_catching_longjmp_exception Index: llvm/runtime/GCCLibraries/crtend/Makefile diff -u llvm/runtime/GCCLibraries/crtend/Makefile:1.8 llvm/runtime/GCCLibraries/crtend/Makefile:1.9 --- llvm/runtime/GCCLibraries/crtend/Makefile:1.8 Sat Nov 29 03:22:53 2003 +++ llvm/runtime/GCCLibraries/crtend/Makefile Sat Nov 29 04:05:30 2003 @@ -8,25 +8,64 @@ ##===----------------------------------------------------------------------===## # # This directory contains the C and C++ runtime libraries for the LLVM GCC -# front-ends. +# front-ends. See the README.txt file for more details. +# +# Since this archive has strange requirements, we use almost all custom rules +# for building it. # ##===----------------------------------------------------------------------===## LEVEL = ../../.. -BYTECODE_LIBRARY=1 DONT_BUILD_RELINKED=1 -LIBRARYNAME=crtend - -Source = $(notdir $(wildcard $(SourceDir)/*.cpp $(SourceDir)/*.c)) listend.ll -EXPORTED_SYMBOL_FILE = $(SourceDir)/exported_symbol_list.lst +MainSrc := crtend.c listend.ll +GenericEHSrc := Exception.cpp +SJLJEHSrc := SJLJ-Exception.cpp +CXXEHSrc := C++-Exception.cpp +Source := $(MainSrc) $(GenericEHSrc) $(SJLJEHSrc) $(CXXEHSrc) include $(LEVEL)/Makefile.common +# CRTEND_A - The result of making 'all' - the final archive file. +CRTEND_A = $(DESTLIBBYTECODE)/crtend.a +all:: $(CRTEND_A) + +# Installation simply requires copying the archive to it's new home. +$(LLVMGCCDIR)/bytecode-libs/crtend.a: $(CRTEND_A) + cp $< $@ + +install:: $(LLVMGCCDIR)/bytecode-libs/crtend.a + + +# The four components described in the README +Components := main genericeh sjljeh cxxeh +ComponentLibs := $(Components:%=$(BUILD_OBJ_DIR)/BytecodeObj/comp_%.bc) + + +# We build crtend.a from the four components described in the README. +$(CRTEND_A) : $(ComponentLibs) + $(AR) $@ $(ComponentLibs) + +MainObj := $(BUILD_OBJ_DIR)/BytecodeObj/crtend.bc \ + $(BUILD_OBJ_DIR)/BytecodeObj/listend.bc +GenericEHObj := $(BUILD_OBJ_DIR)/BytecodeObj/Exception.bc +SJLJEHObj := $(BUILD_OBJ_DIR)/BytecodeObj/SJLJ-Exception.bc +CXXEHObj := $(BUILD_OBJ_DIR)/BytecodeObj/C++-Exception.bc + +# __main and ctor/dtor support component +$(BUILD_OBJ_DIR)/BytecodeObj/comp_main.bc: $(MainObj) + $(LGCCLDPROG) -link-as-library -internalize-public-api-file=$(BUILD_SRC_DIR)/comp_main.lst $(MainObj) -o $@ + +# Generic exception handling support runtime. +$(BUILD_OBJ_DIR)/BytecodeObj/comp_genericeh.bc: $(GenericEHObj) + $(LGCCLDPROG) -link-as-library -internalize-public-api-file=$(BUILD_SRC_DIR)/comp_genericeh.lst $(GenericEHObj) -o $@ + +# setjmp/longjmp exception handling support runtime. +$(BUILD_OBJ_DIR)/BytecodeObj/comp_sjljeh.bc: $(SJLJEHObj) + $(LGCCLDPROG) -link-as-library -internalize-public-api-file=$(BUILD_SRC_DIR)/comp_sjljeh.lst $(SJLJEHObj) -o $@ -$(LLVMGCCDIR)/bytecode-libs/crtend.o: $(LIBNAME_BC) - @cp $< $@ +# C++ exception handling support runtime. +$(BUILD_OBJ_DIR)/BytecodeObj/comp_cxxeh.bc: $(CXXEHObj) + $(LGCCLDPROG) -link-as-library -internalize-public-api-file=$(BUILD_SRC_DIR)/comp_cxxeh.lst $(CXXEHObj) -o $@ -install:: $(LLVMGCCDIR)/bytecode-libs/crtend.o - @rm $(LLVMGCCDIR)/bytecode-libs/libcrtend.bc From lattner at cs.uiuc.edu Sat Nov 29 04:12:08 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sat Nov 29 04:12:08 2003 Subject: [llvm-commits] CVS: llvm/test/Programs/Makefile.programs Message-ID: <200311291011.EAA27481@zion.cs.uiuc.edu> Changes in directory llvm/test/Programs: Makefile.programs updated: 1.100 -> 1.101 --- Log message: crtend.o is no longer. Long live crtend.a! --- Diffs of the changes: (+2 -2) Index: llvm/test/Programs/Makefile.programs diff -u llvm/test/Programs/Makefile.programs:1.100 llvm/test/Programs/Makefile.programs:1.101 --- llvm/test/Programs/Makefile.programs:1.100 Fri Oct 24 14:59:56 2003 +++ llvm/test/Programs/Makefile.programs Sat Nov 29 04:10:57 2003 @@ -194,7 +194,7 @@ $(PROGRAMS_TO_TEST:%=Output/%.llvm.bc): \ Output/%.llvm.bc: Output/%.linked.bc $(LGCCLDPROG) - $(LGCCLD) -disable-inlining $(STATS) $< -lc $(LIBS) crtend.o -o Output/$*.llvm + $(LGCCLD) -disable-inlining $(STATS) $< -lc $(LIBS) crtend.a -o Output/$*.llvm ifneq ($(OPTPASSES),) $(LOPT) -q $(OPTPASSES) < $@ > $@.tmp $(MV) -f $@.tmp $@ @@ -202,7 +202,7 @@ $(PROGRAMS_TO_TEST:%=Output/%.llvm): \ Output/%.llvm: Output/%.linked.bc $(LGCCLDPROG) - $(LGCCLD) -disable-inlining $(STATS) $< -lc $(LIBS) crtend.o -o Output/$*.llvm + $(LGCCLD) -disable-inlining $(STATS) $< -lc $(LIBS) crtend.a -o Output/$*.llvm ifneq ($(OPTPASSES),) $(LOPT) -q $(OPTPASSES) < $@ > $@.tmp $(MV) -f $@.tmp $@ From lattner at cs.uiuc.edu Sat Nov 29 04:15:02 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sat Nov 29 04:15:02 2003 Subject: [llvm-commits] CVS: llvm/runtime/GCCLibraries/crtend/Makefile Message-ID: <200311291014.EAA28360@zion.cs.uiuc.edu> Changes in directory llvm/runtime/GCCLibraries/crtend: Makefile updated: 1.9 -> 1.10 --- Log message: Don't print out tons of crap --- Diffs of the changes: (+10 -5) Index: llvm/runtime/GCCLibraries/crtend/Makefile diff -u llvm/runtime/GCCLibraries/crtend/Makefile:1.9 llvm/runtime/GCCLibraries/crtend/Makefile:1.10 --- llvm/runtime/GCCLibraries/crtend/Makefile:1.9 Sat Nov 29 04:05:30 2003 +++ llvm/runtime/GCCLibraries/crtend/Makefile Sat Nov 29 04:14:17 2003 @@ -44,7 +44,8 @@ # We build crtend.a from the four components described in the README. $(CRTEND_A) : $(ComponentLibs) - $(AR) $@ $(ComponentLibs) + @echo Building final crtend.a file from components + $(VERB) $(AR) $@ $(ComponentLibs) MainObj := $(BUILD_OBJ_DIR)/BytecodeObj/crtend.bc \ $(BUILD_OBJ_DIR)/BytecodeObj/listend.bc @@ -54,18 +55,22 @@ # __main and ctor/dtor support component $(BUILD_OBJ_DIR)/BytecodeObj/comp_main.bc: $(MainObj) - $(LGCCLDPROG) -link-as-library -internalize-public-api-file=$(BUILD_SRC_DIR)/comp_main.lst $(MainObj) -o $@ + @echo Linking $(notdir $@) component... + $(VERB) $(LGCCLDPROG) -link-as-library -internalize-public-api-file=$(BUILD_SRC_DIR)/comp_main.lst $(MainObj) -o $@ # Generic exception handling support runtime. $(BUILD_OBJ_DIR)/BytecodeObj/comp_genericeh.bc: $(GenericEHObj) - $(LGCCLDPROG) -link-as-library -internalize-public-api-file=$(BUILD_SRC_DIR)/comp_genericeh.lst $(GenericEHObj) -o $@ + @echo Linking $(notdir $@) component... + $(VERB) $(LGCCLDPROG) -link-as-library -internalize-public-api-file=$(BUILD_SRC_DIR)/comp_genericeh.lst $(GenericEHObj) -o $@ # setjmp/longjmp exception handling support runtime. $(BUILD_OBJ_DIR)/BytecodeObj/comp_sjljeh.bc: $(SJLJEHObj) - $(LGCCLDPROG) -link-as-library -internalize-public-api-file=$(BUILD_SRC_DIR)/comp_sjljeh.lst $(SJLJEHObj) -o $@ + @echo Linking $(notdir $@) component... + $(VERB) $(LGCCLDPROG) -link-as-library -internalize-public-api-file=$(BUILD_SRC_DIR)/comp_sjljeh.lst $(SJLJEHObj) -o $@ # C++ exception handling support runtime. $(BUILD_OBJ_DIR)/BytecodeObj/comp_cxxeh.bc: $(CXXEHObj) - $(LGCCLDPROG) -link-as-library -internalize-public-api-file=$(BUILD_SRC_DIR)/comp_cxxeh.lst $(CXXEHObj) -o $@ + @echo Linking $(notdir $@) component... + $(VERB) $(LGCCLDPROG) -link-as-library -internalize-public-api-file=$(BUILD_SRC_DIR)/comp_cxxeh.lst $(CXXEHObj) -o $@ From lattner at cs.uiuc.edu Sat Nov 29 04:26:03 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sat Nov 29 04:26:03 2003 Subject: [llvm-commits] CVS: llvm/runtime/GCCLibraries/crtend/Makefile Message-ID: <200311291025.EAA30969@zion.cs.uiuc.edu> Changes in directory llvm/runtime/GCCLibraries/crtend: Makefile updated: 1.10 -> 1.11 --- Log message: Build _lib_crtend.a, not crtend.a --- Diffs of the changes: (+5 -5) Index: llvm/runtime/GCCLibraries/crtend/Makefile diff -u llvm/runtime/GCCLibraries/crtend/Makefile:1.10 llvm/runtime/GCCLibraries/crtend/Makefile:1.11 --- llvm/runtime/GCCLibraries/crtend/Makefile:1.10 Sat Nov 29 04:14:17 2003 +++ llvm/runtime/GCCLibraries/crtend/Makefile Sat Nov 29 04:24:57 2003 @@ -27,14 +27,14 @@ include $(LEVEL)/Makefile.common # CRTEND_A - The result of making 'all' - the final archive file. -CRTEND_A = $(DESTLIBBYTECODE)/crtend.a +CRTEND_A = $(DESTLIBBYTECODE)/libcrtend.a all:: $(CRTEND_A) # Installation simply requires copying the archive to it's new home. -$(LLVMGCCDIR)/bytecode-libs/crtend.a: $(CRTEND_A) +$(LLVMGCCDIR)/bytecode-libs/libcrtend.a: $(CRTEND_A) cp $< $@ -install:: $(LLVMGCCDIR)/bytecode-libs/crtend.a +install:: $(LLVMGCCDIR)/bytecode-libs/libcrtend.a # The four components described in the README @@ -42,9 +42,9 @@ ComponentLibs := $(Components:%=$(BUILD_OBJ_DIR)/BytecodeObj/comp_%.bc) -# We build crtend.a from the four components described in the README. +# We build libcrtend.a from the four components described in the README. $(CRTEND_A) : $(ComponentLibs) - @echo Building final crtend.a file from components + @echo Building final libcrtend.a file from components $(VERB) $(AR) $@ $(ComponentLibs) MainObj := $(BUILD_OBJ_DIR)/BytecodeObj/crtend.bc \ From lattner at cs.uiuc.edu Sat Nov 29 04:27:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sat Nov 29 04:27:01 2003 Subject: [llvm-commits] CVS: llvm/test/Programs/Makefile.programs Message-ID: <200311291026.EAA31365@zion.cs.uiuc.edu> Changes in directory llvm/test/Programs: Makefile.programs updated: 1.101 -> 1.102 --- Log message: Link to libcrtend with -l instead of filename directly, to work around gccld bugs --- Diffs of the changes: (+2 -2) Index: llvm/test/Programs/Makefile.programs diff -u llvm/test/Programs/Makefile.programs:1.101 llvm/test/Programs/Makefile.programs:1.102 --- llvm/test/Programs/Makefile.programs:1.101 Sat Nov 29 04:10:57 2003 +++ llvm/test/Programs/Makefile.programs Sat Nov 29 04:25:55 2003 @@ -194,7 +194,7 @@ $(PROGRAMS_TO_TEST:%=Output/%.llvm.bc): \ Output/%.llvm.bc: Output/%.linked.bc $(LGCCLDPROG) - $(LGCCLD) -disable-inlining $(STATS) $< -lc $(LIBS) crtend.a -o Output/$*.llvm + $(LGCCLD) -disable-inlining $(STATS) $< -lc $(LIBS) -lcrtend -o Output/$*.llvm ifneq ($(OPTPASSES),) $(LOPT) -q $(OPTPASSES) < $@ > $@.tmp $(MV) -f $@.tmp $@ @@ -202,7 +202,7 @@ $(PROGRAMS_TO_TEST:%=Output/%.llvm): \ Output/%.llvm: Output/%.linked.bc $(LGCCLDPROG) - $(LGCCLD) -disable-inlining $(STATS) $< -lc $(LIBS) crtend.a -o Output/$*.llvm + $(LGCCLD) -disable-inlining $(STATS) $< -lc $(LIBS) -lcrtend -o Output/$*.llvm ifneq ($(OPTPASSES),) $(LOPT) -q $(OPTPASSES) < $@ > $@.tmp $(MV) -f $@.tmp $@ From lattner at cs.uiuc.edu Sat Nov 29 13:46:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sat Nov 29 13:46:01 2003 Subject: [llvm-commits] CVS: llvm/tools/gccld/gccld.cpp Message-ID: <200311291945.NAA10764@zion.cs.uiuc.edu> Changes in directory llvm/tools/gccld: gccld.cpp updated: 1.66 -> 1.67 --- Log message: Fix compatibility with gcc 3.4 --- Diffs of the changes: (+3 -5) Index: llvm/tools/gccld/gccld.cpp diff -u llvm/tools/gccld/gccld.cpp:1.66 llvm/tools/gccld/gccld.cpp:1.67 --- llvm/tools/gccld/gccld.cpp:1.66 Sun Nov 23 23:31:57 2003 +++ llvm/tools/gccld/gccld.cpp Sat Nov 29 13:45:47 2003 @@ -129,9 +129,7 @@ // Count the number of entries in the old list; unsigned entries; // The number of entries in the old environment list for (entries = 0; envp[entries] != NULL; entries++) - { - ; - } + /*empty*/; // Add one more entry for the NULL pointer that ends the list. ++entries; @@ -141,8 +139,8 @@ return NULL; // Allocate a new environment list. - char **newenv; - if ((newenv = new (char *) [entries]) == NULL) + char **newenv = new char* [entries]; + if ((newenv = new char* [entries]) == NULL) return NULL; // Make a copy of the list. Don't forget the NULL that ends the list. From lattner at cs.uiuc.edu Sat Nov 29 13:56:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sat Nov 29 13:56:01 2003 Subject: [llvm-commits] CVS: llvm/include/Support/Tree.h Message-ID: <200311291955.NAA12926@zion.cs.uiuc.edu> Changes in directory llvm/include/Support: Tree.h updated: 1.9 -> 1.10 --- Log message: Hrm, how could this compile? --- Diffs of the changes: (+1 -1) Index: llvm/include/Support/Tree.h diff -u llvm/include/Support/Tree.h:1.9 llvm/include/Support/Tree.h:1.10 --- llvm/include/Support/Tree.h:1.9 Tue Nov 11 16:41:29 2003 +++ llvm/include/Support/Tree.h Sat Nov 29 13:55:02 2003 @@ -36,7 +36,7 @@ inline Tree(const std::vector &children, ConcreteTreeNode *par, const Payload &data) - : Children(children), Parent(parent), Data(data) {} + : Children(children), Parent(par), Data(data) {} // Tree dtor - Free all children inline ~Tree() { From lattner at cs.uiuc.edu Sat Nov 29 13:56:12 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sat Nov 29 13:56:12 2003 Subject: [llvm-commits] CVS: llvm/include/llvm/Analysis/InstForest.h Message-ID: <200311291955.NAA12614@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Analysis: InstForest.h updated: 1.23 -> 1.24 --- Log message: be GCC 3.4 clean --- Diffs of the changes: (+19 -19) Index: llvm/include/llvm/Analysis/InstForest.h diff -u llvm/include/llvm/Analysis/InstForest.h:1.23 llvm/include/llvm/Analysis/InstForest.h:1.24 --- llvm/include/llvm/Analysis/InstForest.h:1.23 Tue Nov 11 16:41:31 2003 +++ llvm/include/llvm/Analysis/InstForest.h Sat Nov 29 13:55:12 2003 @@ -57,10 +57,10 @@ }; // Helper functions to make accessing our data nicer... - const Value *getValue() const { return getTreeData().first.first; } - Value *getValue() { return getTreeData().first.first; } + const Value *getValue() const { return this->getTreeData().first.first; } + Value *getValue() { return this->getTreeData().first.first; } enum NodeTypeTy getNodeType() const { - return (enum NodeTypeTy)getTreeData().first.second; + return (enum NodeTypeTy)this->getTreeData().first.second; } InstTreeNode(const InstTreeNode &); // Do not implement @@ -71,8 +71,8 @@ bool CanMergeInstIntoTree(Instruction *Inst); public: // Accessor functions... - inline Payload &getData() { return getTreeData().second; } - inline const Payload &getData() const { return getTreeData().second; } + inline Payload &getData() { return this->getTreeData().second; } + inline const Payload &getData() const { return this->getTreeData().second; } // Type checking functions... inline bool isConstant() const { return getNodeType() == ConstNode; } @@ -126,8 +126,8 @@ o << getValue(); if (!isa(getValue())) o << "\n"; - for (unsigned i = 0; i < getNumChildren(); ++i) - getChild(i)->print(o, Indent+1); + for (unsigned i = 0; i < this->getNumChildren(); ++i) + this->getChild(i)->print(o, Indent+1); } }; @@ -161,9 +161,9 @@ } void removeInstFromRootList(Instruction *I) { - for (unsigned i = size(); i > 0; --i) - if (operator[](i-1)->getValue() == I) { - erase(begin()+i-1); + for (unsigned i = this->size(); i > 0; --i) + if ((*this)[i-1]->getValue() == I) { + this->erase(this->begin()+i-1); return; } } @@ -182,8 +182,8 @@ // dtor - Free the trees... ~InstForest() { - for (unsigned i = size(); i != 0; --i) - delete operator[](i-1); + for (unsigned i = this->size(); i != 0; --i) + delete (*this)[i-1]; } // getInstNode - Return the instruction node that corresponds to the specified @@ -205,7 +205,7 @@ // print - Called by operator<< below... void print(std::ostream &out) const { - for (const_iterator I = begin(), E = end(); I != E; ++I) + for (const_iterator I = this->begin(), E = this->end(); I != E; ++I) out << *I; } }; @@ -239,18 +239,18 @@ template InstTreeNode::InstTreeNode(InstForest &IF, Value *V, InstTreeNode *Parent) : super(Parent) { - getTreeData().first.first = V; // Save tree node + this->getTreeData().first.first = V; // Save tree node if (!isa(V)) { assert((isa(V) || isa(V) || isa(V) || isa(V)) && "Unrecognized value type for InstForest Partition!"); if (isa(V)) - getTreeData().first.second = ConstNode; + this->getTreeData().first.second = ConstNode; else if (isa(V)) - getTreeData().first.second = BasicBlockNode; + this->getTreeData().first.second = BasicBlockNode; else - getTreeData().first.second = TemporaryNode; + this->getTreeData().first.second = TemporaryNode; return; } @@ -259,7 +259,7 @@ Instruction *I = cast(V); if (Parent && !Parent->CanMergeInstIntoTree(I)) { // Not root node of tree, but mult uses? - getTreeData().first.second = TemporaryNode; // Must be a temporary! + this->getTreeData().first.second = TemporaryNode; // Must be a temporary! return; } @@ -287,7 +287,7 @@ } setChildren(Children); - getTreeData().first.second = InstructionNode; + this->getTreeData().first.second = InstructionNode; } } // End llvm namespace From lattner at cs.uiuc.edu Sat Nov 29 14:05:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sat Nov 29 14:05:01 2003 Subject: [llvm-commits] CVS: llvm/tools/bugpoint/ListReducer.h Message-ID: <200311292004.OAA14660@zion.cs.uiuc.edu> Changes in directory llvm/tools/bugpoint: ListReducer.h updated: 1.8 -> 1.9 --- Log message: be 3.4 happy --- Diffs of the changes: (+1 -0) Index: llvm/tools/bugpoint/ListReducer.h diff -u llvm/tools/bugpoint/ListReducer.h:1.8 llvm/tools/bugpoint/ListReducer.h:1.9 --- llvm/tools/bugpoint/ListReducer.h:1.8 Tue Nov 11 16:41:34 2003 +++ llvm/tools/bugpoint/ListReducer.h Sat Nov 29 14:04:13 2003 @@ -16,6 +16,7 @@ #define BUGPOINT_LIST_REDUCER_H #include +#include namespace llvm { From brukman at cs.uiuc.edu Sat Nov 29 18:52:01 2003 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Sat Nov 29 18:52:01 2003 Subject: [llvm-commits] CVS: llvm/lib/ExecutionEngine/JIT/Emitter.cpp Message-ID: <200311300051.SAA22367@zion.cs.uiuc.edu> Changes in directory llvm/lib/ExecutionEngine/JIT: Emitter.cpp updated: 1.33 -> 1.34 --- Log message: Go back to allocating memory for each constant separately. Since SPARCs do not allow unaligned loads, that is probably the problem I've been seeing in numerous SPARC test cases failing. X86, on the other hand, just slows down unaligned accesses, since it must make 2 aligned accesses for each unaligned one. --- Diffs of the changes: (+5 -20) Index: llvm/lib/ExecutionEngine/JIT/Emitter.cpp diff -u llvm/lib/ExecutionEngine/JIT/Emitter.cpp:1.33 llvm/lib/ExecutionEngine/JIT/Emitter.cpp:1.34 --- llvm/lib/ExecutionEngine/JIT/Emitter.cpp:1.33 Mon Nov 17 14:40:07 2003 +++ llvm/lib/ExecutionEngine/JIT/Emitter.cpp Sat Nov 29 18:50:53 2003 @@ -187,28 +187,13 @@ void Emitter::emitConstantPool(MachineConstantPool *MCP) { const std::vector &Constants = MCP->getConstants(); - if (Constants.size() == 0) return; - - std::vector ConstantSizes; - unsigned TotalSize = 0; - // Calculate how much space we will need for all the constants for (unsigned i = 0, e = Constants.size(); i != e; ++i) { + // For now we just allocate some memory on the heap, this can be + // dramatically improved. const Type *Ty = ((Value*)Constants[i])->getType(); - unsigned TySize = TheVM->getTargetData().getTypeSize(Ty); - ConstantSizes.push_back(TySize); - TotalSize += TySize; - } - // Allocate a 'pool' of memory just once - void *ConstPool = malloc(TotalSize); - if (!ConstPool) { - perror("malloc"); - abort(); - } - // Initialize each slot in the 'pool' appropriately - for (unsigned i = 0, e = Constants.size(); i != e; ++i) { - TheVM->InitializeMemory(Constants[i], ConstPool); - ConstantPoolAddresses.push_back(ConstPool); - ConstPool = (void*) ((intptr_t)ConstPool + ConstantSizes[i]); + void *Addr = malloc(TheVM->getTargetData().getTypeSize(Ty)); + TheVM->InitializeMemory(Constants[i], Addr); + ConstantPoolAddresses.push_back(Addr); } } From lattner at cs.uiuc.edu Sat Nov 29 22:24:00 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sat Nov 29 22:24:00 2003 Subject: [llvm-commits] CVS: llvm/lib/ExecutionEngine/JIT/Emitter.cpp Message-ID: <200311300423.WAA03412@zion.cs.uiuc.edu> Changes in directory llvm/lib/ExecutionEngine/JIT: Emitter.cpp updated: 1.34 -> 1.35 --- Log message: Emit constants to one contiguous block, but this time, respect alignment constraints. If this doesn't work Misha, feel free to revert it. --- Diffs of the changes: (+27 -5) Index: llvm/lib/ExecutionEngine/JIT/Emitter.cpp diff -u llvm/lib/ExecutionEngine/JIT/Emitter.cpp:1.34 llvm/lib/ExecutionEngine/JIT/Emitter.cpp:1.35 --- llvm/lib/ExecutionEngine/JIT/Emitter.cpp:1.34 Sat Nov 29 18:50:53 2003 +++ llvm/lib/ExecutionEngine/JIT/Emitter.cpp Sat Nov 29 22:23:21 2003 @@ -17,11 +17,12 @@ #define _POSIX_MAPPED_FILES #endif #include "VM.h" +#include "llvm/Constant.h" +#include "llvm/Module.h" #include "llvm/CodeGen/MachineCodeEmitter.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/Target/TargetData.h" -#include "llvm/Module.h" #include "Support/Debug.h" #include "Support/Statistic.h" #include "Config/unistd.h" @@ -187,11 +188,32 @@ void Emitter::emitConstantPool(MachineConstantPool *MCP) { const std::vector &Constants = MCP->getConstants(); + if (Constants.empty()) return; + + std::vector ConstantOffset; + ConstantOffset.reserve(Constants.size()); + + // Calculate how much space we will need for all the constants, and the offset + // each one will live in. + unsigned TotalSize = 0; + for (unsigned i = 0, e = Constants.size(); i != e; ++i) { + const Type *Ty = Constants[i]->getType(); + unsigned Size = TheVM->getTargetData().getTypeSize(Ty); + unsigned Alignment = TheVM->getTargetData().getTypeAlignment(Ty); + // Make sure to take into account the alignment requirements of the type. + TotalSize = (TotalSize + Alignment-1) & ~(Alignment-1); + + // Remember the offset this element lives at. + ConstantOffset.push_back(TotalSize); + TotalSize += Size; // Reserve space for the constant. + } + + // Now that we know how much memory to allocate, do so. + char *Pool = new char[TotalSize]; + + // Actually output all of the constants, and remember their addresses. for (unsigned i = 0, e = Constants.size(); i != e; ++i) { - // For now we just allocate some memory on the heap, this can be - // dramatically improved. - const Type *Ty = ((Value*)Constants[i])->getType(); - void *Addr = malloc(TheVM->getTargetData().getTypeSize(Ty)); + void *Addr = Pool + ConstantOffset[i]; TheVM->InitializeMemory(Constants[i], Addr); ConstantPoolAddresses.push_back(Addr); } From alkis at cs.uiuc.edu Sat Nov 29 23:16:00 2003 From: alkis at cs.uiuc.edu (Alkis Evlogimenos) Date: Sat Nov 29 23:16:00 2003 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/RegAllocLinearScan.cpp Message-ID: <200311300515.XAA17607@morpheus.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: RegAllocLinearScan.cpp updated: 1.2 -> 1.3 --- Log message: Remove "numReloaded" statistic. --- Diffs of the changes: (+0 -2) Index: llvm/lib/CodeGen/RegAllocLinearScan.cpp diff -u llvm/lib/CodeGen/RegAllocLinearScan.cpp:1.2 llvm/lib/CodeGen/RegAllocLinearScan.cpp:1.3 --- llvm/lib/CodeGen/RegAllocLinearScan.cpp:1.2 Wed Nov 19 21:32:25 2003 +++ llvm/lib/CodeGen/RegAllocLinearScan.cpp Sat Nov 29 23:15:36 2003 @@ -34,7 +34,6 @@ namespace { Statistic<> numSpilled ("ra-linearscan", "Number of registers spilled"); - Statistic<> numReloaded("ra-linearscan", "Number of registers reloaded"); class RA : public MachineFunctionPass { public: @@ -766,7 +765,6 @@ const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg); int frameIndex = findOrCreateStackSlot(virtReg); DEBUG(std::cerr << " from stack slot #" << frameIndex << '\n'); - ++numReloaded; instrAdded_ += mri_->loadRegFromStackSlot(*currentMbb_, currentInstr_, physReg, frameIndex, rc); assignVirt2PhysReg(virtReg, physReg); From lattner at cs.uiuc.edu Sat Nov 29 23:47:00 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sat Nov 29 23:47:00 2003 Subject: [llvm-commits] CVS: llvm/docs/CommandGuide/index.html Message-ID: <200311300546.XAA18369@zion.cs.uiuc.edu> Changes in directory llvm/docs/CommandGuide: index.html updated: 1.11 -> 1.12 --- Log message: A line was missing --- Diffs of the changes: (+2 -1) Index: llvm/docs/CommandGuide/index.html diff -u llvm/docs/CommandGuide/index.html:1.11 llvm/docs/CommandGuide/index.html:1.12 --- llvm/docs/CommandGuide/index.html:1.11 Sat Nov 1 20:10:54 2003 +++ llvm/docs/CommandGuide/index.html Sat Nov 29 23:46:14 2003 @@ -43,6 +43,7 @@

    llc
    Compile an LLVM bytecode program into native machine code. +

    lli
    @@ -115,7 +116,7 @@
    Maintained by the LLVM Team.
    -Last modified: $Date: 2003/11/02 02:10:54 $ +Last modified: $Date: 2003/11/30 05:46:14 $
    From lattner at cs.uiuc.edu Sat Nov 29 23:49:00 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sat Nov 29 23:49:00 2003 Subject: [llvm-commits] CVS: llvm-www/www-index.html Message-ID: <200311300548.XAA18578@zion.cs.uiuc.edu> Changes in directory llvm-www: www-index.html updated: 1.90 -> 1.91 --- Log message: Make the index page more "inviting" --- Diffs of the changes: (+51 -21) Index: llvm-www/www-index.html diff -u llvm-www/www-index.html:1.90 llvm-www/www-index.html:1.91 --- llvm-www/www-index.html:1.90 Fri Nov 21 12:29:18 2003 +++ llvm-www/www-index.html Sat Nov 29 23:47:57 2003 @@ -3,12 +3,12 @@ - -
    +
    LLVM Overview
    - - Low Level Virtual Machine (LLVM) is:
      -
    1. +

      + Low Level Virtual Machine (LLVM) is:

        +
      1. A compilation strategy - Fundamentally, LLVM is a compilation strategy designed to enable effective program optimization across the entire lifetime of a @@ -17,9 +17,9 @@ run-time and offline (i.e., after software is installed), while remaining transparent to developers and maintaining compatibility with - existing build scripts.

      2. + existing build scripts.

        -
      3. A virtual +
      4. A virtual instruction set - LLVM is a low-level object code representation that uses simple RISC-like instructions, but provides rich, language-independent, @@ -29,37 +29,67 @@ while remaining light-weight enough to be attached to the executable. This combination is key to allowing link-time, run-time, and offline - transformations.

      5. + transformations.

        -
      6. A compiler +
      7. A compiler infrastructure - LLVM is also a collection of source code that implements the language and compilation strategy. The primary components of the LLVM - infrastructure are a GCC-based C & C++ front-end, a link-time + infrastructure are a GCC-based C & C++ front-end, a link-time optimization framework with a growing set of global and interprocedural analyses and transformations, static back-ends for the SPARC v9 and X86 architectures, a - back-end which emits C, and a Just-In-Time compiler for + back-end which emits portable C code, and a Just-In-Time compiler for X86 and SPARC v9 processors. See "Current Projects" for information about other components under - development.

      8. -
      -

      LLVM is a product of the Lifelong - Code Optimization Project, led by Vikram - Adve in the Department - of Computer Science at the University of - Illinois, Urbana-Champaign.

      + development.

    2. +

    +

    + LLVM is a robust system, particularly well suited for developing new mid-level + language-independent analyses and optimizations of all sorts, including + those that require + extensive interprocedural analysis. LLVM is also a great target for + front-end development for conventional or + research programming languages, including those which require compile-time, + link-time, or run-time optimization for effective implementation. +

    + +

    LLVM was originally a product of the Lifelong + Code Optimization Project, led by Vikram Adve in the Department of Computer Science at the + University of Illinois, + Urbana-Champaign. Since our initial public release, however, our + scope has expanded to include contributions from several other people! +

    + +
    Want to learn more?
    +

    + + If you'd like to learn more about LLVM, please take a look at the extensive + documentation for LLVM. In particular, all + of the tools distributed with LLVM are described in the LLVM Command Guide. If you're interested in + what source-language features and optimizations we support, please check + out the LLVM demo page. If you'd like to browse through + the source code, either check out doxygen or download the most recent release. Finally, if you're + interested in LLVM, have questions, and can't find any answers, please ask + on the LLVM developer's + mailing list. +

    + From lattner at cs.uiuc.edu Sun Nov 30 00:14:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sun Nov 30 00:14:01 2003 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/PeepholeOptimizer.cpp Message-ID: <200311300613.AAA19494@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: PeepholeOptimizer.cpp updated: 1.6 -> 1.7 --- Log message: Finegrainify namespacification --- Diffs of the changes: (+2 -4) Index: llvm/lib/Target/X86/PeepholeOptimizer.cpp diff -u llvm/lib/Target/X86/PeepholeOptimizer.cpp:1.6 llvm/lib/Target/X86/PeepholeOptimizer.cpp:1.7 --- llvm/lib/Target/X86/PeepholeOptimizer.cpp:1.6 Tue Nov 11 16:41:33 2003 +++ llvm/lib/Target/X86/PeepholeOptimizer.cpp Sun Nov 30 00:13:25 2003 @@ -14,8 +14,7 @@ #include "X86.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstrBuilder.h" - -namespace llvm { +using namespace llvm; namespace { struct PH : public MachineFunctionPass { @@ -28,7 +27,7 @@ }; } -FunctionPass *createX86PeepholeOptimizerPass() { return new PH(); } +FunctionPass *llvm::createX86PeepholeOptimizerPass() { return new PH(); } bool PH::runOnMachineFunction(MachineFunction &MF) { bool Changed = false; @@ -134,4 +133,3 @@ } } -} // End llvm namespace From lattner at cs.uiuc.edu Sun Nov 30 03:23:02 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sun Nov 30 03:23:02 2003 Subject: [llvm-commits] CVS: llvm/runtime/GCCLibraries/crtend/Makefile Message-ID: <200311300922.DAA01449@zion.cs.uiuc.edu> Changes in directory llvm/runtime/GCCLibraries/crtend: Makefile updated: 1.11 -> 1.12 --- Log message: add missing dependency --- Diffs of the changes: (+1 -1) Index: llvm/runtime/GCCLibraries/crtend/Makefile diff -u llvm/runtime/GCCLibraries/crtend/Makefile:1.11 llvm/runtime/GCCLibraries/crtend/Makefile:1.12 --- llvm/runtime/GCCLibraries/crtend/Makefile:1.11 Sat Nov 29 04:24:57 2003 +++ llvm/runtime/GCCLibraries/crtend/Makefile Sun Nov 30 03:22:42 2003 @@ -43,7 +43,7 @@ # We build libcrtend.a from the four components described in the README. -$(CRTEND_A) : $(ComponentLibs) +$(CRTEND_A) : $(ComponentLibs) $(DESTLIBBYTECODE)/.dir @echo Building final libcrtend.a file from components $(VERB) $(AR) $@ $(ComponentLibs) From alkis at cs.uiuc.edu Sun Nov 30 17:41:01 2003 From: alkis at cs.uiuc.edu (Alkis Evlogimenos) Date: Sun Nov 30 17:41:01 2003 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/RegAllocLinearScan.cpp Message-ID: <200311302340.RAA19183@morpheus.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: RegAllocLinearScan.cpp updated: 1.3 -> 1.4 --- Log message: Print instructions before register allocation is performed. Also fix bug where spill instructions were added to the next basic block instead of the end of the current one if the instruction that required the spill was the last in the block. --- Diffs of the changes: (+26 -6) Index: llvm/lib/CodeGen/RegAllocLinearScan.cpp diff -u llvm/lib/CodeGen/RegAllocLinearScan.cpp:1.3 llvm/lib/CodeGen/RegAllocLinearScan.cpp:1.4 --- llvm/lib/CodeGen/RegAllocLinearScan.cpp:1.3 Sat Nov 29 23:15:36 2003 +++ llvm/lib/CodeGen/RegAllocLinearScan.cpp Sun Nov 30 17:40:39 2003 @@ -203,6 +203,23 @@ v2pMap_.clear(); v2ssMap_.clear(); + DEBUG( + for (MachineBasicBlockPtrs::iterator + mbbi = mbbs_.begin(), mbbe = mbbs_.end(); + mbbi != mbbe; ++mbbi) { + MachineBasicBlock* mbb = *mbbi; + std::cerr << mbb->getBasicBlock()->getName() << '\n'; + for (MachineBasicBlock::iterator + ii = mbb->begin(), ie = mbb->end(); + ii != ie; ++ii) { + MachineInstr* instr = *ii; + + std::cerr << "\t"; + instr->print(std::cerr, *tm_); + } + } + ); + // FIXME: this will work only for the X86 backend. I need to // device an algorthm to select the minimal (considering register // aliasing) number of temp registers to reserve so that we have 2 @@ -276,12 +293,6 @@ DEBUG(std::cerr << "\tinstruction: "; (*currentInstr_)->print(std::cerr, *tm_);); - DEBUG(std::cerr << "\t\tspilling temporarily defined operands " - "of previous instruction:\n"); - for (unsigned i = 0, e = tempDefOperands_.size(); i != e; ++i) { - spillVirtReg(tempDefOperands_[i]); - } - tempDefOperands_.clear(); // use our current mapping and actually replace and // virtual register with its allocated physical registers @@ -422,6 +433,15 @@ (*currentInstr_)->SetMachineOperandReg(1, regA); } } + + DEBUG(std::cerr << "\t\tspilling temporarily defined operands " + "of this instruction:\n"); + ++currentInstr_; // we want to insert after this instruction + for (unsigned i = 0, e = tempDefOperands_.size(); i != e; ++i) { + spillVirtReg(tempDefOperands_[i]); + } + --currentInstr_; // restore currentInstr_ iterator + tempDefOperands_.clear(); } for (unsigned i = 0, e = p2vMap_.size(); i != e; ++i) { From lattner at cs.uiuc.edu Sun Nov 30 23:13:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sun Nov 30 23:13:01 2003 Subject: [llvm-commits] CVS: llvm/docs/Stacker.html Message-ID: <200312010512.XAA10468@zion.cs.uiuc.edu> Changes in directory llvm/docs: Stacker.html updated: 1.4 -> 1.5 --- Log message: fix broken link --- Diffs of the changes: (+2 -2) Index: llvm/docs/Stacker.html diff -u llvm/docs/Stacker.html:1.4 llvm/docs/Stacker.html:1.5 --- llvm/docs/Stacker.html:1.4 Mon Nov 24 19:44:27 2003 +++ llvm/docs/Stacker.html Sun Nov 30 23:12:09 2003 @@ -1337,7 +1337,7 @@
  • Provide for I/O to arbitrary files instead of just stdin/stdout.
  • Write additional built-in words.
  • Write additional sample Stacker programs.
  • -
  • Add your own compiler writing experiences and tips in the +
  • Add your own compiler writing experiences and tips in the Lessons I Learned About LLVM section.
  • @@ -1346,6 +1346,6 @@ +
    Last modified: $Date: 2003/12/01 05:12:09 $ From lattner at cs.uiuc.edu Sun Nov 30 23:15:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sun Nov 30 23:15:01 2003 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/Printer.cpp Message-ID: <200312010514.XAA10523@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: Printer.cpp updated: 1.73 -> 1.74 --- Log message: generalize the instruction types permitted a bit --- Diffs of the changes: (+42 -35) Index: llvm/lib/Target/X86/Printer.cpp diff -u llvm/lib/Target/X86/Printer.cpp:1.73 llvm/lib/Target/X86/Printer.cpp:1.74 --- llvm/lib/Target/X86/Printer.cpp:1.73 Sat Nov 22 01:18:25 2003 +++ llvm/lib/Target/X86/Printer.cpp Sun Nov 30 23:13:56 2003 @@ -783,8 +783,13 @@ // assert(MI->getNumOperands() >= 4 && MI->getNumOperands() <= 5 && isMem(MI, 0) && "Bad MRMSxM format!"); - assert((MI->getNumOperands() != 5 || MI->getOperand(4).isImmediate()) && + assert((MI->getNumOperands() != 5 || + (MI->getOperand(4).isImmediate() || + MI->getOperand(4).isGlobalAddress())) && "Bad MRMSxM format!"); + + const MachineOperand &Op3 = MI->getOperand(3); + // Bug: The 80-bit FP store-pop instruction "fstp XWORD PTR [...]" // is misassembled by gas in intel_syntax mode as its 32-bit // equivalent "fstp DWORD PTR [...]". Workaround: Output the raw @@ -792,57 +797,59 @@ if (MI->getOpCode() == X86::FSTPr80) { if ((MI->getOperand(0).getReg() == X86::ESP) && (MI->getOperand(1).getImmedValue() == 1)) { - int DispVal = MI->getOperand(3).getImmedValue(); - if ((DispVal < -128) || (DispVal > 127)) { // 4 byte disp. - unsigned int val = (unsigned int) DispVal; + if (Op3.isImmediate() && + Op3.getImmedValue() >= -128 && Op3.getImmedValue() <= 127) { + // 1 byte disp. + O << ".byte 0xdb, 0x7c, 0x24, 0x" << std::hex + << ((unsigned)Op3.getImmedValue() & 255) << std::dec << "\t# "; + } else { O << ".byte 0xdb, 0xbc, 0x24\n\t"; - O << ".long 0x" << std::hex << (unsigned) val << std::dec << "\t# "; - } else { // 1 byte disp. - unsigned char val = (unsigned char) DispVal; - O << ".byte 0xdb, 0x7c, 0x24, 0x" << std::hex << (unsigned) val - << std::dec << "\t# "; + O << ".long "; + printOp(Op3); + O << "\t# "; } } } + // Bug: The 80-bit FP load instruction "fld XWORD PTR [...]" is // misassembled by gas in intel_syntax mode as its 32-bit // equivalent "fld DWORD PTR [...]". Workaround: Output the raw // opcode bytes instead of the instruction. - if (MI->getOpCode() == X86::FLDr80) { - if ((MI->getOperand(0).getReg() == X86::ESP) - && (MI->getOperand(1).getImmedValue() == 1)) { - int DispVal = MI->getOperand(3).getImmedValue(); - if ((DispVal < -128) || (DispVal > 127)) { // 4 byte disp. - unsigned int val = (unsigned int) DispVal; - O << ".byte 0xdb, 0xac, 0x24\n\t"; - O << ".long 0x" << std::hex << (unsigned) val << std::dec << "\t# "; - } else { // 1 byte disp. - unsigned char val = (unsigned char) DispVal; - O << ".byte 0xdb, 0x6c, 0x24, 0x" << std::hex << (unsigned) val - << std::dec << "\t# "; - } + if (MI->getOpCode() == X86::FLDr80 && + MI->getOperand(0).getReg() == X86::ESP && + MI->getOperand(1).getImmedValue() == 1) { + if (Op3.isImmediate() && Op3.getImmedValue() >= -128 && + Op3.getImmedValue() <= 127) { // 1 byte displacement + O << ".byte 0xdb, 0x6c, 0x24, 0x" << std::hex + << ((unsigned)Op3.getImmedValue() & 255) << std::dec << "\t# "; + } else { + O << ".byte 0xdb, 0xac, 0x24\n\t"; + O << ".long "; + printOp(Op3); + O << "\t# "; } } + // Bug: gas intel_syntax mode treats "fild QWORD PTR [...]" as an // invalid opcode, saying "64 bit operations are only supported in // 64 bit modes." libopcodes disassembles it as "fild DWORD PTR // [...]", which is wrong. Workaround: Output the raw opcode bytes // instead of the instruction. - if (MI->getOpCode() == X86::FILDr64) { - if ((MI->getOperand(0).getReg() == X86::ESP) - && (MI->getOperand(1).getImmedValue() == 1)) { - int DispVal = MI->getOperand(3).getImmedValue(); - if ((DispVal < -128) || (DispVal > 127)) { // 4 byte disp. - unsigned int val = (unsigned int) DispVal; - O << ".byte 0xdf, 0xac, 0x24\n\t"; - O << ".long 0x" << std::hex << (unsigned) val << std::dec << "\t# "; - } else { // 1 byte disp. - unsigned char val = (unsigned char) DispVal; - O << ".byte 0xdf, 0x6c, 0x24, 0x" << std::hex << (unsigned) val - << std::dec << "\t# "; - } + if (MI->getOpCode() == X86::FILDr64 && + MI->getOperand(0).getReg() == X86::ESP && + MI->getOperand(1).getImmedValue() == 1) { + if (Op3.isImmediate() && Op3.getImmedValue() >= -128 && + Op3.getImmedValue() <= 127) { // 1 byte displacement + O << ".byte 0xdf, 0x6c, 0x24, 0x" << std::hex + << ((unsigned)Op3.getImmedValue() & 255) << std::dec << "\t# "; + } else { + O << ".byte 0xdf, 0xac, 0x24\n\t"; + O << ".long "; + printOp(Op3); + O << std::dec << "\t# "; } } + // Bug: gas intel_syntax mode treats "fistp QWORD PTR [...]" as // an invalid opcode, saying "64 bit operations are only // supported in 64 bit modes." libopcodes disassembles it as From lattner at cs.uiuc.edu Sun Nov 30 23:16:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sun Nov 30 23:16:01 2003 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/PeepholeOptimizer.cpp Message-ID: <200312010515.XAA10590@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: PeepholeOptimizer.cpp updated: 1.7 -> 1.8 --- Log message: Add a new SSA-based peephole optimizer which includes copy propagation and folding of instructions into addressing modes. This creates lots of dead instructions, which are currently not deleted. It also creates a lot of instructions that the X86 backend currently cannot handle. :( --- Diffs of the changes: (+283 -2) Index: llvm/lib/Target/X86/PeepholeOptimizer.cpp diff -u llvm/lib/Target/X86/PeepholeOptimizer.cpp:1.7 llvm/lib/Target/X86/PeepholeOptimizer.cpp:1.8 --- llvm/lib/Target/X86/PeepholeOptimizer.cpp:1.7 Sun Nov 30 00:13:25 2003 +++ llvm/lib/Target/X86/PeepholeOptimizer.cpp Sun Nov 30 23:15:28 2003 @@ -14,9 +14,12 @@ #include "X86.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstrBuilder.h" +#include "Support/Statistic.h" using namespace llvm; namespace { + Statistic<> NumPHOpts("x86-peephole", + "Number of peephole optimization performed"); struct PH : public MachineFunctionPass { virtual bool runOnMachineFunction(MachineFunction &MF); @@ -34,9 +37,10 @@ for (MachineFunction::iterator BI = MF.begin(), E = MF.end(); BI != E; ++BI) for (MachineBasicBlock::iterator I = BI->begin(); I != BI->end(); ) - if (PeepholeOptimize(*BI, I)) + if (PeepholeOptimize(*BI, I)) { Changed = true; - else + ++NumPHOpts; + } else ++I; return Changed; @@ -133,3 +137,280 @@ } } +namespace { + class UseDefChains : public MachineFunctionPass { + std::vector DefiningInst; + public: + // getDefinition - Return the machine instruction that defines the specified + // SSA virtual register. + MachineInstr *getDefinition(unsigned Reg) { + assert(Reg >= MRegisterInfo::FirstVirtualRegister && + "use-def chains only exist for SSA registers!"); + assert(Reg - MRegisterInfo::FirstVirtualRegister < DefiningInst.size() && + "Unknown register number!"); + assert(DefiningInst[Reg-MRegisterInfo::FirstVirtualRegister] && + "Unknown register number!"); + return DefiningInst[Reg-MRegisterInfo::FirstVirtualRegister]; + } + + // setDefinition - Update the use-def chains to indicate that MI defines + // register Reg. + void setDefinition(unsigned Reg, MachineInstr *MI) { + if (Reg-MRegisterInfo::FirstVirtualRegister >= DefiningInst.size()) + DefiningInst.resize(Reg-MRegisterInfo::FirstVirtualRegister+1); + DefiningInst[Reg-MRegisterInfo::FirstVirtualRegister] = MI; + } + + // removeDefinition - Update the use-def chains to forget about Reg + // entirely. + void removeDefinition(unsigned Reg) { + assert(getDefinition(Reg)); // Check validity + DefiningInst[Reg-MRegisterInfo::FirstVirtualRegister] = 0; + } + + virtual bool runOnMachineFunction(MachineFunction &MF) { + for (MachineFunction::iterator BI = MF.begin(), E = MF.end(); BI!=E; ++BI) + for (MachineBasicBlock::iterator I = BI->begin(); I != BI->end(); ++I) { + MachineInstr *MI = *I; + for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { + MachineOperand &MO = MI->getOperand(i); + if (MO.isVirtualRegister() && MO.opIsDefOnly()) + setDefinition(MO.getReg(), MI); + } + } + return false; + } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + MachineFunctionPass::getAnalysisUsage(AU); + } + + virtual void releaseMemory() { + std::vector().swap(DefiningInst); + } + }; + + RegisterAnalysis X("use-def-chains", + "use-def chain construction for machine code"); +} + + +namespace { + Statistic<> NumSSAPHOpts("x86-ssa-peephole", + "Number of SSA peephole optimization performed"); + + /// SSAPH - This pass is an X86-specific, SSA-based, peephole optimizer. This + /// pass is really a bad idea: a better instruction selector should completely + /// supersume it. However, that will take some time to develop, and the + /// simple things this can do are important now. + class SSAPH : public MachineFunctionPass { + UseDefChains *UDC; + public: + virtual bool runOnMachineFunction(MachineFunction &MF); + + bool PeepholeOptimize(MachineBasicBlock &MBB, + MachineBasicBlock::iterator &I); + + virtual const char *getPassName() const { + return "X86 SSA-based Peephole Optimizer"; + } + + /// Propagate - Set MI[DestOpNo] = Src[SrcOpNo], optionally change the + /// opcode of the instruction, then return true. + bool Propagate(MachineInstr *MI, unsigned DestOpNo, + MachineInstr *Src, unsigned SrcOpNo, unsigned NewOpcode = 0){ + MI->getOperand(DestOpNo) = Src->getOperand(SrcOpNo); + if (NewOpcode) MI->setOpcode(NewOpcode); + return true; + } + + /// OptimizeAddress - If we can fold the addressing arithmetic for this + /// memory instruction into the instruction itself, do so and return true. + bool OptimizeAddress(MachineInstr *MI, unsigned OpNo); + + /// getDefininingInst - If the specified operand is a read of an SSA + /// register, return the machine instruction defining it, otherwise, return + /// null. + MachineInstr *getDefiningInst(MachineOperand &MO) { + if (!MO.opIsUse() || !MO.isVirtualRegister()) return 0; + return UDC->getDefinition(MO.getReg()); + } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequired(); + AU.addPreserved(); + MachineFunctionPass::getAnalysisUsage(AU); + } + }; +} + +FunctionPass *llvm::createX86SSAPeepholeOptimizerPass() { return new SSAPH(); } + +bool SSAPH::runOnMachineFunction(MachineFunction &MF) { + bool Changed = false; + bool LocalChanged; + + UDC = &getAnalysis(); + + do { + LocalChanged = false; + + for (MachineFunction::iterator BI = MF.begin(), E = MF.end(); BI != E; ++BI) + for (MachineBasicBlock::iterator I = BI->begin(); I != BI->end(); ) + if (PeepholeOptimize(*BI, I)) { + LocalChanged = true; + ++NumSSAPHOpts; + } else + ++I; + Changed |= LocalChanged; + } while (LocalChanged); + + return Changed; +} + +static bool isValidScaleAmount(unsigned Scale) { + return Scale == 1 || Scale == 2 || Scale == 4 || Scale == 8; +} + +/// OptimizeAddress - If we can fold the addressing arithmetic for this +/// memory instruction into the instruction itself, do so and return true. +bool SSAPH::OptimizeAddress(MachineInstr *MI, unsigned OpNo) { + MachineOperand &BaseRegOp = MI->getOperand(OpNo+0); + MachineOperand &ScaleOp = MI->getOperand(OpNo+1); + MachineOperand &IndexRegOp = MI->getOperand(OpNo+2); + MachineOperand &DisplacementOp = MI->getOperand(OpNo+3); + + unsigned BaseReg = BaseRegOp.hasAllocatedReg() ? BaseRegOp.getReg() : 0; + unsigned Scale = ScaleOp.getImmedValue(); + unsigned IndexReg = IndexRegOp.hasAllocatedReg() ? IndexRegOp.getReg() : 0; + + bool Changed = false; + + // If the base register is unset, and the index register is set with a scale + // of 1, move it to be the base register. + if (BaseRegOp.hasAllocatedReg() && BaseReg == 0 && + Scale == 1 && IndexReg != 0) { + BaseRegOp.setReg(IndexReg); + IndexRegOp.setReg(0); + return true; + } + + // Attempt to fold instructions used by the base register into the instruction + if (MachineInstr *DefInst = getDefiningInst(BaseRegOp)) { + switch (DefInst->getOpcode()) { + case X86::MOVir32: + // If there is no displacement set for this instruction set one now. + // FIXME: If we can fold two immediates together, we should do so! + if (DisplacementOp.isImmediate() && !DisplacementOp.getImmedValue()) { + if (DefInst->getOperand(1).isImmediate()) { + BaseRegOp.setReg(0); + return Propagate(MI, OpNo+3, DefInst, 1); + } + } + break; + + case X86::ADDrr32: + // If the source is a register-register add, and we do not yet have an + // index register, fold the add into the memory address. + if (IndexReg == 0) { + BaseRegOp = DefInst->getOperand(1); + IndexRegOp = DefInst->getOperand(2); + ScaleOp.setImmedValue(1); + return true; + } + break; + + case X86::SHLir32: + // If this shift could be folded into the index portion of the address if + // it were the index register, move it to the index register operand now, + // so it will be folded in below. + if ((Scale == 1 || (IndexReg == 0 && IndexRegOp.hasAllocatedReg())) && + DefInst->getOperand(2).getImmedValue() < 4) { + std::swap(BaseRegOp, IndexRegOp); + ScaleOp.setImmedValue(1); Scale = 1; + std::swap(IndexReg, BaseReg); + Changed = true; + break; + } + } + } + + // Attempt to fold instructions used by the index into the instruction + if (MachineInstr *DefInst = getDefiningInst(IndexRegOp)) { + switch (DefInst->getOpcode()) { + case X86::SHLir32: { + // Figure out what the resulting scale would be if we folded this shift. + unsigned ResScale = Scale * (1 << DefInst->getOperand(2).getImmedValue()); + if (isValidScaleAmount(ResScale)) { + IndexRegOp = DefInst->getOperand(1); + ScaleOp.setImmedValue(ResScale); + return true; + } + break; + } + } + } + + return Changed; +} + +bool SSAPH::PeepholeOptimize(MachineBasicBlock &MBB, + MachineBasicBlock::iterator &I) { + MachineInstr *MI = *I; + MachineInstr *Next = (I+1 != MBB.end()) ? *(I+1) : 0; + + bool Changed = false; + + // Scan the operands of this instruction. If any operands are + // register-register copies, replace the operand with the source. + for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) + // Is this an SSA register use? + if (MachineInstr *DefInst = getDefiningInst(MI->getOperand(i))) + // If the operand is a vreg-vreg copy, it is always safe to replace the + // source value with the input operand. + if (DefInst->getOpcode() == X86::MOVrr8 || + DefInst->getOpcode() == X86::MOVrr16 || + DefInst->getOpcode() == X86::MOVrr32) { + // Don't propagate physical registers into PHI nodes... + if (MI->getOpcode() != X86::PHI || + DefInst->getOperand(1).isVirtualRegister()) + Changed = Propagate(MI, i, DefInst, 1); + } + + + // Perform instruction specific optimizations. + switch (MI->getOpcode()) { + + // Register to memory stores. Format: , srcreg + case X86::MOVrm32: case X86::MOVrm16: case X86::MOVrm8: + case X86::MOVim32: case X86::MOVim16: case X86::MOVim8: + // Check to see if we can fold the source instruction into this one... + if (MachineInstr *SrcInst = getDefiningInst(MI->getOperand(4))) { + switch (SrcInst->getOpcode()) { + // Fold the immediate value into the store, if possible. + case X86::MOVir8: return Propagate(MI, 4, SrcInst, 1, X86::MOVim8); + case X86::MOVir16: return Propagate(MI, 4, SrcInst, 1, X86::MOVim16); + case X86::MOVir32: return Propagate(MI, 4, SrcInst, 1, X86::MOVim32); + default: break; + } + } + + // If we can optimize the addressing expression, do so now. + if (OptimizeAddress(MI, 0)) + return true; + break; + + case X86::MOVmr32: + case X86::MOVmr16: + case X86::MOVmr8: + // If we can optimize the addressing expression, do so now. + if (OptimizeAddress(MI, 1)) + return true; + break; + + default: break; + } + + return Changed; +} From lattner at cs.uiuc.edu Sun Nov 30 23:19:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sun Nov 30 23:19:01 2003 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86.h X86TargetMachine.cpp Message-ID: <200312010518.XAA10637@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86.h updated: 1.21 -> 1.22 X86TargetMachine.cpp updated: 1.37 -> 1.38 --- Log message: Add an option to enable the SSA based peephole optimizer. Eventually this pass will provide substantially better code in the interim between when we have a crappy isel and nice isel. Unfortunately doing so requires fixing the backend to actually SUPPORT all of the fancy addressing modes that we now generate, and writing a DCE pass for machine code. Each of these is a fairly substantial job, so this will remain disabled for the immediate future. :( --- Diffs of the changes: (+13 -4) Index: llvm/lib/Target/X86/X86.h diff -u llvm/lib/Target/X86/X86.h:1.21 llvm/lib/Target/X86/X86.h:1.22 --- llvm/lib/Target/X86/X86.h:1.21 Tue Nov 11 16:41:33 2003 +++ llvm/lib/Target/X86/X86.h Sun Nov 30 23:18:30 2003 @@ -34,6 +34,11 @@ /// FunctionPass *createX86PatternInstructionSelector(TargetMachine &TM); +/// createX86SSAPeepholeOptimizerPass - Create a pass to perform SSA-based X86 +/// specific peephole optimizations. +/// +FunctionPass *createX86SSAPeepholeOptimizerPass(); + /// createX86PeepholeOptimizer - Create a pass to perform X86 specific peephole /// optimizations. /// Index: llvm/lib/Target/X86/X86TargetMachine.cpp diff -u llvm/lib/Target/X86/X86TargetMachine.cpp:1.37 llvm/lib/Target/X86/X86TargetMachine.cpp:1.38 --- llvm/lib/Target/X86/X86TargetMachine.cpp:1.37 Tue Nov 11 16:41:33 2003 +++ llvm/lib/Target/X86/X86TargetMachine.cpp Sun Nov 30 23:18:30 2003 @@ -29,6 +29,8 @@ cl::desc("Print generated machine code")); cl::opt NoPatternISel("disable-pattern-isel", cl::init(true), cl::desc("Use the 'simple' X86 instruction selector")); + cl::opt NoSSAPeephole("disable-ssa-peephole", cl::init(true), + cl::desc("Disable the ssa-based peephole optimizer (defaults to disabled)")); } // allocateX86TargetMachine - Allocate and return a subclass of TargetMachine @@ -66,9 +68,9 @@ else PM.add(createX86PatternInstructionSelector(*this)); - // TODO: optional optimizations go here - - // FIXME: Add SSA based peephole optimizer here. + // Run optional SSA-based machine code optimizations next... + if (!NoSSAPeephole) + PM.add(createX86SSAPeepholeOptimizerPass()); // Print the instruction selected machine code... if (PrintCode) @@ -117,7 +119,9 @@ else PM.add(createX86PatternInstructionSelector(*this)); - // TODO: optional optimizations go here + // Run optional SSA-based machine code optimizations next... + if (!NoSSAPeephole) + PM.add(createX86SSAPeepholeOptimizerPass()); // FIXME: Add SSA based peephole optimizer here. From lattner at cs.uiuc.edu Sun Nov 30 23:31:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sun Nov 30 23:31:01 2003 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/MachineInstr.h Message-ID: <200312010530.XAA10934@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: MachineInstr.h updated: 1.115 -> 1.116 --- Log message: Add some "useful" methods --- Diffs of the changes: (+6 -0) Index: llvm/include/llvm/CodeGen/MachineInstr.h diff -u llvm/include/llvm/CodeGen/MachineInstr.h:1.115 llvm/include/llvm/CodeGen/MachineInstr.h:1.116 --- llvm/include/llvm/CodeGen/MachineInstr.h:1.115 Tue Nov 11 16:41:31 2003 +++ llvm/include/llvm/CodeGen/MachineInstr.h Sun Nov 30 23:30:29 2003 @@ -261,6 +261,8 @@ return regNum; } int64_t getImmedValue() const { assert(isImmediate()); return immedVal; } + void setImmedValue(int64_t ImmVal) { assert(isImmediate()); immedVal=ImmVal; } + MachineBasicBlock *getMachineBasicBlock() const { assert(isMachineBasicBlock() && "Can't get MBB in non-MBB operand!"); return MBB; @@ -305,6 +307,10 @@ // ********** TODO: get rid of this duplicate code! *********** unsigned getReg() const { return getAllocatedRegNum(); + } + void setReg(unsigned Reg) { + assert(hasAllocatedReg() && "This operand cannot have a register number!"); + regNum = Reg; } friend std::ostream& operator<<(std::ostream& os, const MachineOperand& mop); From gaeke at cs.uiuc.edu Sun Nov 30 23:32:00 2003 From: gaeke at cs.uiuc.edu (Brian Gaeke) Date: Sun Nov 30 23:32:00 2003 Subject: [llvm-commits] CVS: llvm/utils/NightlyTest.pl Message-ID: <200312010531.XAA10948@zion.cs.uiuc.edu> Changes in directory llvm/utils: NightlyTest.pl updated: 1.39 -> 1.40 --- Log message: This may fix the "0 dirs" stuff we get in the nightly tests when they are checking out over remote cvs connections. --- Diffs of the changes: (+2 -2) Index: llvm/utils/NightlyTest.pl diff -u llvm/utils/NightlyTest.pl:1.39 llvm/utils/NightlyTest.pl:1.40 --- llvm/utils/NightlyTest.pl:1.39 Tue Oct 28 12:37:24 2003 +++ llvm/utils/NightlyTest.pl Sun Nov 30 23:31:12 2003 @@ -182,8 +182,8 @@ # Get some static statistics about the current state of CVS # my $CVSCheckoutTime = GetRegex "([0-9.]+)", `grep '^real' $Prefix-CVS-Log.txt`; -my $NumFilesInCVS = `grep '^U' $Prefix-CVS-Log.txt | wc -l` + 0; -my $NumDirsInCVS = `grep '^cvs checkout' $Prefix-CVS-Log.txt | wc -l` + 0; +my $NumFilesInCVS = `egrep '^U' $Prefix-CVS-Log.txt | wc -l` + 0; +my $NumDirsInCVS = `egrep '^cvs (checkout|server|update):' $Prefix-CVS-Log.txt | wc -l` + 0; $LOC = GetRegex "([0-9]+) +total", `wc -l \`utils/getsrcs.sh\` | grep total`; # From lattner at cs.uiuc.edu Sun Nov 30 23:41:01 2003 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sun Nov 30 23:41:01 2003 Subject: [llvm-commits] CVS: llvm/include/llvm/Bytecode/Format.h Message-ID: <200312010540.XAA13648@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Bytecode: Format.h updated: 1.6 -> 1.7 --- Log message: Remove unused enum value --- Diffs of the changes: (+0 -1) Index: llvm/include/llvm/Bytecode/Format.h diff -u llvm/include/llvm/Bytecode/Format.h:1.6 llvm/include/llvm/Bytecode/Format.h:1.7 --- llvm/include/llvm/Bytecode/Format.h:1.6 Tue Nov 11 16:41:31 2003 +++ llvm/include/llvm/Bytecode/Format.h Sun Nov 30 23:40:37 2003 @@ -34,7 +34,6 @@ GlobalTypePlane, // Function subtypes: - MethodInfo = 0x21, // Can also have ConstantPool block // Can also have SymbolTable block BasicBlock = 0x31, // May contain many basic blocks