[PATCH] D33356: [Nios2] Changes in frontend to support Nios2 LLVM target

2017-06-08 Thread Nikolai Bozhenov via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL304994: Frontend support for Nios2 target. (authored by 
n.bozhenov).

Changed prior to commit:
  https://reviews.llvm.org/D33356?vs=100674=101941#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D33356

Files:
  cfe/trunk/include/clang/Basic/BuiltinsNios2.def
  cfe/trunk/include/clang/Basic/TargetBuiltins.h
  cfe/trunk/lib/Basic/Targets.cpp
  cfe/trunk/lib/Driver/ToolChains/CommonArgs.cpp
  cfe/trunk/test/Driver/nios2-cpu.c

Index: cfe/trunk/lib/Driver/ToolChains/CommonArgs.cpp
===
--- cfe/trunk/lib/Driver/ToolChains/CommonArgs.cpp
+++ cfe/trunk/lib/Driver/ToolChains/CommonArgs.cpp
@@ -215,6 +215,21 @@
   return "";
 }
 
+static std::string getNios2TargetCPU(const ArgList ) {
+  Arg *A = Args.getLastArg(options::OPT_mcpu_EQ);
+  if (!A)
+A = Args.getLastArg(options::OPT_march_EQ);
+
+  if (!A)
+return "";
+
+  const char *name = A->getValue();
+  return llvm::StringSwitch(name)
+  .Case("r1", "nios2r1")
+  .Case("r2", "nios2r2")
+  .Default(name);
+}
+
 static std::string getLanaiTargetCPU(const ArgList ) {
   if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
 return A->getValue();
@@ -267,6 +282,10 @@
   return A->getValue();
 return "";
 
+  case llvm::Triple::nios2: {
+return getNios2TargetCPU(Args);
+  }
+
   case llvm::Triple::mips:
   case llvm::Triple::mipsel:
   case llvm::Triple::mips64:
Index: cfe/trunk/lib/Basic/Targets.cpp
===
--- cfe/trunk/lib/Basic/Targets.cpp
+++ cfe/trunk/lib/Basic/Targets.cpp
@@ -7702,6 +7702,148 @@
   }
 };
 
