summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Griffiths <craig.griffiths@codethink.co.uk>2015-08-14 10:10:02 +0100
committerCraig Griffiths <craig.griffiths@codethink.co.uk>2015-08-14 10:12:59 +0100
commit1bf7d9907af320e2c95e2dcf826f30c4c0569701 (patch)
tree012475a017daf5a7fe556619d873e5ed83329e0b
parent7d593cf14b6df28480d915e4cb812268f429f49c (diff)
downloadflang-1bf7d9907af320e2c95e2dcf826f30c4c0569701.tar.gz
The difference between the head of:
https://github.com/CodethinkLabs/flang.git and the first commit of: https://github.com/llvm-flang/flang.git as of 14/08/2015
-rw-r--r--LICENSE.TXT13
-rw-r--r--README.txt7
-rw-r--r--include/flang/AST/ASTContext.h5
-rw-r--r--include/flang/Basic/LLVM.h10
-rw-r--r--include/flang/CodeGen/BackendUtil.h8
-rw-r--r--include/flang/Frontend/CodeGenOptions.def2
-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
-rw-r--r--tools/driver/Main.cpp61
16 files changed, 178 insertions, 85 deletions
diff --git a/LICENSE.TXT b/LICENSE.TXT
index 90ca2e97f6..84090c07a5 100644
--- a/LICENSE.TXT
+++ b/LICENSE.TXT
@@ -4,7 +4,7 @@ LLVM Release License
University of Illinois/NCSA
Open Source License
-Copyright (c) 2011 University of Illinois at Urbana-Champaign.
+Copyright (c) 2003-2015 University of Illinois at Urbana-Champaign.
All rights reserved.
Developed by:
@@ -43,6 +43,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
SOFTWARE.
==============================================================================
+Copyrights and Licenses for Third Party Software Distributed with LLVM:
+==============================================================================
The LLVM software contains code written by third parties. Such software will
have its own individual LICENSE.TXT file in the directory in which it appears.
This file will describe the copyrights, license, and restrictions which apply
@@ -59,5 +61,10 @@ licenses, and/or restrictions:
Program Directory
------- ---------
-<none yet>
-
+Autoconf llvm/autoconf
+ llvm/projects/ModuleMaker/autoconf
+Google Test llvm/utils/unittest/googletest
+OpenBSD regex llvm/lib/Support/{reg*, COPYRIGHT.regex}
+pyyaml tests llvm/test/YAMLParser/{*.data, LICENSE.TXT}
+ARM contributions llvm/lib/Target/ARM/LICENSE.TXT
+md5 contributions llvm/lib/Support/MD5.cpp llvm/include/llvm/Support/MD5.h
diff --git a/README.txt b/README.txt
index fbe52db4b6..df70385387 100644
--- a/README.txt
+++ b/README.txt
@@ -21,7 +21,7 @@ Flang.
Download the Flang source code within the LLVM tree, the two will be compiled
together.
-> cd tools & git clone git://github.com/CodethinkLabs/flang.git
+> cd tools & git clone git://github.com/llvm-flang/flang.git
Compile LLVM and Flang together.
@@ -33,7 +33,7 @@ Compile LLVM and Flang together.
You will also need to install the Flang standard library, which the Flang
compiler links to by default. This is built outside the LLVM tree.
-> git clone git://github.com/CodethinkLabs/libflangrt.git
+> git clone git://github.com/llvm-flang/libflangrt.git
> cd libflangrt
> mkdir build
> cd build & cmake ../ -DCMAKE_INSTALL_PREFIX=/usr
@@ -45,7 +45,7 @@ compiler links to by default. This is built outside the LLVM tree.
//===----------------------------------------------------------------------===//
Flang's driver will instruct the linker to link with the libflang runtime.
-You can get libflang at https://github.com/hyp/libflangrt . Once you have libflang,
+You can get libflang at https://github.com/llvm-flang/libflangrt . Once you have libflang,
you'll need to tell flang where it is - you can use the -L option (e.g. -L~/libflang).
//===----------------------------------------------------------------------===//
@@ -65,6 +65,7 @@ Long term:
* Flang driver (?)
* Parsing GNU modules
+* Add (or hoist) Clang style TargetInfo class template
Longer term:
diff --git a/include/flang/AST/ASTContext.h b/include/flang/AST/ASTContext.h
index 7e9c00405a..61033575aa 100644
--- a/include/flang/AST/ASTContext.h
+++ b/include/flang/AST/ASTContext.h
@@ -37,6 +37,7 @@ class DeclContext;
class Decl;
class RecordDecl;
class TypeDecl;
+class TargetInfo;
class ASTContext : public llvm::RefCountedBase<ASTContext> {
ASTContext &this_() { return *this; }
@@ -67,10 +68,14 @@ class ASTContext : public llvm::RefCountedBase<ASTContext> {
void InitBuiltinTypes();
+ const TargetInfo *Target;
+
public:
ASTContext(llvm::SourceMgr &SM, LangOptions LangOpts);
~ASTContext();
+ const TargetInfo &getTargetInfo() const { return *Target; }
+
TranslationUnitDecl *getTranslationUnitDecl() const { return TUDecl; }
llvm::SourceMgr &getSourceManager() { return SrcMgr; }
diff --git a/include/flang/Basic/LLVM.h b/include/flang/Basic/LLVM.h
index 04469df46a..c18f610c74 100644
--- a/include/flang/Basic/LLVM.h
+++ b/include/flang/Basic/LLVM.h
@@ -25,11 +25,19 @@ namespace llvm {
class APFloat;
class StringRef;
class Twine;
+#if 0
template<typename T> class ArrayRef;
template<typename T, unsigned N> class SmallVector;
template<typename T> class SmallVectorImpl;
+#endif
+ template<typename T> class ArrayRef;
+ template<unsigned InternalLen> class SmallString;
+ template<typename T, unsigned N> class SmallVector;
+ template<typename T> class SmallVectorImpl;
+ template<typename T> class Optional;
class raw_ostream;
+ class raw_pwrite_stream;
// TODO: DenseMap, ...
}
@@ -48,10 +56,12 @@ namespace flang {
using llvm::StringRef;
using llvm::Twine;
using llvm::ArrayRef;
+ using llvm::SmallString;
using llvm::SmallVector;
using llvm::SmallVectorImpl;
using llvm::raw_ostream;
+ using llvm::raw_pwrite_stream;
} // end namespace flang.
#endif
diff --git a/include/flang/CodeGen/BackendUtil.h b/include/flang/CodeGen/BackendUtil.h
index 3daac9f40c..3ba92a8624 100644
--- a/include/flang/CodeGen/BackendUtil.h
+++ b/include/flang/CodeGen/BackendUtil.h
@@ -30,11 +30,11 @@ namespace flang {
Backend_EmitMCNull, ///< Run CodeGen, but don't emit anything
Backend_EmitObj ///< Emit native object files
};
-
+
void EmitBackendOutput(DiagnosticsEngine &Diags, const CodeGenOptions &CGOpts,
- const TargetOptions &TOpts, const LangOptions &LOpts,
- llvm::Module *M,
- BackendAction Action, raw_ostream *OS);
+ const TargetOptions &TOpts, const LangOptions &LOpts,
+ StringRef TDesc, llvm::Module *M, BackendAction Action,
+ raw_pwrite_stream *OS);
}
#endif
diff --git a/include/flang/Frontend/CodeGenOptions.def b/include/flang/Frontend/CodeGenOptions.def
index 80046620f6..c12b69f620 100644
--- a/include/flang/Frontend/CodeGenOptions.def
+++ b/include/flang/Frontend/CodeGenOptions.def
@@ -129,6 +129,8 @@ VALUE_CODEGENOPT(StackAlignment , 32, 0) ///< Overrides default stack
CODEGENOPT(DebugColumnInfo, 1, 0) ///< Whether or not to use column information
///< in debug info.
+CODEGENOPT(EmitLLVMUseLists, 1, 0) ///< Control whether to serialize use-lists
+
/// The user specified number of registers to be used for integral arguments,
/// or 0 if unspecified.
VALUE_CODEGENOPT(NumRegisterParameters, 32, 0)
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 {
diff --git a/tools/driver/Main.cpp b/tools/driver/Main.cpp
index ac74ca55db..1d6e861431 100644
--- a/tools/driver/Main.cpp
+++ b/tools/driver/Main.cpp
@@ -11,6 +11,7 @@
//
//===----------------------------------------------------------------------===//
+
#include "flang/Frontend/TextDiagnosticPrinter.h"
#include "flang/Frontend/VerifyDiagnosticConsumer.h"
#include "flang/AST/ASTConsumer.h"
@@ -24,7 +25,7 @@
#include "llvm/IR/DataLayout.h"
#include "llvm/ExecutionEngine/ExecutionEngine.h"
//#include "llvm/ExecutionEngine/JIT.h"
-#include "llvm/PassManager.h"
+#include "llvm/IR/LegacyPassManager.h"
#include "llvm/Transforms/IPO.h"
#include "llvm/Transforms/IPO/PassManagerBuilder.h"
#include "llvm/Transforms/Instrumentation.h"
@@ -47,6 +48,36 @@
#include "llvm/Support/Signals.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/Timer.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/Support/ManagedStatic.h"
+#include "llvm/Support/TargetSelect.h"
+#include "llvm/Support/CommandLine.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/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 llvm;
using namespace flang;
@@ -237,16 +268,17 @@ static bool EmitFile(llvm::raw_ostream &Out,
Action == Backend_EmitObj ? llvm::TargetMachine::CGFT_ObjectFile :
llvm::TargetMachine::CGFT_AssemblyFile;
- PassManager PM;
+ llvm::legacy::PassManager PM;
//Target.setAsmVerbosityDefault(true);
//Target.setMCRelaxAll(true);
llvm::formatted_raw_ostream FOS(Out);
+ //FIXME : add the backend passes
// Ask the target to add backend passes as necessary.
- if (Target.addPassesToEmitFile(PM, FOS, FileType, true)) {
- return true;
- }
+ //if (Target.addPassesToEmitFile(PM, FOS, FileType, true)) {
+ // return true;
+ //}
PM.run(Mod);
}
@@ -382,8 +414,10 @@ static bool ParseFile(const std::string &Filename,
if(!(EmitLLVM && OptLevel == 0)) {
auto TheModule = CG->GetModule();
- auto PM = new PassManager();
- PM->add(new DataLayoutPass());
+ auto PM = new llvm::legacy::PassManager();
+ //llvm::legacy::FunctionPassManager *FPM = new llvm::legacy::FunctionPassManager(TheModule);
+ //FPM->add(new DataLayoutPass());
+ //PM->add(new llvm::DataLayoutPass());
//TM->addAnalysisPasses(*PM);
PM->add(createPromoteMemoryToRegisterPass());
@@ -399,17 +433,24 @@ static bool ParseFile(const std::string &Filename,
PMBuilder.populateModulePassManager(*PM);
+ //llvm::legacy::PassManager *MPM = new llvm::legacy::PassManager();
+ //PMBuilder.populateModulePassManager(*MPM);
PM->run(*TheModule);
+ //MPM->run(*TheModule);
delete PM;
+ //delete MPM;
}
if(Interpret) {
//const char *Env[] = { "", nullptr };
//Execute(CG->ReleaseModule(), Env);
- } else if(OutputFile == "-")
- EmitFile(llvm::outs(), CG->GetModule(), TM, BA);
- else {
+ } else if(OutputFile == "-"){
+ // FIXME: outputting to stdout is broken
+ //EmitFile(llvm::outs(), CG->GetModule(), TM, BA);
+ OutputFiles.push_back(GetOutputName("stdout",BA));
+ EmitOutputFile(OutputFiles.back(), CG->GetModule(), TM, BA);
+ }else {
OutputFiles.push_back(GetOutputName(Filename, BA));
EmitOutputFile(OutputFiles.back(), CG->GetModule(), TM, BA);
}