[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