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 <[EMAIL PROTECTED]> 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 <[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
