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 <[EMAIL PROTECTED]> 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 > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