+class Nios2TargetInfo : public TargetInfo {
+  void setDataLayout() {
+if (BigEndian)
+  resetDataLayout("E-p:32:32:32-i8:8:32-i16:16:32-n32");
+else
+  resetDataLayout("e-p:32:32:32-i8:8:32-i16:16:32-n32");
+  }
+
+  static const Builtin::Info BuiltinInfo[];
+  std::string CPU;
+  std::string ABI;
+
+public:
+  Nios2TargetInfo(const llvm::Triple , const TargetOptions )
+  : TargetInfo(triple), CPU(opts.CPU), ABI(opts.ABI) {
+SizeType = UnsignedInt;
+PtrDiffType = SignedInt;
+MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
+setDataLayout();
+  }
+
+  StringRef getABI() const override { return ABI; }
+  bool setABI(const std::string ) override {
+if (Name == "o32" || Name == "eabi") {
+  ABI = Name;
+  return true;
+}
+return false;
+  }
+
+  bool setCPU(const std::string ) override {
+if (Name == "nios2r1" || Name == "nios2r2") {
+  CPU = Name;
+  return true;
+}
+return false;
+  }
+
+  void getTargetDefines(const LangOptions ,
+MacroBuilder ) const override {
+DefineStd(Builder, "nios2", Opts);
+DefineStd(Builder, "NIOS2", Opts);
+
+Builder.defineMacro("__nios2");
+Builder.defineMacro("__NIOS2");
+Builder.defineMacro("__nios2__");
+Builder.defineMacro("__NIOS2__");
+  }
+
+  ArrayRef getTargetBuiltins() const override {
+return llvm::makeArrayRef(BuiltinInfo, clang::Nios2::LastTSBuiltin -
+   Builtin::FirstTSBuiltin);
+  }
+
+  bool isFeatureSupportedByCPU(StringRef Feature, StringRef CPU) const {
+const bool isR2 = CPU == "nios2r2";
+return llvm::StringSwitch(Feature)
+.Case("nios2r2mandatory", isR2)
+.Case("nios2r2bmx", isR2)
+.Case("nios2r2mpx", isR2)
+.Case("nios2r2cdx", isR2)
+.Default(false);
+  }
+
+  bool initFeatureMap(llvm::StringMap ,
+  DiagnosticsEngine , StringRef CPU,
+  const std::vector ) const override {
+static const char *allFeatures[] = {
+  "nios2r2mandatory", "nios2r2bmx", "nios2r2mpx", "nios2r2cdx"
+};
+for (const char *feature : allFeatures) {
+  Features[feature] = isFeatureSupportedByCPU(feature, CPU);
+}
+return true;
+  }
+
+  bool hasFeature(StringRef Feature) const override {
+return isFeatureSupportedByCPU(Feature, CPU);
+  }
+
+  BuiltinVaListKind getBuiltinVaListKind() const override {
+return TargetInfo::VoidPtrBuiltinVaList;
+  }
+
+  ArrayRef getGCCRegNames() const override {
+static const char *const GCCRegNames[] = {
+  // CPU register names
+  // Must match second column of GCCRegAliases
+  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
+  "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20",
+  "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30",
+  "r31",
+  // Floating point register names
+  "ctl0", "ctl1", "ctl2", "ctl3", "ctl4", "ctl5", "ctl6", "ctl7", "ctl8",
+  "ctl9", "ctl10", "ctl11", "ctl12", "ctl13", "ctl14", "ctl15"
+};
+return llvm::makeArrayRef(GCCRegNames);
+  }
+
+  bool validateAsmConstraint(const char *,
+ 

[PATCH] D33356: [Nios2] Changes in frontend to support Nios2 LLVM target

2017-06-06 Thread Craig Topper via Phabricator via cfe-commits
craig.topper accepted this revision.
craig.topper added a comment.
This revision is now accepted and ready to land.

LGTM




Comment at: lib/Basic/Targets.cpp:7678
+for (const char *feature : allFeatures) {
+Features[feature] = isFeatureSupportedByCPU(feature, CPU);
+}

This is indented too far. Can you fix when you commit?


https://reviews.llvm.org/D33356



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D33356: [Nios2] Changes in frontend to support Nios2 LLVM target

2017-05-30 Thread Mateusz Belicki via Phabricator via cfe-commits
belickim updated this revision to Diff 100674.
belickim added a comment.

Thanks Akira for your comments, I made all changes that you suggested.


https://reviews.llvm.org/D33356

Files:
  include/clang/Basic/BuiltinsNios2.def
  include/clang/Basic/TargetBuiltins.h
  lib/Basic/Targets.cpp
  lib/Driver/ToolChains/CommonArgs.cpp
  test/Driver/nios2-cpu.c

Index: test/Driver/nios2-cpu.c
===
--- test/Driver/nios2-cpu.c
+++ test/Driver/nios2-cpu.c
@@ -0,0 +1,26 @@
+// RUN: %clang -target nios2--- %s -### -o %t.o 2>&1 \
+// RUN:   | FileCheck %s
+
+// RUN: %clang -target nios2--- -mcpu=r1 %s -### -o %t.o 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-R1 %s
+// RUN: %clang -target nios2--- -mcpu=nios2r1 %s -### -o %t.o 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-R1 %s
+// RUN: %clang -target nios2--- -march=r1 %s -### -o %t.o 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-R1 %s
+// RUN: %clang -target nios2--- -march=nios2r1 %s -### -o %t.o 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-R1 %s
+
+// RUN: %clang -target nios2--- -mcpu=r2 %s -### -o %t.o 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-R2 %s
+// RUN: %clang -target nios2--- -mcpu=nios2r2 %s -### -o %t.o 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-R2 %s
+// RUN: %clang -target nios2--- -march=r2 %s -### -o %t.o 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-R2 %s
+// RUN: %clang -target nios2--- -march=nios2r2 %s -### -o %t.o 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-R2 %s
+
+// CHECK: "-target" "nios2"
+// CHECK-R1: "-target" "nios2"
+// CHECK-R1: "-target-cpu" "nios2r1"
+// CHECK-R2: "-target" "nios2"
+// CHECK-R2: "-target-cpu" "nios2r2"
Index: lib/Driver/ToolChains/CommonArgs.cpp
===
--- lib/Driver/ToolChains/CommonArgs.cpp
+++ lib/Driver/ToolChains/CommonArgs.cpp
@@ -215,6 +215,21 @@
   return "";
 }
 
+static std::string getNios2TargetCPU(const ArgList ) {
+  Arg *A = Args.getLastArg(options::OPT_mcpu_EQ);
+  if (!A)
+A = Args.getLastArg(options::OPT_march_EQ);
+
+  if (!A)
+return "";
+
+  const char *name = A->getValue();
+  return llvm::StringSwitch(name)
+  .Case("r1", "nios2r1")
+  .Case("r2", "nios2r2")
+  .Default(name);
+}
+
 static std::string getLanaiTargetCPU(const ArgList ) {
   if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
 return A->getValue();
@@ -267,6 +282,10 @@
   return A->getValue();
 return "";
 
+  case llvm::Triple::nios2: {
+return getNios2TargetCPU(Args);
+  }
+
   case llvm::Triple::mips:
   case llvm::Triple::mipsel:
   case llvm::Triple::mips64:
Index: lib/Basic/Targets.cpp
===
--- lib/Basic/Targets.cpp
+++ lib/Basic/Targets.cpp
@@ -7604,6 +7604,148 @@
   }
 };
 
