summaryrefslogtreecommitdiff
path: root/lib/CodeGen
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/BackendUtil.cpp101
-rw-r--r--lib/CodeGen/CGArray.cpp3
-rw-r--r--lib/CodeGen/CGDecl.cpp6
-rw-r--r--lib/CodeGen/CGExprAgg.cpp5
-rw-r--r--lib/CodeGen/CGExprCharacter.cpp9
-rw-r--r--lib/CodeGen/CGExprComplex.cpp14
-rw-r--r--lib/CodeGen/CGSystemLibflang.cpp7
-rw-r--r--lib/CodeGen/CodeGenAction.cpp11
-rw-r--r--lib/CodeGen/CodeGenFunction.h1
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 {