[cfe-commits] r58034 - in /cfe/trunk: Driver/ASTConsumers.h Driver/Backend.cpp Driver/clang.cpp include/clang/Driver/CompileOptions.h

Zhongxing Xu xuzhongxing at gmail.com
Thu Oct 23 19:04:43 PDT 2008


I fixed it with this:

http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20081020/008482.html


On Fri, Oct 24, 2008 at 9:56 AM, Zhongxing Xu <xuzhongxing at gmail.com> wrote:

> I got the following linking error.
>
> llvm[1]: Linking Debug executable clang
> /home/xing/llvm/tools/clang/Driver/Debug/Backend.o: In function `(anonymous
> namespace)::BackendConsumer::CreatePasses()':
> /home/xing/llvm/tools/clang/Driver/Backend.cpp:245: undefined reference to
> `llvm::createRaiseAllocationsPass()'
> /home/xing/llvm/tools/clang/Driver/Backend.cpp:249: undefined reference to
> `llvm::createGlobalOptimizerPass()'
> /home/xing/llvm/tools/clang/Driver/Backend.cpp:250: undefined reference to
> `llvm::createGlobalDCEPass()'
> /home/xing/llvm/tools/clang/Driver/Backend.cpp:251: undefined reference to
> `llvm::createIPConstantPropagationPass()'
> /home/xing/llvm/tools/clang/Driver/Backend.cpp:252: undefined reference to
> `llvm::createDeadArgEliminationPass()'
> /home/xing/llvm/tools/clang/Driver/Backend.cpp:257: undefined reference to
> `llvm::createPruneEHPass()'
> /home/xing/llvm/tools/clang/Driver/Backend.cpp:258: undefined reference to
> `llvm::createAddReadAttrsPass()'
> /home/xing/llvm/tools/clang/Driver/Backend.cpp:261: undefined reference to
> `llvm::createFunctionInliningPass()'
> /home/xing/llvm/tools/clang/Driver/Backend.cpp:263: undefined reference to
> `llvm::createAlwaysInlinerPass()'
> /home/xing/llvm/tools/clang/Driver/Backend.cpp:265: undefined reference to
> `llvm::createArgumentPromotionPass(unsigned int)'
> /home/xing/llvm/tools/clang/Driver/Backend.cpp:300: undefined reference to
> `llvm::createStripDeadPrototypesPass()'
> /home/xing/llvm/tools/clang/Driver/Backend.cpp:301: undefined reference to
> `llvm::createDeadTypeEliminationPass()'
> /home/xing/llvm/tools/clang/Driver/Backend.cpp:305: undefined reference to
> `llvm::createConstantMergePass()'
> /home/xing/llvm/tools/clang/Driver/Backend.cpp:307: undefined reference to
> `llvm::createAlwaysInlinerPass()'
> collect2: ld returned 1 exit status
> make[1]: *** [/home/xing/llvm/Debug//bin/clang] error 1
> make[1]: Leaving directory `/home/xing/llvm/tools/clang/Driver'
> make: *** [all] error 1
>
>
>
> On Thu, Oct 23, 2008 at 1:50 PM, Daniel Dunbar <daniel at zuster.org> wrote:
>
>> Author: ddunbar
>> Date: Thu Oct 23 00:50:47 2008
>> New Revision: 58034
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=58034&view=rev
>> Log:
>> Add -O[0-3s] support (following llvm-gcc).
>>  - Passes match llvm-gcc but many of the switches aren't wired.
>>
>> Added:
>>    cfe/trunk/include/clang/Driver/CompileOptions.h
>> Modified:
>>    cfe/trunk/Driver/ASTConsumers.h
>>    cfe/trunk/Driver/Backend.cpp
>>    cfe/trunk/Driver/clang.cpp
>>
>> Modified: cfe/trunk/Driver/ASTConsumers.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/ASTConsumers.h?rev=58034&r1=58033&r2=58034&view=diff
>>
>>
>> ==============================================================================
>> --- cfe/trunk/Driver/ASTConsumers.h (original)
>> +++ cfe/trunk/Driver/ASTConsumers.h Thu Oct 23 00:50:47 2008
>> @@ -27,9 +27,10 @@
>>  class ASTConsumer;
>>  class Diagnostic;
>>  class FileManager;
>> -struct LangOptions;
>>  class Preprocessor;
>>  class PreprocessorFactory;
>> +struct CompileOptions;
>> +struct LangOptions;
>>
>>  ASTConsumer *CreateASTPrinter(llvm::raw_ostream* OS = NULL);
>>
>> @@ -50,6 +51,7 @@
>>  ASTConsumer *CreateBackendConsumer(BackendAction Action,
>>                                    Diagnostic &Diags,
>>                                    const LangOptions &Features,
>> +                                   const CompileOptions &CompileOpts,
>>                                    const std::string& InFile,
>>                                    const std::string& OutFile,
>>                                    bool GenerateDebugInfo);
>>
>> Modified: cfe/trunk/Driver/Backend.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/Backend.cpp?rev=58034&r1=58033&r2=58034&view=diff
>>
>>
>> ==============================================================================
>> --- cfe/trunk/Driver/Backend.cpp (original)
>> +++ cfe/trunk/Driver/Backend.cpp Thu Oct 23 00:50:47 2008
>> @@ -14,11 +14,14 @@
>>  #include "clang/AST/TranslationUnit.h"
>>  #include "clang/Basic/TargetInfo.h"
>>  #include "clang/CodeGen/ModuleBuilder.h"
>> +#include "clang/Driver/CompileOptions.h"
>>  #include "llvm/Module.h"
>>  #include "llvm/ModuleProvider.h"
>>  #include "llvm/PassManager.h"
>>  #include "llvm/ADT/OwningPtr.h"
>>  #include "llvm/Assembly/PrintModulePass.h"
>> +#include "llvm/Analysis/CallGraph.h"
>> +#include "llvm/Analysis/Verifier.h"
>>  #include "llvm/Bitcode/ReaderWriter.h"
>>  #include "llvm/CodeGen/RegAllocRegistry.h"
>>  #include "llvm/CodeGen/SchedulerRegistry.h"
>> @@ -30,6 +33,8 @@
>>  #include "llvm/Target/TargetData.h"
>>  #include "llvm/Target/TargetMachine.h"
>>  #include "llvm/Target/TargetMachineRegistry.h"
>> +#include "llvm/Transforms/Scalar.h"
>> +#include "llvm/Transforms/IPO.h"
>>  #include <fstream> // FIXME: Remove
>>
>>  using namespace clang;
>> @@ -38,6 +43,7 @@
>>  namespace {
>>   class VISIBILITY_HIDDEN BackendConsumer  : public ASTConsumer {
>>     BackendAction Action;
>> +    CompileOptions CompileOpts;
>>     const std::string &InputFile;
>>     std::string OutputFile;
>>     llvm::OwningPtr<CodeGenerator> Gen;
>> @@ -70,10 +76,11 @@
>>
>>   public:
>>     BackendConsumer(BackendAction action, Diagnostic &Diags,
>> -                    const LangOptions &Features,
>> +                    const LangOptions &Features, const CompileOptions
>> &compopts,
>>                     const std::string& infile, const std::string& outfile,
>>                     bool GenerateDebugInfo)  :
>>       Action(action),
>> +      CompileOpts(compopts),
>>       InputFile(infile),
>>       OutputFile(outfile),
>>       Gen(CreateLLVMCodeGen(Diags, Features, InputFile,
>> GenerateDebugInfo)),
>> @@ -218,7 +225,88 @@
>>  }
>>
>>  void BackendConsumer::CreatePasses() {
>> -
>> +  // In -O0 if checking is disabled, we don't even have per-function
>> passes.
>> +  if (CompileOpts.VerifyModule)
>> +    getPerFunctionPasses()->add(createVerifierPass());
>> +
>> +  if (CompileOpts.OptimizationLevel > 0) {
>> +    FunctionPassManager *PM = getPerFunctionPasses();
>> +    PM->add(createCFGSimplificationPass());
>> +    if (CompileOpts.OptimizationLevel == 1)
>> +      PM->add(createPromoteMemoryToRegisterPass());
>> +    else
>> +      PM->add(createScalarReplAggregatesPass());
>> +    PM->add(createInstructionCombiningPass());
>> +  }
>> +
>> +  // For now we always create per module passes.
>> +  PassManager *PM = getPerModulePasses();
>> +  if (CompileOpts.OptimizationLevel > 0) {
>> +    if (CompileOpts.UnitAtATime)
>> +      PM->add(createRaiseAllocationsPass());      // call %malloc ->
>> malloc inst
>> +    PM->add(createCFGSimplificationPass());       // Clean up disgusting
>> code
>> +    PM->add(createPromoteMemoryToRegisterPass()); // Kill useless allocas
>> +    if (CompileOpts.UnitAtATime) {
>> +      PM->add(createGlobalOptimizerPass());       // Optimize out global
>> vars
>> +      PM->add(createGlobalDCEPass());             // Remove unused fns
>> and globs
>> +      PM->add(createIPConstantPropagationPass()); // IP Constant
>> Propagation
>> +      PM->add(createDeadArgEliminationPass());    // Dead argument
>> elimination
>> +    }
>> +    PM->add(createInstructionCombiningPass());    // Clean up after IPCP
>> & DAE
>> +    PM->add(createCFGSimplificationPass());       // Clean up after IPCP
>> & DAE
>> +    if (CompileOpts.UnitAtATime) {
>> +      PM->add(createPruneEHPass());               // Remove dead EH info
>> +      PM->add(createAddReadAttrsPass());          // Set
>> readonly/readnone attrs
>> +    }
>> +    if (CompileOpts.InlineFunctions)
>> +      PM->add(createFunctionInliningPass());      // Inline small
>> functions
>> +    else
>> +      PM->add(createAlwaysInlinerPass());         // Respect
>> always_inline
>> +    if (CompileOpts.OptimizationLevel > 2)
>> +      PM->add(createArgumentPromotionPass());     // Scalarize uninlined
>> fn args
>> +    if (CompileOpts.SimplifyLibCalls)
>> +      PM->add(createSimplifyLibCallsPass());      // Library Call
>> Optimizations
>> +    PM->add(createInstructionCombiningPass());    // Cleanup for
>> scalarrepl.
>> +    PM->add(createJumpThreadingPass());           // Thread jumps.
>> +    PM->add(createCFGSimplificationPass());       // Merge & remove BBs
>> +    PM->add(createScalarReplAggregatesPass());    // Break up aggregate
>> allocas
>> +    PM->add(createInstructionCombiningPass());    // Combine silly seq's
>> +    PM->add(createCondPropagationPass());         // Propagate
>> conditionals
>> +    PM->add(createTailCallEliminationPass());     // Eliminate tail calls
>> +    PM->add(createCFGSimplificationPass());       // Merge & remove BBs
>> +    PM->add(createReassociatePass());             // Reassociate
>> expressions
>> +    PM->add(createLoopRotatePass());              // Rotate Loop
>> +    PM->add(createLICMPass());                    // Hoist loop
>> invariants
>> +    PM->add(createLoopUnswitchPass(CompileOpts.OptimizeSize ? true :
>> false));
>> +    PM->add(createLoopIndexSplitPass());          // Split loop index
>> +    PM->add(createInstructionCombiningPass());
>> +    PM->add(createIndVarSimplifyPass());          // Canonicalize indvars
>> +    PM->add(createLoopDeletionPass());            // Delete dead loops
>> +    if (CompileOpts.UnrollLoops)
>> +      PM->add(createLoopUnrollPass());            // Unroll small loops
>> +    PM->add(createInstructionCombiningPass());    // Clean up after the
>> unroller
>> +    PM->add(createGVNPass());                     // Remove redundancies
>> +    PM->add(createMemCpyOptPass());               // Remove memcpy / form
>> memset
>> +    PM->add(createSCCPPass());                    // Constant prop with
>> SCCP
>> +
>> +    // Run instcombine after redundancy elimination to exploit
>> opportunities
>> +    // opened up by them.
>> +    PM->add(createInstructionCombiningPass());
>> +    PM->add(createCondPropagationPass());         // Propagate
>> conditionals
>> +    PM->add(createDeadStoreEliminationPass());    // Delete dead stores
>> +    PM->add(createAggressiveDCEPass());           // Delete dead
>> instructions
>> +    PM->add(createCFGSimplificationPass());       // Merge & remove BBs
>> +
>> +    if (CompileOpts.UnitAtATime) {
>> +      PM->add(createStripDeadPrototypesPass());   // Get rid of dead
>> prototypes
>> +      PM->add(createDeadTypeEliminationPass());   // Eliminate dead types
>> +    }
>> +
>> +    if (CompileOpts.OptimizationLevel > 1 && CompileOpts.UnitAtATime)
>> +      PM->add(createConstantMergePass());         // Merge dup global
>> constants
>> +  } else {
>> +    PerModulePasses->add(createAlwaysInlinerPass());
>> +  }
>>  }
>>
>>  /// EmitAssembly - Handle interaction with LLVM backend to generate
>> @@ -275,9 +363,10 @@
>>  ASTConsumer *clang::CreateBackendConsumer(BackendAction Action,
>>                                           Diagnostic &Diags,
>>                                           const LangOptions &Features,
>> +                                          const CompileOptions
>> &CompileOpts,
>>                                           const std::string& InFile,
>>                                           const std::string& OutFile,
>>                                           bool GenerateDebugInfo) {
>> -  return new BackendConsumer(Action, Diags, Features, InFile, OutFile,
>> -                             GenerateDebugInfo);
>> +  return new BackendConsumer(Action, Diags, Features, CompileOpts,
>> +                             InFile, OutFile, GenerateDebugInfo);
>>  }
>>
>> Modified: cfe/trunk/Driver/clang.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/clang.cpp?rev=58034&r1=58033&r2=58034&view=diff
>>
>>
>> ==============================================================================
>> --- cfe/trunk/Driver/clang.cpp (original)
>> +++ cfe/trunk/Driver/clang.cpp Thu Oct 23 00:50:47 2008
>> @@ -24,6 +24,7 @@
>>
>>  #include "clang.h"
>>  #include "ASTConsumers.h"
>> +#include "clang/Driver/CompileOptions.h"
>>  #include "clang/Driver/HTMLDiagnostics.h"
>>  #include "clang/Driver/InitHeaderSearch.h"
>>  #include "clang/Driver/TextDiagnosticBuffer.h"
>> @@ -1084,6 +1085,37 @@
>>  }
>>
>>
>>  //===----------------------------------------------------------------------===//
>> +// Code generation options
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +static llvm::cl::opt<bool>
>> +OptSize("Os",
>> +       llvm::cl::desc("Optimize for size"));
>> +
>> +// It might be nice to add bounds to the CommandLine library directly.
>> +struct OptLevelParser : public llvm::cl::parser<unsigned> {
>> +  bool parse(llvm::cl::Option &O, const char *ArgName,
>> +             const std::string &Arg, unsigned &Val) {
>> +    if (llvm::cl::parser<unsigned>::parse(O, ArgName, Arg, Val))
>> +      return true;
>> +    // FIXME: Support -O4.
>> +    if (Val > 3)
>> +      return O.error(": '" + Arg + "' invalid optimization level!");
>> +    return false;
>> +  }
>> +};
>> +static llvm::cl::opt<unsigned, false, OptLevelParser>
>> +OptLevel("O", llvm::cl::Prefix,
>> +         llvm::cl::desc("Optimization level"),
>> +         llvm::cl::init(0));
>> +
>> +static void InitializeCompileOptions(CompileOptions &Opts) {
>> +  Opts.OptimizationLevel = OptLevel;
>> +  Opts.OptimizeSize = OptSize;
>> +  // FIXME: Wire other options.
>> +}
>> +
>>
>> +//===----------------------------------------------------------------------===//
>>  // Main driver
>>
>>  //===----------------------------------------------------------------------===//
>>
>> @@ -1115,14 +1147,21 @@
>>       return CreateSerializationTest(Diag, FileMgr);
>>
>>     case EmitAssembly:
>> -      return CreateBackendConsumer(Backend_EmitAssembly, Diag, LangOpts,
>> -                                   InFile, OutputFile,
>> GenerateDebugInfo);
>>     case EmitLLVM:
>> -      return CreateBackendConsumer(Backend_EmitLL, Diag, LangOpts,
>> -                                   InFile, OutputFile,
>> GenerateDebugInfo);
>> -    case EmitBC:
>> -      return CreateBackendConsumer(Backend_EmitBC, Diag, LangOpts,
>> +    case EmitBC: {
>> +      BackendAction Act;
>> +      if (ProgAction == EmitAssembly) {
>> +        Act = Backend_EmitAssembly;
>> +      } else if (ProgAction == EmitLLVM) {
>> +        Act = Backend_EmitLL;
>> +      } else {
>> +        Act = Backend_EmitBC;
>> +      }
>> +      CompileOptions Opts;
>> +      InitializeCompileOptions(Opts);
>> +      return CreateBackendConsumer(Act, Diag, LangOpts, Opts,
>>                                    InFile, OutputFile, GenerateDebugInfo);
>> +    }
>>
>>     case SerializeAST:
>>       // FIXME: Allow user to tailor where the file is written.
>>
>> Added: cfe/trunk/include/clang/Driver/CompileOptions.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CompileOptions.h?rev=58034&view=auto
>>
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Driver/CompileOptions.h (added)
>> +++ cfe/trunk/include/clang/Driver/CompileOptions.h Thu Oct 23 00:50:47
>> 2008
>> @@ -0,0 +1,45 @@
>> +//===--- CompileOptions.h ---------------------------------------*- C++
>> -*-===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//  This file defines the CompileOptions interface.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef LLVM_CLANG_COMPILEOPTIONS_H
>> +#define LLVM_CLANG_COMPILEOPTIONS_H
>> +
>> +namespace clang {
>> +
>> +/// CompileOptions - Track various options which control how the code
>> +/// is optimized and passed to the backend.
>> +struct CompileOptions {
>> +  unsigned OptimizationLevel : 3; /// The -O[0-4] option specified.
>> +  unsigned OptimizeSize      : 1; /// If -Os is specified.
>> +  unsigned UnitAtATime       : 1; /// Unused. For mirroring GCC
>> +                                  /// optimization selection.
>> +  unsigned InlineFunctions   : 1; /// Should functions be inlined?
>> +  unsigned SimplifyLibCalls  : 1; /// Should standard library calls be
>> +                                  /// treated specially.
>> +  unsigned UnrollLoops       : 1; /// Control whether loops are unrolled.
>> +  unsigned VerifyModule      : 1; /// Control whether the module
>> +                                  /// should be run through the LLVM
>> Verifier.
>> +
>> +public:
>> +  CompileOptions() {
>> +    OptimizationLevel = 0;
>> +    OptimizeSize = 0;
>> +    UnitAtATime = InlineFunctions = SimplifyLibCalls = 1;
>> +    UnrollLoops = 1;
>> +    VerifyModule = 1;
>> +  }
>> +};
>> +
>> +}  // end namespace clang
>> +
>> +#endif
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20081024/e4178abc/attachment.html>


More information about the cfe-commits mailing list