[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 18:56:27 PDT 2008
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/e5892929/attachment.html>
More information about the cfe-commits
mailing list