diff options
author | arphaman <arphaman@gmail.com> | 2013-09-19 16:54:29 +0100 |
---|---|---|
committer | arphaman <arphaman@gmail.com> | 2013-09-19 16:54:29 +0100 |
commit | fecfae1085a7bd566632d8afcfe34aa9a24dc423 (patch) | |
tree | 9717dfa3691d42ecb9f93aca360bea4bf5c83859 | |
parent | 3b95e9a2d88dbcc4e83ce1184a591f15f21add9b (diff) | |
download | flang-fecfae1085a7bd566632d8afcfe34aa9a24dc423.tar.gz |
added support for -fdefault-{real|double|integer}-8 option
-rw-r--r-- | include/flang/Basic/LangOptions.h | 6 | ||||
-rw-r--r-- | lib/AST/ASTContext.cpp | 22 | ||||
-rw-r--r-- | test/CodeGen/defaultDouble8.f95 | 7 | ||||
-rw-r--r-- | test/CodeGen/defaultInt8.f95 | 6 | ||||
-rw-r--r-- | test/CodeGen/defaultReal8.f95 | 7 | ||||
-rw-r--r-- | tools/driver/Main.cpp | 12 |
6 files changed, 54 insertions, 6 deletions
diff --git a/include/flang/Basic/LangOptions.h b/include/flang/Basic/LangOptions.h index 585328294f..29eee9edaa 100644 --- a/include/flang/Basic/LangOptions.h +++ b/include/flang/Basic/LangOptions.h @@ -37,6 +37,11 @@ public: unsigned SpellChecking : 1; // Whether to perform spell-checking for error // recovery. + + unsigned DefaultReal8 : 1; // Sets the default real type to be 8 bytes wide + unsigned DefaultDouble8 : 1; // Sets the default double precision type to be 8 bytes wide + unsigned DefaultInt8 : 1; // Sets the default integer type to be 8 bytes wide + LangOptions() { Fortran77 = 0; Fortran90 = Fortran95 = Fortran2000 = Fortran2003 = 1; @@ -44,6 +49,7 @@ public: FreeForm = 1; ReturnComments = 0; SpellChecking = 1; + DefaultReal8 = DefaultDouble8 = DefaultInt8 = 0; } }; diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 19102ed3b9..eda8d1d35a 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -35,14 +35,24 @@ void ASTContext::InitBuiltinTypes() { // [R404] VoidTy = QualType(new (*this, TypeAlignment) VoidType(), 0); - IntegerTy = QualType(getBuiltinType(BuiltinType::Integer, BuiltinType::Int4), 0); - RealTy = QualType(getBuiltinType(BuiltinType::Real, BuiltinType::Real4), 0); - DoublePrecisionTy = QualType(getBuiltinType(BuiltinType::Real, BuiltinType::Real8, + auto Opts = getLangOpts(); + auto IntKind = Opts.DefaultInt8? Type::Int8 : Type::Int4; + auto RealKind = Opts.DefaultReal8? Type::Real8 : Type::Real4; + auto DblKind = Type::Real8; + if(Opts.DefaultReal8 && !Opts.DefaultDouble8) + DblKind = Type::Real16; + + IntegerTy = QualType(getBuiltinType(BuiltinType::Integer, IntKind), 0); + + RealTy = QualType(getBuiltinType(BuiltinType::Real, RealKind), 0); + DoublePrecisionTy = QualType(getBuiltinType(BuiltinType::Real, DblKind, false, true), 0); - ComplexTy = QualType(getBuiltinType(BuiltinType::Complex, BuiltinType::Real4), 0); - DoubleComplexTy = QualType(getBuiltinType(BuiltinType::Complex, BuiltinType::Real8, + + ComplexTy = QualType(getBuiltinType(BuiltinType::Complex, RealKind), 0); + DoubleComplexTy = QualType(getBuiltinType(BuiltinType::Complex, DblKind, false, true), 0); - LogicalTy = QualType(getBuiltinType(BuiltinType::Logical, BuiltinType::Int4), 0); + + LogicalTy = QualType(getBuiltinType(BuiltinType::Logical, IntKind), 0); CharacterTy = QualType(getCharacterType(1), 0); NoLengthCharacterTy = QualType(getCharacterType(0), 0); diff --git a/test/CodeGen/defaultDouble8.f95 b/test/CodeGen/defaultDouble8.f95 new file mode 100644 index 0000000000..327023f910 --- /dev/null +++ b/test/CodeGen/defaultDouble8.f95 @@ -0,0 +1,7 @@ +! RUN: %flang -fdefault-real-8 -fdefault-double-8 -emit-llvm -o - %s | %file_check %s + +program test + real x ! CHECK: alloca double + double precision y ! CHECK-NEXT: alloca double + integer i ! CHECK-NEXT: alloca i32 +end diff --git a/test/CodeGen/defaultInt8.f95 b/test/CodeGen/defaultInt8.f95 new file mode 100644 index 0000000000..e530b13784 --- /dev/null +++ b/test/CodeGen/defaultInt8.f95 @@ -0,0 +1,6 @@ +! RUN: %flang -fdefault-integer-8 -emit-llvm -o - %s | %file_check %s + +program test + integer i ! CHECK: alloca i64 + logical l ! CHECK-NEXT: alloca i64 +end diff --git a/test/CodeGen/defaultReal8.f95 b/test/CodeGen/defaultReal8.f95 new file mode 100644 index 0000000000..e442ea1a60 --- /dev/null +++ b/test/CodeGen/defaultReal8.f95 @@ -0,0 +1,7 @@ +! RUN: %flang -fdefault-real-8 -emit-llvm -o - %s | %file_check %s + +program test + real x ! CHECK: alloca double + double precision y ! CHECK-NEXT: alloca fp128 + integer i ! CHECK-NEXT: alloca i32 +end diff --git a/tools/driver/Main.cpp b/tools/driver/Main.cpp index 62618565a3..39e0547999 100644 --- a/tools/driver/Main.cpp +++ b/tools/driver/Main.cpp @@ -110,6 +110,15 @@ namespace { cl::opt<std::string> TargetTriple("triple", cl::desc("target triple"), cl::init("")); + cl::opt<bool> + DefaultReal8("fdefault-real-8", cl::desc("set the kind of the default real type to 8"), cl::init(false)); + + cl::opt<bool> + DefaultDouble8("fdefault-double-8", cl::desc("set the kind of the default double type to 8"), cl::init(false)); + + cl::opt<bool> + DefaultInt8("fdefault-integer-8", cl::desc("set the kind of the default integer type to 8"), cl::init(false)); + } // end anonymous namespace @@ -297,6 +306,9 @@ static bool ParseFile(const std::string &Filename, SrcMgr.AddNewSourceBuffer(MB.take(), llvm::SMLoc()); LangOptions Opts; + Opts.DefaultReal8 = DefaultReal8; + Opts.DefaultDouble8 = DefaultDouble8; + Opts.DefaultInt8 = DefaultInt8; Opts.ReturnComments = ReturnComments; llvm::StringRef Ext = llvm::sys::path::extension(Filename); if(Ext.equals_lower(".f")) { |