summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorarphaman <arphaman@gmail.com>2013-09-19 16:54:29 +0100
committerarphaman <arphaman@gmail.com>2013-09-19 16:54:29 +0100
commitfecfae1085a7bd566632d8afcfe34aa9a24dc423 (patch)
tree9717dfa3691d42ecb9f93aca360bea4bf5c83859
parent3b95e9a2d88dbcc4e83ce1184a591f15f21add9b (diff)
downloadflang-fecfae1085a7bd566632d8afcfe34aa9a24dc423.tar.gz
added support for -fdefault-{real|double|integer}-8 option
-rw-r--r--include/flang/Basic/LangOptions.h6
-rw-r--r--lib/AST/ASTContext.cpp22
-rw-r--r--test/CodeGen/defaultDouble8.f957
-rw-r--r--test/CodeGen/defaultInt8.f956
-rw-r--r--test/CodeGen/defaultReal8.f957
-rw-r--r--tools/driver/Main.cpp12
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")) {