diff options
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/BackendUtil.cpp | 101 | ||||
-rw-r--r-- | lib/CodeGen/CGArray.cpp | 3 | ||||
-rw-r--r-- | lib/CodeGen/CGDecl.cpp | 6 | ||||
-rw-r--r-- | lib/CodeGen/CGExprAgg.cpp | 5 | ||||
-rw-r--r-- | lib/CodeGen/CGExprCharacter.cpp | 9 | ||||
-rw-r--r-- | lib/CodeGen/CGExprComplex.cpp | 14 | ||||
-rw-r--r-- | lib/CodeGen/CGSystemLibflang.cpp | 7 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenAction.cpp | 11 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenFunction.h | 1 |
9 files changed, 92 insertions, 65 deletions
diff --git a/lib/CodeGen/BackendUtil.cpp b/lib/CodeGen/BackendUtil.cpp index 37569cf43e..3190e5669d 100644 --- a/lib/CodeGen/BackendUtil.cpp +++ b/lib/CodeGen/BackendUtil.cpp @@ -13,30 +13,34 @@ #include "flang/Basic/TargetOptions.h" #include "flang/Frontend/CodeGenOptions.h" #include "flang/Frontend/FrontendDiagnostic.h" -#include "llvm/IR/Verifier.h" -#include "llvm/IR/IRPrintingPasses.h" -#include "llvm/Bitcode/ReaderWriter.h" +#include "llvm/ADT/StringSwitch.h" +#include "llvm/Analysis/TargetLibraryInfo.h" +#include "llvm/Analysis/TargetTransformInfo.h" +#include "llvm/Bitcode/BitcodeWriterPass.h" #include "llvm/CodeGen/RegAllocRegistry.h" #include "llvm/CodeGen/SchedulerRegistry.h" #include "llvm/IR/DataLayout.h" +#include "llvm/IR/IRPrintingPasses.h" +#include "llvm/IR/LegacyPassManager.h" #include "llvm/IR/Module.h" +#include "llvm/IR/Verifier.h" #include "llvm/MC/SubtargetFeature.h" -#include "llvm/PassManager.h" -#include "llvm/Bitcode/BitcodeWriterPass.h" #include "llvm/Support/CommandLine.h" -#include "llvm/Support/FormattedStream.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Support/Timer.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/Target/TargetLibraryInfo.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" +#include "llvm/Target/TargetSubtargetInfo.h" #include "llvm/Transforms/IPO.h" #include "llvm/Transforms/IPO/PassManagerBuilder.h" #include "llvm/Transforms/Instrumentation.h" #include "llvm/Transforms/ObjCARC.h" #include "llvm/Transforms/Scalar.h" +#include "llvm/Transforms/Utils/SymbolRewriter.h" +#include <memory> + using namespace flang; using namespace llvm; @@ -51,37 +55,41 @@ class EmitAssemblyHelper { Timer CodeGenerationTime; - mutable PassManager *CodeGenPasses; - mutable PassManager *PerModulePasses; - mutable FunctionPassManager *PerFunctionPasses; + mutable legacy::PassManager *CodeGenPasses; + mutable legacy::PassManager *PerModulePasses; + mutable legacy::FunctionPassManager *PerFunctionPasses; private: - PassManager *getCodeGenPasses() const { + TargetIRAnalysis getTargetIRAnalysis() const { + if (TM) + return TM->getTargetIRAnalysis(); + + return TargetIRAnalysis(); + } + + legacy::PassManager *getCodeGenPasses() const { if (!CodeGenPasses) { - CodeGenPasses = new PassManager(); - CodeGenPasses->add(new DataLayoutPass()); - if (TM) - TM->addAnalysisPasses(*CodeGenPasses); + CodeGenPasses = new legacy::PassManager(); + CodeGenPasses->add( + createTargetTransformInfoWrapperPass(getTargetIRAnalysis())); } return CodeGenPasses; } - PassManager *getPerModulePasses() const { + legacy::PassManager *getPerModulePasses() const { if (!PerModulePasses) { - PerModulePasses = new PassManager(); - PerModulePasses->add(new DataLayoutPass()); - if (TM) - TM->addAnalysisPasses(*PerModulePasses); + PerModulePasses = new legacy::PassManager(); + PerModulePasses->add( + createTargetTransformInfoWrapperPass(getTargetIRAnalysis())); } return PerModulePasses; } - FunctionPassManager *getPerFunctionPasses() const { + legacy::FunctionPassManager *getPerFunctionPasses() const { if (!PerFunctionPasses) { - PerFunctionPasses = new FunctionPassManager(TheModule); - PerFunctionPasses->add(new DataLayoutPass()); - if (TM) - TM->addAnalysisPasses(*PerFunctionPasses); + PerFunctionPasses = new legacy::FunctionPassManager(TheModule); + PerFunctionPasses->add( + createTargetTransformInfoWrapperPass(getTargetIRAnalysis())); } return PerFunctionPasses; } @@ -102,7 +110,7 @@ private: /// AddEmitPasses - Add passes necessary to emit assembly or LLVM IR. /// /// \return True on success. - bool AddEmitPasses(BackendAction Action, formatted_raw_ostream &OS); + bool AddEmitPasses(BackendAction Action, raw_pwrite_stream &OS); public: EmitAssemblyHelper(DiagnosticsEngine &_Diags, @@ -122,7 +130,7 @@ public: std::unique_ptr<TargetMachine> TM; - void EmitAssembly(BackendAction Action, raw_ostream *OS); + void EmitAssembly(BackendAction Action, raw_pwrite_stream *OS); }; // We need this wrapper to access LangOpts and CGOpts from extension functions @@ -169,7 +177,7 @@ void EmitAssemblyHelper::CreatePasses() { // Figure out TargetLibraryInfo. Triple TargetTriple(TheModule->getTargetTriple()); - PMBuilder.LibraryInfo = new TargetLibraryInfo(TargetTriple); + PMBuilder.LibraryInfo = new TargetLibraryInfoImpl(TargetTriple); if (!CodeGenOpts.SimplifyLibCalls) PMBuilder.LibraryInfo->disableAllFunctions(); @@ -198,13 +206,13 @@ void EmitAssemblyHelper::CreatePasses() { } // Set up the per-function pass manager. - FunctionPassManager *FPM = getPerFunctionPasses(); + legacy::FunctionPassManager *FPM = getPerFunctionPasses(); if (CodeGenOpts.VerifyModule) FPM->add(createVerifierPass()); PMBuilder.populateFunctionPassManager(*FPM); // Set up the per-module pass manager. - PassManager *MPM = getPerModulePasses(); + legacy::PassManager *MPM = getPerModulePasses(); if (!CodeGenOpts.DisableGCov && (CodeGenOpts.EmitGcovArcs || CodeGenOpts.EmitGcovNotes)) { @@ -381,20 +389,20 @@ TargetMachine *EmitAssemblyHelper::CreateTargetMachine(bool MustCreateTM) { } bool EmitAssemblyHelper::AddEmitPasses(BackendAction Action, - formatted_raw_ostream &OS) { + raw_pwrite_stream &OS) { // Create the code generator passes. - PassManager *PM = getCodeGenPasses(); + legacy::PassManager *PM = getCodeGenPasses(); // Add LibraryInfo. llvm::Triple TargetTriple(TheModule->getTargetTriple()); - TargetLibraryInfo *TLI = new TargetLibraryInfo(TargetTriple); + TargetLibraryInfoImpl *TLII = new TargetLibraryInfoImpl(TargetTriple); if (!CodeGenOpts.SimplifyLibCalls) - TLI->disableAllFunctions(); - PM->add(TLI); + TLII->disableAllFunctions(); + PM->add(new TargetLibraryInfoWrapperPass(*TLII)); // Add Target specific analysis passes. - TM->addAnalysisPasses(*PM); + //TM->addAnalysisPasses(*PM); // Normal mode, emit a .s or .o file by running the code generator. Note, // this also adds codegenerator level optimization passes. @@ -415,9 +423,9 @@ bool EmitAssemblyHelper::AddEmitPasses(BackendAction Action, return true; } -void EmitAssemblyHelper::EmitAssembly(BackendAction Action, raw_ostream *OS) { +void EmitAssemblyHelper::EmitAssembly(BackendAction Action, + raw_pwrite_stream *OS) { TimeRegion Region(llvm::TimePassesIsEnabled ? &CodeGenerationTime : 0); - llvm::formatted_raw_ostream FormattedOS; bool UsesCodeGen = (Action != Backend_EmitNothing && Action != Backend_EmitBC && @@ -434,17 +442,17 @@ void EmitAssemblyHelper::EmitAssembly(BackendAction Action, raw_ostream *OS) { break; case Backend_EmitBC: - getPerModulePasses()->add(createBitcodeWriterPass(*OS)); + getPerModulePasses()->add( + createBitcodeWriterPass(*OS, CodeGenOpts.EmitLLVMUseLists)); break; case Backend_EmitLL: - FormattedOS.setStream(*OS, formatted_raw_ostream::PRESERVE_STREAM); - getPerModulePasses()->add(createPrintModulePass(FormattedOS)); + getPerModulePasses()->add( + createPrintModulePass(*OS, "", CodeGenOpts.EmitLLVMUseLists)); break; default: - FormattedOS.setStream(*OS, formatted_raw_ostream::PRESERVE_STREAM); - if (!AddEmitPasses(Action, FormattedOS)) + if (!AddEmitPasses(Action, *OS)) return; } @@ -479,10 +487,11 @@ void EmitAssemblyHelper::EmitAssembly(BackendAction Action, raw_ostream *OS) { void flang::EmitBackendOutput(DiagnosticsEngine &Diags, const CodeGenOptions &CGOpts, const flang::TargetOptions &TOpts, - const LangOptions &LOpts, - Module *M, - BackendAction Action, raw_ostream *OS) { + const LangOptions &LOpts, StringRef TDesc, + Module *M, BackendAction Action, + raw_pwrite_stream *OS) { EmitAssemblyHelper AsmHelper(Diags, CGOpts, TOpts, LOpts, M); AsmHelper.EmitAssembly(Action, OS); } + diff --git a/lib/CodeGen/CGArray.cpp b/lib/CodeGen/CGArray.cpp index 459de63cd3..c9f52cab11 100644 --- a/lib/CodeGen/CGArray.cpp +++ b/lib/CodeGen/CGArray.cpp @@ -242,7 +242,8 @@ void ArrayValueExprEmitter::VisitVarExpr(const VarExpr *E) { if(VD->isArgument()) Ptr = CGF.GetVarPtr(VD); else - Ptr = Builder.CreateConstInBoundsGEP2_32(CGF.GetVarPtr(VD), 0, 0); + Ptr = Builder.CreateConstInBoundsGEP2_32(Ptr->getType(), + CGF.GetVarPtr(VD), 0, 0, NULL); } EmitSections(); } diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp index d6fb515756..ac46af410a 100644 --- a/lib/CodeGen/CGDecl.cpp +++ b/lib/CodeGen/CGDecl.cpp @@ -101,7 +101,8 @@ void CodeGenFunction::EmitVarInitializer(const VarDecl *D) { auto T = D->getType(); if(T->isArrayType()) { - auto Dest = Builder.CreateConstInBoundsGEP2_32(GetVarPtr(D), 0, 0); + auto Dest = Builder.CreateConstInBoundsGEP2_32(ConvertTypeForMem(T), + GetVarPtr(D), 0, 0, NULL ); auto Init = cast<ArrayConstructorExpr>(D->getInit())->getItems(); for(size_t I = 0; I < Init.size(); ++I) { auto Val = EmitRValue(Init[I]); @@ -178,7 +179,8 @@ void CodeGenFunction::EmitCommonBlock(const CommonBlockSet *S) { for(auto Obj : S->getObjects()) { if(Obj.Var) { LocalVariables.insert(std::make_pair(Obj.Var, - Builder.CreateStructGEP(Ptr, Idx))); + Builder.CreateStructGEP(ConvertTypeForMem(Obj.Var->getType()), + Ptr, Idx, NULL))); } ++Idx; } diff --git a/lib/CodeGen/CGExprAgg.cpp b/lib/CodeGen/CGExprAgg.cpp index 9a95c479c0..77bf5564b4 100644 --- a/lib/CodeGen/CGExprAgg.cpp +++ b/lib/CodeGen/CGExprAgg.cpp @@ -74,7 +74,8 @@ RValueTy AggregateExprEmitter::VisitTypeConstructorExpr(const TypeConstructorExp auto Fields = E->getType().getSelfOrArrayElementType()->asRecordType()->getElements(); for(unsigned I = 0; I < Values.size(); ++I) { CGF.EmitStore(CGF.EmitRValue(Values[I]), - LValueTy(Builder.CreateStructGEP(TempStruct,I)), + LValueTy(Builder.CreateStructGEP(CGF.ConvertTypeForMem(E->getType()), + TempStruct,I)), Fields[I]->getType()); } return RValueTy::getAggregate(TempStruct); @@ -93,7 +94,7 @@ void CodeGenFunction::EmitAggregateAssignment(const Expr *LHS, const Expr *RHS) } llvm::Value *CodeGenFunction::EmitAggregateMember(llvm::Value *Agg, const FieldDecl *Field) { - return Builder.CreateStructGEP(Agg, Field->getIndex()); + return Builder.CreateStructGEP(Agg->getType(), Agg, Field->getIndex()); } void CodeGenFunction::EmitAggregateReturn(const CGFunctionInfo::RetInfo &Info, llvm::Value *Ptr) { diff --git a/lib/CodeGen/CGExprCharacter.cpp b/lib/CodeGen/CGExprCharacter.cpp index d388b1d168..fd86b09541 100644 --- a/lib/CodeGen/CGExprCharacter.cpp +++ b/lib/CodeGen/CGExprCharacter.cpp @@ -100,8 +100,10 @@ CharacterValueTy CharacterExprEmitter::VisitBinaryExprConcat(const BinaryExpr *E auto CharTyRHS = E->getRHS()->getType()->asCharacterType(); auto Size = CharTyLHS->getLength() + CharTyRHS->getLength(); auto Storage = CGF.CreateTempAlloca(llvm::ArrayType::get(CGF.getModule().Int8Ty, Size), "concat-result"); - Dest = CharacterValueTy(Builder.CreateConstInBoundsGEP2_32(Storage, 0, 0), - llvm::ConstantInt::get(CGF.getModule().SizeTy, Size)); + Dest = CharacterValueTy(Builder.CreateConstInBoundsGEP2_32( + llvm::ArrayType::get(CGF.getModule().Int8Ty, Size), + Storage, 0, 0), + llvm::ConstantInt::get(CGF.getModule().SizeTy, Size)); } // a = b // c @@ -186,7 +188,8 @@ llvm::Value *CodeGenFunction::GetCharacterTypeLength(QualType T) { CharacterValueTy CodeGenFunction::GetCharacterValueFromPtr(llvm::Value *Ptr, QualType StorageType) { - return CharacterValueTy(Builder.CreateConstInBoundsGEP2_32(Ptr, 0, 0), + return CharacterValueTy(Builder.CreateConstInBoundsGEP2_32(Ptr->getType(), + Ptr, 0, 0), GetCharacterTypeLength(StorageType)); } diff --git a/lib/CodeGen/CGExprComplex.cpp b/lib/CodeGen/CGExprComplex.cpp index 05e310ef11..2a6a8ebaaf 100644 --- a/lib/CodeGen/CGExprComplex.cpp +++ b/lib/CodeGen/CGExprComplex.cpp @@ -62,15 +62,21 @@ ComplexValueTy ComplexExprEmitter::VisitComplexConstantExpr(const ComplexConstan } ComplexValueTy CodeGenFunction::EmitComplexLoad(llvm::Value *Ptr, bool IsVolatile) { - auto Re = Builder.CreateLoad(Builder.CreateStructGEP(Ptr,0), IsVolatile); - auto Im = Builder.CreateLoad(Builder.CreateStructGEP(Ptr,1), IsVolatile); + auto Re = Builder.CreateLoad(Builder.CreateStructGEP(Ptr->getType(), + Ptr, + 0), IsVolatile); + auto Im = Builder.CreateLoad(Builder.CreateStructGEP(Ptr->getType(), + Ptr, + 1), IsVolatile); return ComplexValueTy(Re, Im); } void CodeGenFunction::EmitComplexStore(ComplexValueTy Value, llvm::Value *Ptr, bool IsVolatile) { - Builder.CreateStore(Value.Re, Builder.CreateStructGEP(Ptr,0), IsVolatile); - Builder.CreateStore(Value.Im, Builder.CreateStructGEP(Ptr,1), IsVolatile); + Builder.CreateStore(Value.Re, Builder.CreateStructGEP(Ptr->getType(), + Ptr,0), IsVolatile); + Builder.CreateStore(Value.Im, Builder.CreateStructGEP(Ptr->getType(), + Ptr,1), IsVolatile); } ComplexValueTy ComplexExprEmitter::VisitVarExpr(const VarExpr *E) { diff --git a/lib/CodeGen/CGSystemLibflang.cpp b/lib/CodeGen/CGSystemLibflang.cpp index deed482ddf..9929e86d0f 100644 --- a/lib/CodeGen/CGSystemLibflang.cpp +++ b/lib/CodeGen/CGSystemLibflang.cpp @@ -53,12 +53,15 @@ void CGLibflangSystemRuntime::EmitFree(CodeGenFunction &CGF, llvm::Value *Ptr) { llvm::Value *CGLibflangSystemRuntime::EmitETIME(CodeGenFunction &CGF, ArrayRef<Expr*> Arguments) { auto RealTy = CGM.getContext().RealTy; auto RealPtrTy = llvm::PointerType::get(CGF.ConvertTypeForMem(RealTy) ,0); - auto Func = CGM.GetRuntimeFunction2(RealTy->getBuiltinTypeKind() == BuiltinType::Real4? "etimef" : "etime", + auto Func = CGM.GetRuntimeFunction2( + RealTy->getBuiltinTypeKind() == BuiltinType::Real4? "etimef" : "etime", RealPtrTy, RealPtrTy, RealTy); auto Arr = CGF.EmitArrayArgumentPointerValueABI(Arguments[0]); CallArgList ArgList; CGF.EmitCallArg(ArgList, Arr, Func.getInfo()->getArguments()[0]); - CGF.EmitCallArg(ArgList, CGF.getBuilder().CreateConstInBoundsGEP1_32(Arr, 1), + CGF.EmitCallArg(ArgList, + CGF.getBuilder().CreateConstInBoundsGEP1_32( + CGF.ConvertTypeForMem(RealTy),Arr, 1, NULL), Func.getInfo()->getArguments()[1]); return CGF.EmitCall(Func.getFunction(), Func.getInfo(), ArgList).asScalar(); } diff --git a/lib/CodeGen/CodeGenAction.cpp b/lib/CodeGen/CodeGenAction.cpp index 79aaf1df86..429a7c068d 100644 --- a/lib/CodeGen/CodeGenAction.cpp +++ b/lib/CodeGen/CodeGenAction.cpp @@ -39,7 +39,7 @@ namespace flang { const CodeGenOptions &CodeGenOpts; const TargetOptions &TargetOpts; const LangOptions &LangOpts; - raw_ostream *AsmOutStream; + raw_pwrite_stream *AsmOutStream; ASTContext *Context; Timer LLVMIRGeneration; @@ -56,7 +56,7 @@ namespace flang { bool TimePasses, const std::string &infile, llvm::Module *LinkModule, - raw_ostream *OS, + raw_pwrite_stream *OS, LLVMContext &C) : Diags(_Diags), Action(action), @@ -126,7 +126,8 @@ namespace flang { return; } - EmitBackendOutput(Diags, CodeGenOpts, TargetOpts, LangOpts, + EmitBackendOutput(Diags, CodeGenOpts, TargetOpts, LangOpts, + " ", TheModule.get(), Action, AsmOutStream); } @@ -189,7 +190,7 @@ llvm::LLVMContext *CodeGenAction::takeLLVMContext() { return VMContext; } -static raw_ostream *GetOutputStream(CompilerInstance &CI, +static raw_pwrite_stream *GetOutputStream(CompilerInstance &CI, StringRef InFile, BackendAction Action) { switch (Action) { @@ -212,7 +213,7 @@ static raw_ostream *GetOutputStream(CompilerInstance &CI, ASTConsumer *CodeGenAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) { BackendAction BA = static_cast<BackendAction>(Act); - std::unique_ptr<raw_ostream> OS(GetOutputStream(CI, InFile, BA)); + std::unique_ptr<raw_pwrite_stream> OS(GetOutputStream(CI, InFile, BA)); if (BA != Backend_EmitNothing && !OS) return 0; diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index 4353d4fd43..0a455f0d4e 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -37,6 +37,7 @@ namespace llvm { class Twine; class Value; class CallSite; + class Type; } namespace flang { |