+class Nios2TargetInfo : public TargetInfo {
+  void setDataLayout() {
+if (BigEndian)
+  resetDataLayout("E-p:32:32:32-i8:8:32-i16:16:32-n32");
+else
+  resetDataLayout("e-p:32:32:32-i8:8:32-i16:16:32-n32");
+  }
+
+  static const Builtin::Info BuiltinInfo[];
+  std::string CPU;
+  std::string ABI;
+
+public:
+  Nios2TargetInfo(const llvm::Triple , const TargetOptions )
+  : TargetInfo(triple), CPU(opts.CPU), ABI(opts.ABI) {
+SizeType = UnsignedInt;
+PtrDiffType = SignedInt;
+MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
+setDataLayout();
+  }
+
+  StringRef getABI() const override { return ABI; }
+  bool setABI(const std::string ) override {
+if (Name == "o32" || Name == "eabi") {
+  ABI = Name;
+  return true;
+}
+return false;
+  }
+
+  bool setCPU(const std::string ) override {
+if (Name == "nios2r1" || Name == "nios2r2") {
+  CPU = Name;
+  return true;
+}
+return false;
+  }
+
+  void getTargetDefines(const LangOptions ,
+MacroBuilder ) const override {
+DefineStd(Builder, "nios2", Opts);
+DefineStd(Builder, "NIOS2", Opts);
+
+Builder.defineMacro("__nios2");
+Builder.defineMacro("__NIOS2");
+Builder.defineMacro("__nios2__");
+Builder.defineMacro("__NIOS2__");
+  }
+
+  ArrayRef getTargetBuiltins() const override {
+return llvm::makeArrayRef(BuiltinInfo, clang::Nios2::LastTSBuiltin -
+   Builtin::FirstTSBuiltin);
+  }
+
+  bool isFeatureSupportedByCPU(StringRef Feature, StringRef CPU) const {
+const bool isR2 = CPU == "nios2r2";
+return llvm::StringSwitch(Feature)
+.Case("nios2r2mandatory", isR2)
+.Case("nios2r2bmx", isR2)
+.Case("nios2r2mpx", isR2)
+.Case("nios2r2cdx", isR2)
+.Default(false);
+  }
+
+  bool initFeatureMap(llvm::StringMap ,
+  DiagnosticsEngine , StringRef CPU,
+  const std::vector ) const override {
+static const char *allFeatures[] = {
+  "nios2r2mandatory", "nios2r2bmx", "nios2r2mpx", "nios2r2cdx"
+  

[PATCH] D33356: [Nios2] Changes in frontend to support Nios2 LLVM target

2017-05-30 Thread Mateusz Belicki via Phabricator via cfe-commits
belickim added inline comments.



Comment at: include/clang/Basic/TargetBuiltins.h:154
+  /// \brief Nios2 builtins
+  namespace Nios2 {
+  enum {

ahatanak wrote:
> No need to indent enum inside namespace.
> 
> http://llvm.org/docs/CodingStandards.html#namespace-indentation
I was trying to follow conventions used by other code in this file (this also 
applies to some extend to other things that you pointed out). I will try to 
follow LLVM coding conventions over style present in file for any future 
changes. Thank you for your comments, I will prepare update with all changes 
that you suggested.


https://reviews.llvm.org/D33356



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D33356: [Nios2] Changes in frontend to support Nios2 LLVM target

2017-05-30 Thread Akira Hatanaka via Phabricator via cfe-commits
ahatanak added a comment.

A couple of coding style nits. FYI, LLVM coding standard is documented here:

http://llvm.org/docs/CodingStandards.html




Comment at: include/clang/Basic/TargetBuiltins.h:154
+  /// \brief Nios2 builtins
+  namespace Nios2 {
+  enum {

No need to indent enum inside namespace.

http://llvm.org/docs/CodingStandards.html#namespace-indentation



Comment at: lib/Basic/Targets.cpp:7609
+  void setDataLayout() {
+if (BigEndian) {
+  resetDataLayout("E-p:32:32:32-i8:8:32-i16:16:32-n32");

No need for curly braces here.



Comment at: lib/Basic/Targets.cpp:7631
+  bool setABI(const std::string ) override {
+if ((Name == "o32") || (Name == "eabi")) {
+  ABI = Name;

You don't need the inner parentheses here and the code below.



Comment at: lib/Basic/Targets.cpp:7685
+  bool hasFeature(StringRef Feature) const override {
+  return isFeatureSupportedByCPU(Feature, CPU);
+  }

Two space indentation here.



Comment at: lib/Driver/ToolChains/CommonArgs.cpp:220
+  Arg *A = Args.getLastArg(options::OPT_mcpu_EQ);
+  if (A == nullptr)
+A = Args.getLastArg(options::OPT_march_EQ);

You can just write "if (!A)". Also, you can move up the return statement at the 
end of the function and do an early return.


```
if (A!) {
  ...
  return ""
}

const *name = A->getValue();
...

```


https://reviews.llvm.org/D33356



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D33356: [Nios2] Changes in frontend to support Nios2 LLVM target

2017-05-30 Thread Mateusz Belicki via Phabricator via cfe-commits
belickim updated this revision to Diff 100668.
belickim added a comment.

I added test for driver to check if target and CPU flags are recognized, as 
Craig suggested.


https://reviews.llvm.org/D33356

Files:
  include/clang/Basic/BuiltinsNios2.def
  include/clang/Basic/TargetBuiltins.h
  lib/Basic/Targets.cpp
  lib/Driver/ToolChains/CommonArgs.cpp
  test/Driver/nios2-cpu.c

Index: test/Driver/nios2-cpu.c
===
--- test/Driver/nios2-cpu.c
+++ test/Driver/nios2-cpu.c
@@ -0,0 +1,26 @@
+// RUN: %clang -target nios2--- %s -### -o %t.o 2>&1 \
+// RUN:   | FileCheck %s
+
+// RUN: %clang -target nios2--- -mcpu=r1 %s -### -o %t.o 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-R1 %s
+// RUN: %clang -target nios2--- -mcpu=nios2r1 %s -### -o %t.o 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-R1 %s
+// RUN: %clang -target nios2--- -march=r1 %s -### -o %t.o 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-R1 %s
+// RUN: %clang -target nios2--- -march=nios2r1 %s -### -o %t.o 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-R1 %s
+
+// RUN: %clang -target nios2--- -mcpu=r2 %s -### -o %t.o 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-R2 %s
+// RUN: %clang -target nios2--- -mcpu=nios2r2 %s -### -o %t.o 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-R2 %s
+// RUN: %clang -target nios2--- -march=r2 %s -### -o %t.o 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-R2 %s
+// RUN: %clang -target nios2--- -march=nios2r2 %s -### -o %t.o 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-R2 %s
+
+// CHECK: "-target" "nios2"
+// CHECK-R1: "-target" "nios2"
+// CHECK-R1: "-target-cpu" "nios2r1"
+// CHECK-R2: "-target" "nios2"
+// CHECK-R2: "-target-cpu" "nios2r2"
Index: lib/Driver/ToolChains/CommonArgs.cpp
===
--- lib/Driver/ToolChains/CommonArgs.cpp
+++ lib/Driver/ToolChains/CommonArgs.cpp
@@ -215,6 +215,21 @@
   return "";
 }
 
+static std::string getNios2TargetCPU(const ArgList ) {
+  Arg *A = Args.getLastArg(options::OPT_mcpu_EQ);
+  if (A == nullptr)
+A = Args.getLastArg(options::OPT_march_EQ);
+
+  if (A) {
+const char *name = A->getValue();
+return llvm::StringSwitch(name)
+.Case("r1", "nios2r1")
+.Case("r2", "nios2r2")
+.Default(name);
+  }
+  return "";
+}
+
 static std::string getLanaiTargetCPU(const ArgList ) {
   if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
 return A->getValue();
@@ -267,6 +282,10 @@
   return A->getValue();
 return "";
 
+  case llvm::Triple::nios2: {
+return getNios2TargetCPU(Args);
+  }
+
   case llvm::Triple::mips:
   case llvm::Triple::mipsel:
   case llvm::Triple::mips64:
Index: lib/Basic/Targets.cpp
===
--- lib/Basic/Targets.cpp
+++ lib/Basic/Targets.cpp
@@ -7604,6 +7604,148 @@
   }
 };
 
+class Nios2TargetInfo : public TargetInfo {
+  void setDataLayout() {
+if (BigEndian) {
+  resetDataLayout("E-p:32:32:32-i8:8:32-i16:16:32-n32");
+} else {
+  resetDataLayout("e-p:32:32:32-i8:8:32-i16:16:32-n32");
+}
+  }
+
+  static const Builtin::Info BuiltinInfo[];
+  std::string CPU;
+  std::string ABI;
+
+public:
+  Nios2TargetInfo(const llvm::Triple , const TargetOptions )
+  : TargetInfo(triple), CPU(opts.CPU), ABI(opts.ABI) {
+SizeType = UnsignedInt;
+PtrDiffType = SignedInt;
+MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
+setDataLayout();
+  }
+
+  StringRef getABI() const override { return ABI; }
+  bool setABI(const std::string ) override {
+if ((Name == "o32") || (Name == "eabi")) {
+  ABI = Name;
+  return true;
+}
+return false;
+  }
+
+  bool setCPU(const std::string ) override {
+if ((Name == "nios2r1") || (Name == "nios2r2")) {
+  CPU = Name;
+  return true;
+}
+return false;
+  }
+
+  void getTargetDefines(const LangOptions ,
+MacroBuilder ) const override {
+DefineStd(Builder, "nios2", Opts);
+DefineStd(Builder, "NIOS2", Opts);
+
+Builder.defineMacro("__nios2");
+Builder.defineMacro("__NIOS2");
+Builder.defineMacro("__nios2__");
+Builder.defineMacro("__NIOS2__");
+  }
+
+  ArrayRef getTargetBuiltins() const override {
+return llvm::makeArrayRef(BuiltinInfo, clang::Nios2::LastTSBuiltin -
+   Builtin::FirstTSBuiltin);
+  }
+
+  bool isFeatureSupportedByCPU(StringRef Feature, StringRef CPU) const {
+const bool isR2 = CPU == "nios2r2";
+return llvm::StringSwitch(Feature)
+.Case("nios2r2mandatory", isR2)
+.Case("nios2r2bmx", isR2)
+.Case("nios2r2mpx", isR2)
+.Case("nios2r2cdx", isR2)
+.Default(false);
+  }
+
+  bool initFeatureMap(llvm::StringMap ,
+  DiagnosticsEngine , StringRef CPU,
+  const std::vector ) const override {
+static const char *allFeatures[] = {
+

[PATCH] D33356: [Nios2] Changes in frontend to support Nios2 LLVM target

2017-05-24 Thread Craig Topper via Phabricator via cfe-commits
craig.topper added a comment.

Is there enough functional here that there should be tests for? i.e. make sure 
march/mcpu switches are recognized, that the target is recognized, etc.


https://reviews.llvm.org/D33356



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D33356: [Nios2] Changes in frontend to support Nios2 LLVM target

2017-05-19 Thread Joerg Sonnenberger via Phabricator via cfe-commits
joerg added inline comments.



Comment at: lib/Basic/Targets.cpp:7650
+DefineStd(Builder, "nios2", Opts);
+DefineStd(Builder, "NIOS2", Opts);
+

belickim wrote:
> joerg wrote:
> > belickim wrote:
> > > joerg wrote:
> > > > DefineStd tends to give a lot of namespace pollution, is that 
> > > > intentional here?
> > > Yes, the usage is intentional: definitions of all four: `__nios2`, 
> > > `__nios2__`, `__NIOS2` and `__NIOS2__` are part of Nios2 ABI (page 23, 
> > > https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/hb/nios2/n2cpu_nii51016.pdf).
> > The problem is that DefineStd will also define the no-underscore version in 
> > GNU mode.
> Oh, that definitely is not needed in our case. I will remove the usage of 
> `DefineStd()`. Looking at implementations of other `TargetInfo`s, I assume 
> that preferred solution would be to manually call `Builder.defineMacro()` for 
> all four defintions.
Yes, that's fine/


https://reviews.llvm.org/D33356



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D33356: [Nios2] Changes in frontend to support Nios2 LLVM target

2017-05-19 Thread Mateusz Belicki via Phabricator via cfe-commits
belickim added inline comments.



Comment at: lib/Basic/Targets.cpp:7650
+DefineStd(Builder, "nios2", Opts);
+DefineStd(Builder, "NIOS2", Opts);
+

joerg wrote:
> belickim wrote:
> > joerg wrote:
> > > DefineStd tends to give a lot of namespace pollution, is that intentional 
> > > here?
> > Yes, the usage is intentional: definitions of all four: `__nios2`, 
> > `__nios2__`, `__NIOS2` and `__NIOS2__` are part of Nios2 ABI (page 23, 
> > https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/hb/nios2/n2cpu_nii51016.pdf).
> The problem is that DefineStd will also define the no-underscore version in 
> GNU mode.
Oh, that definitely is not needed in our case. I will remove the usage of 
`DefineStd()`. Looking at implementations of other `TargetInfo`s, I assume that 
preferred solution would be to manually call `Builder.defineMacro()` for all 
four defintions.


https://reviews.llvm.org/D33356



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D33356: [Nios2] Changes in frontend to support Nios2 LLVM target

2017-05-19 Thread Joerg Sonnenberger via Phabricator via cfe-commits
joerg added inline comments.



Comment at: lib/Basic/Targets.cpp:7650
+DefineStd(Builder, "nios2", Opts);
+DefineStd(Builder, "NIOS2", Opts);
+

belickim wrote:
> joerg wrote:
> > DefineStd tends to give a lot of namespace pollution, is that intentional 
> > here?
> Yes, the usage is intentional: definitions of all four: `__nios2`, 
> `__nios2__`, `__NIOS2` and `__NIOS2__` are part of Nios2 ABI (page 23, 
> https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/hb/nios2/n2cpu_nii51016.pdf).
The problem is that DefineStd will also define the no-underscore version in GNU 
mode.


https://reviews.llvm.org/D33356



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D33356: [Nios2] Changes in frontend to support Nios2 LLVM target

2017-05-19 Thread Mateusz Belicki via Phabricator via cfe-commits
belickim added a comment.

Additionally this information may be useful in context of this patch: here is 
specification of Nios2 builtins as implemented in GCC: 
https://gcc.gnu.org/onlinedocs/gcc/Altera-Nios-II-Built-in-Functions.html


https://reviews.llvm.org/D33356



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D33356: [Nios2] Changes in frontend to support Nios2 LLVM target

2017-05-19 Thread Mateusz Belicki via Phabricator via cfe-commits
belickim added inline comments.



Comment at: lib/Basic/Targets.cpp:7614
+  resetDataLayout(("e-" + Layout).str());
+}
+  }

joerg wrote:
> Can you just give the full string and avoid the runtime allocations?
Yes, I will fix this.



Comment at: lib/Basic/Targets.cpp:7650
+DefineStd(Builder, "nios2", Opts);
+DefineStd(Builder, "NIOS2", Opts);
+

joerg wrote:
> DefineStd tends to give a lot of namespace pollution, is that intentional 
> here?
Yes, the usage is intentional: definitions of all four: `__nios2`, `__nios2__`, 
`__NIOS2` and `__NIOS2__` are part of Nios2 ABI (page 23, 
https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/hb/nios2/n2cpu_nii51016.pdf).


https://reviews.llvm.org/D33356



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D33356: [Nios2] Changes in frontend to support Nios2 LLVM target

2017-05-19 Thread Joerg Sonnenberger via Phabricator via cfe-commits
joerg added inline comments.



Comment at: lib/Basic/Targets.cpp:7614
+  resetDataLayout(("e-" + Layout).str());
+}
+  }

Can you just give the full string and avoid the runtime allocations?



Comment at: lib/Basic/Targets.cpp:7650
+DefineStd(Builder, "nios2", Opts);
+DefineStd(Builder, "NIOS2", Opts);
+

DefineStd tends to give a lot of namespace pollution, is that intentional here?


https://reviews.llvm.org/D33356



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D33356: [Nios2] Changes in frontend to support Nios2 LLVM target

2017-05-19 Thread Mateusz Belicki via Phabricator via cfe-commits
belickim created this revision.

Hello,

This patch is part of our effort to implement Nios2 architecture support in 
LLVM and clang (our plans were announced in mailing list thread: "[llvm-dev] 
[RFC] Nios II backend" form April 12th).

This patch depends on changes introduced by patch D32669 
.

The patch contains following additions:

- Nios2 builtins;
- using -march or -mcpu options to specify Nios2 CPU type 
(https://reviews.llvm.org/diffusion/L/ or R2) ;
- TargetInfo class implementation for Nios2.

Please let me know what you think about proposed change set.

Kind regards,
Mateusz Belicki


https://reviews.llvm.org/D33356

Files:
  include/clang/Basic/BuiltinsNios2.def
  include/clang/Basic/TargetBuiltins.h
  lib/Basic/Targets.cpp
  lib/Driver/ToolChains/CommonArgs.cpp

Index: lib/Driver/ToolChains/CommonArgs.cpp
===
--- lib/Driver/ToolChains/CommonArgs.cpp
+++ lib/Driver/ToolChains/CommonArgs.cpp
@@ -215,6 +215,21 @@
   return "";
 }
 
+static std::string getNios2TargetCPU(const ArgList ) {
+  Arg *A = Args.getLastArg(options::OPT_mcpu_EQ);
+  if (A == nullptr)
+A = Args.getLastArg(options::OPT_march_EQ);
+
+  if (A) {
+const char *name = A->getValue();
+return llvm::StringSwitch(name)
+.Case("r1", "nios2r1")
+.Case("r2", "nios2r2")
+.Default(name);
+  }
+  return "";
+}
+
 static std::string getLanaiTargetCPU(const ArgList ) {
   if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
 return A->getValue();
@@ -267,6 +282,10 @@
   return A->getValue();
 return "";
 
+  case llvm::Triple::nios2: {
+return getNios2TargetCPU(Args);
+  }
+
   case llvm::Triple::mips:
   case llvm::Triple::mipsel:
   case llvm::Triple::mips64:
Index: lib/Basic/Targets.cpp
===
--- lib/Basic/Targets.cpp
+++ lib/Basic/Targets.cpp
@@ -7604,6 +7604,147 @@
   }
 };
 
+class Nios2TargetInfo : public TargetInfo {
+  void setDataLayout() {
+StringRef Layout = "p:32:32:32-i8:8:32-i16:16:32-n32";
+if (BigEndian) {
+  resetDataLayout(("E-" + Layout).str());
+} else {
+  resetDataLayout(("e-" + Layout).str());
+}
+  }
+
+  static const Builtin::Info BuiltinInfo[];
+  std::string CPU;
+  std::string ABI;
+
+public:
+  Nios2TargetInfo(const llvm::Triple , const TargetOptions )
+  : TargetInfo(triple), CPU(opts.CPU), ABI(opts.ABI) {
+SizeType = UnsignedInt;
+PtrDiffType = SignedInt;
+MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
+setDataLayout();
+  }
+
+  StringRef getABI() const override { return ABI; }
+  bool setABI(const std::string ) override {
+if ((Name == "o32") || (Name == "eabi")) {
+  ABI = Name;
+  return true;
+}
+return false;
+  }
+
+  bool setCPU(const std::string ) override {
+if ((Name == "nios2r1") || (Name == "nios2r2")) {
+  CPU = Name;
+  return true;
+}
+return false;
+  }
+
+  void getTargetDefines(const LangOptions ,
+MacroBuilder ) const override {
+DefineStd(Builder, "nios2", Opts);
+DefineStd(Builder, "NIOS2", Opts);
+
+Builder.defineMacro("_NIOS2_ARCH", "\"" + CPU + "\"");
+Builder.defineMacro("_NIOS2_ARCH_" + StringRef(CPU).upper());
+  }
+
+  ArrayRef getTargetBuiltins() const override {
+return llvm::makeArrayRef(BuiltinInfo, clang::Nios2::LastTSBuiltin -
+   Builtin::FirstTSBuiltin);
+  }
+
+  bool isFeatureSupportedByCPU(StringRef Feature, StringRef CPU) const {
+const bool isR2 = CPU == "nios2r2";
+return llvm::StringSwitch(Feature)
+.Case("nios2r2mandatory", isR2)
+.Case("nios2r2bmx", isR2)
+.Case("nios2r2mpx", isR2)
+.Case("nios2r2cdx", isR2)
+.Default(false);
+  }
+
+  bool initFeatureMap(llvm::StringMap ,
+  DiagnosticsEngine , StringRef CPU,
+  const std::vector ) const override {
+static const char *allFeatures[] = {
+  "nios2r2mandatory", "nios2r2bmx", "nios2r2mpx", "nios2r2cdx"
+};
+for (const char *feature : allFeatures) {
+Features[feature] = isFeatureSupportedByCPU(feature, CPU);
+}
+return true;
+  }
+
+  bool hasFeature(StringRef Feature) const override {
+  return isFeatureSupportedByCPU(Feature, CPU);
+  }
+
+  BuiltinVaListKind getBuiltinVaListKind() const override {
+return TargetInfo::VoidPtrBuiltinVaList;
+  }
+
+  ArrayRef getGCCRegNames() const override {
+static const char *const GCCRegNames[] = {
+// CPU register names
+// Must match second column of GCCRegAliases
+"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
+"r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20",
+"r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30",
+"r31",
+// Control register names
+