[PATCH] D24461: CodeGen: Cast llvm.flt.rounds result to match __builtin_flt_rounds
edward-jones added a comment. Ping. https://reviews.llvm.org/D24461 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] de61aa3 - [RISCV] Improve sysroot computation if no GCC install detected
Author: Edward Jones Date: 2019-11-07T15:17:40Z New Revision: de61aa3118b9bac85c468ea7ec40604a086744f5 URL: https://github.com/llvm/llvm-project/commit/de61aa3118b9bac85c468ea7ec40604a086744f5 DIFF: https://github.com/llvm/llvm-project/commit/de61aa3118b9bac85c468ea7ec40604a086744f5.diff LOG: [RISCV] Improve sysroot computation if no GCC install detected If a GCC installed is not detected, the driver would default to the root of the filesystem. This is not ideal when this doesn't match the install directory of the toolchain and can cause undesireable behavior such as picking up system libraries or the system linker when cross-compiling. Differential Revision: https://reviews.llvm.org/D68391 Added: clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/bin/riscv32-unknown-elf-ld clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/crt0.o clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/crtbegin.o clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/crtend.o clang/test/Driver/Inputs/basic_riscv64_nogcc_tree/bin/riscv64-unknown-elf-ld clang/test/Driver/Inputs/basic_riscv64_nogcc_tree/riscv64-unknown-elf/lib/crt0.o clang/test/Driver/Inputs/basic_riscv64_nogcc_tree/riscv64-unknown-elf/lib/crtbegin.o clang/test/Driver/Inputs/basic_riscv64_nogcc_tree/riscv64-unknown-elf/lib/crtend.o clang/test/Driver/riscv32-toolchain-extra.c clang/test/Driver/riscv64-toolchain-extra.c Modified: clang/lib/Driver/ToolChains/RISCVToolchain.cpp Removed: diff --git a/clang/lib/Driver/ToolChains/RISCVToolchain.cpp b/clang/lib/Driver/ToolChains/RISCVToolchain.cpp index 22dc5117f196..e14475551f57 100644 --- a/clang/lib/Driver/ToolChains/RISCVToolchain.cpp +++ b/clang/lib/Driver/ToolChains/RISCVToolchain.cpp @@ -33,6 +33,8 @@ RISCVToolChain::RISCVToolChain(const Driver &D, const llvm::Triple &Triple, getFilePaths().push_back(GCCInstallation.getInstallPath().str()); getProgramPaths().push_back( (GCCInstallation.getParentLibPath() + "/../bin").str()); + } else { +getProgramPaths().push_back(D.Dir); } } @@ -74,17 +76,22 @@ std::string RISCVToolChain::computeSysRoot() const { if (!getDriver().SysRoot.empty()) return getDriver().SysRoot; - if (!GCCInstallation.isValid()) -return std::string(); - - StringRef LibDir = GCCInstallation.getParentLibPath(); - StringRef TripleStr = GCCInstallation.getTriple().str(); - std::string SysRootDir = LibDir.str() + "/../" + TripleStr.str(); + SmallString<128> SysRootDir; + if (GCCInstallation.isValid()) { +StringRef LibDir = GCCInstallation.getParentLibPath(); +StringRef TripleStr = GCCInstallation.getTriple().str(); +llvm::sys::path::append(SysRootDir, LibDir, "..", TripleStr); + } else { +// Use the triple as provided to the driver. Unlike the parsed triple +// this has not been normalized to always contain every field. +llvm::sys::path::append(SysRootDir, getDriver().Dir, "..", +getDriver().getTargetTriple()); + } if (!llvm::sys::fs::exists(SysRootDir)) return std::string(); - return SysRootDir; + return SysRootDir.str(); } void RISCV::Linker::ConstructJob(Compilation &C, const JobAction &JA, diff --git a/clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/bin/riscv32-unknown-elf-ld b/clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/bin/riscv32-unknown-elf-ld new file mode 100755 index ..b23e55619b2f --- /dev/null +++ b/clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/bin/riscv32-unknown-elf-ld @@ -0,0 +1 @@ +#!/bin/true diff --git a/clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/crt0.o b/clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/crt0.o new file mode 100644 index ..e69de29bb2d1 diff --git a/clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/crtbegin.o b/clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/crtbegin.o new file mode 100644 index ..e69de29bb2d1 diff --git a/clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/crtend.o b/clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/crtend.o new file mode 100644 index ..e69de29bb2d1 diff --git a/clang/test/Driver/Inputs/basic_riscv64_nogcc_tree/bin/riscv64-unknown-elf-ld b/clang/test/Driver/Inputs/basic_riscv64_nogcc_tree/bin/riscv64-unknown-elf-ld new file mode 100755 index ..b23e55619b2f --- /dev/null +++ b/clang/test/Driver/Inputs/basic_riscv64_nogcc_tree/bin/riscv64-unknown-elf-ld @@ -0,0 +1 @@ +#!/bin/true diff --git a/clang/test/Driver/Inputs/basic_riscv64_nogcc_tree/riscv64-unknown-elf/lib/crt0.o b/clang/test/Driver/Inputs/basic_riscv64_nogcc_tree/riscv64-unknown-elf/lib/crt0.o new f
[clang] 7adab77 - [Sema] Suppress -Wchar-subscripts if the index is a literal char
Author: Edward Jones Date: 2019-11-07T15:45:44Z New Revision: 7adab7719e55e1b29bfd521dcc73f202139e8f41 URL: https://github.com/llvm/llvm-project/commit/7adab7719e55e1b29bfd521dcc73f202139e8f41 DIFF: https://github.com/llvm/llvm-project/commit/7adab7719e55e1b29bfd521dcc73f202139e8f41.diff LOG: [Sema] Suppress -Wchar-subscripts if the index is a literal char Assume that the user knows what they're doing if they provide a char literal as an array index. This more closely matches the behavior of GCC. Differential Revision: https://reviews.llvm.org/D58896 Added: Modified: clang/lib/Sema/SemaExpr.cpp clang/test/SemaCXX/warn-char-subscripts.cpp Removed: diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index e41cd5b6653a..2842e7199b1d 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -4741,7 +4741,8 @@ Sema::CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, if ((IndexExpr->getType()->isSpecificBuiltinType(BuiltinType::Char_S) || IndexExpr->getType()->isSpecificBuiltinType(BuiltinType::Char_U)) - && !IndexExpr->isTypeDependent()) + && !IndexExpr->isTypeDependent() + && !isa(IndexExpr)) Diag(LLoc, diag::warn_subscript_is_char) << IndexExpr->getSourceRange(); // C99 6.5.2.1p1: "shall have type "pointer to *object* type". Similarly, diff --git a/clang/test/SemaCXX/warn-char-subscripts.cpp b/clang/test/SemaCXX/warn-char-subscripts.cpp index 84ea536b979e..7760ed0e5eba 100644 --- a/clang/test/SemaCXX/warn-char-subscripts.cpp +++ b/clang/test/SemaCXX/warn-char-subscripts.cpp @@ -14,6 +14,19 @@ void t2() { int val = subscript[array]; // expected-warning{{array subscript is of type 'char'}} } +void t3() { + int array[50] = { 0 }; + int val = array[' ']; // no warning, subscript is a literal +} +void t4() { + int array[50] = { 0 }; + int val = '('[array]; // no warning, subscript is a literal +} +void t5() { + int array[50] = { 0 }; + int val = array['\x11']; // no warning, subscript is a literal +} + void test() { t1(); // expected-note {{in instantiation of function template specialization 't1' requested here}} t2(); // expected-note {{in instantiation of function template specialization 't2' requested here}} ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] 90ecfa2 - Revert "[Sema] Suppress -Wchar-subscripts if the index is a literal char"
Author: Edward Jones Date: 2019-11-07T18:45:40Z New Revision: 90ecfa2f5f7feea6e3676d59fe6126e08c52d00e URL: https://github.com/llvm/llvm-project/commit/90ecfa2f5f7feea6e3676d59fe6126e08c52d00e DIFF: https://github.com/llvm/llvm-project/commit/90ecfa2f5f7feea6e3676d59fe6126e08c52d00e.diff LOG: Revert "[Sema] Suppress -Wchar-subscripts if the index is a literal char" This reverts commit 7adab7719e55e1b29bfd521dcc73f202139e8f41. Added: Modified: clang/lib/Sema/SemaExpr.cpp clang/test/SemaCXX/warn-char-subscripts.cpp Removed: diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 2842e7199b1d..e41cd5b6653a 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -4741,8 +4741,7 @@ Sema::CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, if ((IndexExpr->getType()->isSpecificBuiltinType(BuiltinType::Char_S) || IndexExpr->getType()->isSpecificBuiltinType(BuiltinType::Char_U)) - && !IndexExpr->isTypeDependent() - && !isa(IndexExpr)) + && !IndexExpr->isTypeDependent()) Diag(LLoc, diag::warn_subscript_is_char) << IndexExpr->getSourceRange(); // C99 6.5.2.1p1: "shall have type "pointer to *object* type". Similarly, diff --git a/clang/test/SemaCXX/warn-char-subscripts.cpp b/clang/test/SemaCXX/warn-char-subscripts.cpp index 7760ed0e5eba..84ea536b979e 100644 --- a/clang/test/SemaCXX/warn-char-subscripts.cpp +++ b/clang/test/SemaCXX/warn-char-subscripts.cpp @@ -14,19 +14,6 @@ void t2() { int val = subscript[array]; // expected-warning{{array subscript is of type 'char'}} } -void t3() { - int array[50] = { 0 }; - int val = array[' ']; // no warning, subscript is a literal -} -void t4() { - int array[50] = { 0 }; - int val = '('[array]; // no warning, subscript is a literal -} -void t5() { - int array[50] = { 0 }; - int val = array['\x11']; // no warning, subscript is a literal -} - void test() { t1(); // expected-note {{in instantiation of function template specialization 't1' requested here}} t2(); // expected-note {{in instantiation of function template specialization 't2' requested here}} ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] 3289352 - [RISCV] Use compiler-rt if no GCC installation detected
Author: Edward Jones Date: 2019-11-13T17:18:33Z New Revision: 3289352e6bb9d2949c678c625478024bf2a5fbfb URL: https://github.com/llvm/llvm-project/commit/3289352e6bb9d2949c678c625478024bf2a5fbfb DIFF: https://github.com/llvm/llvm-project/commit/3289352e6bb9d2949c678c625478024bf2a5fbfb.diff LOG: [RISCV] Use compiler-rt if no GCC installation detected If a GCC installation is not detected, then this attempts to use compiler-rt and the compiler-rt crtbegin/crtend implementations as a fallback. Differential Revision: https://reviews.llvm.org/D68407 Added: Modified: clang/lib/Driver/ToolChains/RISCVToolchain.cpp clang/lib/Driver/ToolChains/RISCVToolchain.h clang/test/Driver/riscv32-toolchain-extra.c clang/test/Driver/riscv64-toolchain-extra.c Removed: clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/crtbegin.o clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/crtend.o clang/test/Driver/Inputs/basic_riscv64_nogcc_tree/riscv64-unknown-elf/lib/crtbegin.o clang/test/Driver/Inputs/basic_riscv64_nogcc_tree/riscv64-unknown-elf/lib/crtend.o diff --git a/clang/lib/Driver/ToolChains/RISCVToolchain.cpp b/clang/lib/Driver/ToolChains/RISCVToolchain.cpp index 8019940b521f..dc478e6a835e 100644 --- a/clang/lib/Driver/ToolChains/RISCVToolchain.cpp +++ b/clang/lib/Driver/ToolChains/RISCVToolchain.cpp @@ -41,6 +41,16 @@ Tool *RISCVToolChain::buildLinker() const { return new tools::RISCV::Linker(*this); } +ToolChain::RuntimeLibType RISCVToolChain::GetDefaultRuntimeLibType() const { + return GCCInstallation.isValid() ? +ToolChain::RLT_Libgcc : ToolChain::RLT_CompilerRT; +} + +ToolChain::UnwindLibType +RISCVToolChain::GetUnwindLibType(const llvm::opt::ArgList &Args) const { + return ToolChain::UNW_None; +} + void RISCVToolChain::addClangTargetOptions( const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, @@ -110,9 +120,22 @@ void RISCV::Linker::ConstructJob(Compilation &C, const JobAction &JA, bool WantCRTs = !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles); + const char *crtbegin, *crtend; + auto RuntimeLib = ToolChain.GetRuntimeLibType(Args); + if (RuntimeLib == ToolChain::RLT_Libgcc) { +crtbegin = "crtbegin.o"; +crtend = "crtend.o"; + } else { +assert (RuntimeLib == ToolChain::RLT_CompilerRT); +crtbegin = ToolChain.getCompilerRTArgString(Args, "crtbegin", +ToolChain::FT_Object); +crtend = ToolChain.getCompilerRTArgString(Args, "crtend", + ToolChain::FT_Object); + } + if (WantCRTs) { CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o"))); -CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o"))); +CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin))); } Args.AddAllArgs(CmdArgs, options::OPT_L); @@ -133,11 +156,11 @@ void RISCV::Linker::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-lc"); CmdArgs.push_back("-lgloss"); CmdArgs.push_back("--end-group"); -CmdArgs.push_back("-lgcc"); +AddRunTimeLibs(ToolChain, ToolChain.getDriver(), CmdArgs, Args); } if (WantCRTs) -CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o"))); +CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend))); CmdArgs.push_back("-o"); CmdArgs.push_back(Output.getFilename()); diff --git a/clang/lib/Driver/ToolChains/RISCVToolchain.h b/clang/lib/Driver/ToolChains/RISCVToolchain.h index b2b56b066efd..bb7f64849bcb 100644 --- a/clang/lib/Driver/ToolChains/RISCVToolchain.h +++ b/clang/lib/Driver/ToolChains/RISCVToolchain.h @@ -25,6 +25,9 @@ class LLVM_LIBRARY_VISIBILITY RISCVToolChain : public Generic_ELF { void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, Action::OffloadKind) const override; + RuntimeLibType GetDefaultRuntimeLibType() const override; + UnwindLibType + GetUnwindLibType(const llvm::opt::ArgList &Args) const override; void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; diff --git a/clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/crtbegin.o b/clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/crtbegin.o deleted file mode 100644 index e69de29bb2d1.. diff --git a/clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/crtend.o b/clang/test/Driver/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf/lib/crtend.o deleted file mode 100644 index e69de29bb2d1.. diff --git a/clang/test/Driver/Inputs/basic_risc
[clang] e0f22fe - [RISCV] Use compiler-rt if no GCC installation detected
Author: Edward Jones Date: 2019-11-22T20:05:29Z New Revision: e0f22fe04a5c9eb244ff0533549743b7deb03b99 URL: https://github.com/llvm/llvm-project/commit/e0f22fe04a5c9eb244ff0533549743b7deb03b99 DIFF: https://github.com/llvm/llvm-project/commit/e0f22fe04a5c9eb244ff0533549743b7deb03b99.diff LOG: [RISCV] Use compiler-rt if no GCC installation detected If a GCC installation is not detected, then this attempts to use compiler-rt and the compiler-rt crtbegin/crtend implementations as a fallback. Differential Revision: https://reviews.llvm.org/D68407 Added: Modified: clang/lib/Driver/ToolChains/RISCVToolchain.cpp clang/lib/Driver/ToolChains/RISCVToolchain.h clang/test/Driver/riscv32-toolchain-extra.c clang/test/Driver/riscv32-toolchain.c clang/test/Driver/riscv64-toolchain-extra.c clang/test/Driver/riscv64-toolchain.c Removed: diff --git a/clang/lib/Driver/ToolChains/RISCVToolchain.cpp b/clang/lib/Driver/ToolChains/RISCVToolchain.cpp index bd63873e3c6c..25d912428b5f 100644 --- a/clang/lib/Driver/ToolChains/RISCVToolchain.cpp +++ b/clang/lib/Driver/ToolChains/RISCVToolchain.cpp @@ -61,6 +61,16 @@ Tool *RISCVToolChain::buildLinker() const { return new tools::RISCV::Linker(*this); } +ToolChain::RuntimeLibType RISCVToolChain::GetDefaultRuntimeLibType() const { + return GCCInstallation.isValid() ? +ToolChain::RLT_Libgcc : ToolChain::RLT_CompilerRT; +} + +ToolChain::UnwindLibType +RISCVToolChain::GetUnwindLibType(const llvm::opt::ArgList &Args) const { + return ToolChain::UNW_None; +} + void RISCVToolChain::addClangTargetOptions( const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, @@ -138,9 +148,22 @@ void RISCV::Linker::ConstructJob(Compilation &C, const JobAction &JA, bool WantCRTs = !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles); + const char *crtbegin, *crtend; + auto RuntimeLib = ToolChain.GetRuntimeLibType(Args); + if (RuntimeLib == ToolChain::RLT_Libgcc) { +crtbegin = "crtbegin.o"; +crtend = "crtend.o"; + } else { +assert (RuntimeLib == ToolChain::RLT_CompilerRT); +crtbegin = ToolChain.getCompilerRTArgString(Args, "crtbegin", +ToolChain::FT_Object); +crtend = ToolChain.getCompilerRTArgString(Args, "crtend", + ToolChain::FT_Object); + } + if (WantCRTs) { CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o"))); -CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o"))); +CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin))); } Args.AddAllArgs(CmdArgs, options::OPT_L); @@ -161,11 +184,11 @@ void RISCV::Linker::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-lc"); CmdArgs.push_back("-lgloss"); CmdArgs.push_back("--end-group"); -CmdArgs.push_back("-lgcc"); +AddRunTimeLibs(ToolChain, ToolChain.getDriver(), CmdArgs, Args); } if (WantCRTs) -CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o"))); +CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend))); CmdArgs.push_back("-o"); CmdArgs.push_back(Output.getFilename()); diff --git a/clang/lib/Driver/ToolChains/RISCVToolchain.h b/clang/lib/Driver/ToolChains/RISCVToolchain.h index b2b56b066efd..bb7f64849bcb 100644 --- a/clang/lib/Driver/ToolChains/RISCVToolchain.h +++ b/clang/lib/Driver/ToolChains/RISCVToolchain.h @@ -25,6 +25,9 @@ class LLVM_LIBRARY_VISIBILITY RISCVToolChain : public Generic_ELF { void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, Action::OffloadKind) const override; + RuntimeLibType GetDefaultRuntimeLibType() const override; + UnwindLibType + GetUnwindLibType(const llvm::opt::ArgList &Args) const override; void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; diff --git a/clang/test/Driver/riscv32-toolchain-extra.c b/clang/test/Driver/riscv32-toolchain-extra.c index 613667213ac8..d07d0f199ae2 100644 --- a/clang/test/Driver/riscv32-toolchain-extra.c +++ b/clang/test/Driver/riscv32-toolchain-extra.c @@ -19,15 +19,15 @@ // RUN: ln -s %S/Inputs/basic_riscv32_nogcc_tree/bin/riscv32-unknown-elf-ld %T/testroot-riscv32-baremetal-nogcc/bin/riscv32-unknown-elf-ld // RUN: ln -s %S/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf %T/testroot-riscv32-baremetal-nogcc/riscv32-unknown-elf // RUN: %T/testroot-riscv32-baremetal-nogcc/bin/clang %s -### -no-canonical-prefixes \ -// RUN:-target riscv32-unknown-elf 2>&1 \ +// RUN:-target riscv32-unknown-elf --rtlib=platform 2>&1 \ // RUN:| FileCheck -check-prefix=C-RV32-BAREMETAL-ILP32-NOGCC %s -//
Re: [PATCH] D12192: Add clang support for AAP
edward-jones abandoned this revision. edward-jones added a comment. We have closed the accompanying LLVM patch https://reviews.llvm.org/D12191, so this patch is no longer relevant. https://reviews.llvm.org/D12192 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D24461: CodeGen: Cast llvm.flt.rounds result to match __builtin_flt_rounds
edward-jones created this revision. edward-jones added a reviewer: rjmccall. edward-jones added a subscriber: cfe-commits. llvm.flt.rounds returns an i32, but the builtin expects an integer. On targets where integers are not 32-bits clang tries to bitcast the result, causing an assertion failure. https://reviews.llvm.org/D24461 Files: lib/CodeGen/CGBuiltin.cpp test/CodeGen/builtins-msp430.c test/CodeGen/builtins.c Index: test/CodeGen/builtins.c === --- test/CodeGen/builtins.c +++ test/CodeGen/builtins.c @@ -227,6 +227,9 @@ // CHECK: fcmp uge float {{.*}}, 0x3810 // CHECK: and i1 // CHECK: and i1 + + res = __builtin_flt_rounds(); + // CHECK: call i32 @llvm.flt.rounds( } // CHECK-LABEL: define void @test_float_builtin_ops Index: test/CodeGen/builtins-msp430.c === --- /dev/null +++ test/CodeGen/builtins-msp430.c @@ -0,0 +1,10 @@ +// REQUIRES: msp430-registered-target +// RUN: %clang_cc1 -triple msp430-unknown-unknown -emit-llvm %s -o - | FileCheck %s + +int test_builtin_flt_rounds() { + // CHECK: [[V0:[%A-Za-z0-9.]+]] = call i32 @llvm.flt.rounds() + // CHECK-DAG: [[V1:[%A-Za-z0-9.]+]] = trunc i32 [[V0]] to i16 + // CHECK-DAG: ret i16 [[V1]] + return __builtin_flt_rounds(); +} + Index: lib/CodeGen/CGBuiltin.cpp === --- lib/CodeGen/CGBuiltin.cpp +++ lib/CodeGen/CGBuiltin.cpp @@ -953,6 +953,17 @@ return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType(; } + case Builtin::BI__builtin_flt_rounds: { +Value *F = CGM.getIntrinsic(Intrinsic::flt_rounds); + +llvm::Type *ResultType = ConvertType(E->getType()); +Value *Result = Builder.CreateCall(F); +if (Result->getType() != ResultType) + Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true, + "cast"); +return RValue::get(Result); + } + case Builtin::BI__builtin_fpclassify: { Value *V = EmitScalarExpr(E->getArg(5)); llvm::Type *Ty = ConvertType(E->getArg(5)->getType()); Index: test/CodeGen/builtins.c === --- test/CodeGen/builtins.c +++ test/CodeGen/builtins.c @@ -227,6 +227,9 @@ // CHECK: fcmp uge float {{.*}}, 0x3810 // CHECK: and i1 // CHECK: and i1 + + res = __builtin_flt_rounds(); + // CHECK: call i32 @llvm.flt.rounds( } // CHECK-LABEL: define void @test_float_builtin_ops Index: test/CodeGen/builtins-msp430.c === --- /dev/null +++ test/CodeGen/builtins-msp430.c @@ -0,0 +1,10 @@ +// REQUIRES: msp430-registered-target +// RUN: %clang_cc1 -triple msp430-unknown-unknown -emit-llvm %s -o - | FileCheck %s + +int test_builtin_flt_rounds() { + // CHECK: [[V0:[%A-Za-z0-9.]+]] = call i32 @llvm.flt.rounds() + // CHECK-DAG: [[V1:[%A-Za-z0-9.]+]] = trunc i32 [[V0]] to i16 + // CHECK-DAG: ret i16 [[V1]] + return __builtin_flt_rounds(); +} + Index: lib/CodeGen/CGBuiltin.cpp === --- lib/CodeGen/CGBuiltin.cpp +++ lib/CodeGen/CGBuiltin.cpp @@ -953,6 +953,17 @@ return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType(; } + case Builtin::BI__builtin_flt_rounds: { +Value *F = CGM.getIntrinsic(Intrinsic::flt_rounds); + +llvm::Type *ResultType = ConvertType(E->getType()); +Value *Result = Builder.CreateCall(F); +if (Result->getType() != ResultType) + Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true, + "cast"); +return RValue::get(Result); + } + case Builtin::BI__builtin_fpclassify: { Value *V = EmitScalarExpr(E->getArg(5)); llvm::Type *Ty = ConvertType(E->getArg(5)->getType()); ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D24461: CodeGen: Cast llvm.flt.rounds result to match __builtin_flt_rounds
edward-jones added a comment. Awesome, is it possible for someone to commit this on my behalf? https://reviews.llvm.org/D24461 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D12192: Add clang support for AAP
edward-jones updated this revision to Diff 35263. edward-jones added a comment. This rolls the clang patch for AAP forwards to top of tree. http://reviews.llvm.org/D12192 Files: lib/Basic/Targets.cpp lib/Driver/Driver.cpp lib/Driver/ToolChains.cpp lib/Driver/ToolChains.h lib/Driver/Tools.cpp lib/Driver/Tools.h lib/Headers/float.h Index: lib/Headers/float.h === --- lib/Headers/float.h +++ lib/Headers/float.h @@ -74,7 +74,14 @@ /* Characteristics of floating point types, C99 5.2.4.2.2 */ #define FLT_EVAL_METHOD __FLT_EVAL_METHOD__ -#define FLT_ROUNDS (__builtin_flt_rounds()) + +/* __builtin_flt_rounds is not supported by AAP, and the rounding mode cannot + be changed anyway so we just default to 'to nearest' */ +#ifdef __AAP__ + #define FLT_ROUNDS 1 +#else + #define FLT_ROUNDS (__builtin_flt_rounds()) +#endif #define FLT_RADIX __FLT_RADIX__ #define FLT_MANT_DIG __FLT_MANT_DIG__ Index: lib/Driver/Tools.h === --- lib/Driver/Tools.h +++ lib/Driver/Tools.h @@ -57,6 +57,8 @@ const InputInfo &Output, const InputInfoList &Inputs) const; + void AddAAPTargetArgs(const llvm::opt::ArgList &Args, +llvm::opt::ArgStringList &CmdArgs) const; void AddAArch64TargetArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const; void AddARMTargetArgs(const llvm::Triple &Triple, @@ -826,6 +828,34 @@ }; } // end namespace Myriad +namespace AAP { + class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { + public: +Assemble(const ToolChain &TC) : Tool("AAP::Assemble", "aap-as", TC) +{} + +bool hasIntegratedCPP() const override { return false; } +void ConstructJob(Compilation &C, const JobAction &JA, + const InputInfo &Output, + const InputInfoList &Inputs, + const llvm::opt::ArgList &TCArgs, + const char *LinkingOutput) const override; + }; + class LLVM_LIBRARY_VISIBILITY Link : public Tool { + public: +Link(const ToolChain &TC) : Tool("AAP::Link", "aap-ld", TC) +{} + +bool hasIntegratedCPP() const override { return false; } +bool isLinkJob() const override { return true; } +void ConstructJob(Compilation &C, const JobAction &JA, + const InputInfo &Output, + const InputInfoList &Inputs, + const llvm::opt::ArgList &TCArgs, + const char *LinkingOutput) const override; + }; +} // end namespace AAP + } // end namespace tools } // end namespace driver } // end namespace clang Index: lib/Driver/Tools.cpp === --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -1930,6 +1930,11 @@ CmdArgs.push_back("-machine-sink-split=0"); } +void Clang::AddAAPTargetArgs(const ArgList &Args, + ArgStringList &CmdArgs) const { + return; +} + // Decode AArch64 features from string like +[no]featureA+[no]featureB+... static bool DecodeAArch64Features(const Driver &D, StringRef text, std::vector &Features) { @@ -2636,8 +2641,10 @@ case llvm::Triple::xcore: case llvm::Triple::wasm32: case llvm::Triple::wasm64: + case llvm::Triple::aap: // XCore never wants frame pointers, regardless of OS. // WebAssembly never wants frame pointers. +// AAP never wants frame pointers return false; default: break; @@ -3671,6 +3678,10 @@ default: break; + case llvm::Triple::aap: +AddAAPTargetArgs(Args, CmdArgs); +break; + case llvm::Triple::arm: case llvm::Triple::armeb: case llvm::Triple::thumb: @@ -9815,3 +9826,71 @@ C.addCommand(llvm::make_unique(JA, *this, Args.MakeArgString(Exec), CmdArgs, Inputs)); } + +void AAP::Assemble::ConstructJob(Compilation &C, const JobAction &JA, + const InputInfo &Output, + const InputInfoList &Inputs, + const ArgList &Args, + const char *LinkingOutput) const { + ArgStringList CmdArgs; + + // Add input assembly files to command line + for (InputInfoList::const_iterator it = Inputs.begin(), ie = Inputs.end(); + it != ie; + ++it) { +const InputInfo &II = *it; +CmdArgs.push_back(II.getFilename()); + } + + const char *Exec = +Args.MakeArgString(getToolChain().GetProgramPath("aap-as")); + + C.addCommand(llvm::make_unique(JA, *this, Exec, CmdArgs, Inputs)); +} + +void AAP::Link::ConstructJob(Compilation &C, const JobAction &JA, + const InputInfo &Output, + const InputInfoList &Inputs, +
[PATCH] D12192: Add clang support for AAP
edward-jones created this revision. edward-jones added a subscriber: cfe-commits. AAP is a Harvard architecture, with features representative of a large range of deeply embedded microprocessors. It aims to aid the development and maintenance of other out-of-tree deeply embedded systems. http://reviews.llvm.org/D12192 Files: lib/Basic/Targets.cpp lib/Driver/Driver.cpp lib/Driver/ToolChains.cpp lib/Driver/ToolChains.h lib/Driver/Tools.cpp lib/Driver/Tools.h lib/Headers/float.h Index: lib/Headers/float.h === --- lib/Headers/float.h +++ lib/Headers/float.h @@ -74,7 +74,14 @@ /* Characteristics of floating point types, C99 5.2.4.2.2 */ #define FLT_EVAL_METHOD __FLT_EVAL_METHOD__ -#define FLT_ROUNDS (__builtin_flt_rounds()) + +/* __builtin_flt_rounds is not supported by AAP, and the rounding mode cannot + be changed anyway so we just default to 'to nearest' */ +#ifdef __AAP__ + #define FLT_ROUNDS 1 +#else + #define FLT_ROUNDS (__builtin_flt_rounds()) +#endif #define FLT_RADIX __FLT_RADIX__ #define FLT_MANT_DIG __FLT_MANT_DIG__ Index: lib/Driver/Tools.h === --- lib/Driver/Tools.h +++ lib/Driver/Tools.h @@ -57,6 +57,8 @@ const InputInfo &Output, const InputInfoList &Inputs) const; +void AddAAPTargetArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const; void AddAArch64TargetArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const; void AddARMTargetArgs(const llvm::opt::ArgList &Args, @@ -795,6 +797,35 @@ }; } // end namespace SHAVE + +namespace AAP { + class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { + public: +Assemble(const ToolChain &TC) : Tool("AAP::Assemble", "aap-as", TC) +{} + +bool hasIntegratedCPP() const override { return false; } +void ConstructJob(Compilation &C, const JobAction &JA, + const InputInfo &Output, + const InputInfoList &Inputs, + const llvm::opt::ArgList &TCArgs, + const char *LinkingOutput) const override; + }; + class LLVM_LIBRARY_VISIBILITY Link : public Tool { + public: +Link(const ToolChain &TC) : Tool("AAP::Link", "aap-ld", TC) +{} + +bool hasIntegratedCPP() const override { return false; } +bool isLinkJob() const override { return true; } +void ConstructJob(Compilation &C, const JobAction &JA, + const InputInfo &Output, + const InputInfoList &Inputs, + const llvm::opt::ArgList &TCArgs, + const char *LinkingOutput) const override; + }; +} + } // end namespace tools } // end namespace driver } // end namespace clang Index: lib/Driver/Tools.cpp === --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -1900,6 +1900,11 @@ CmdArgs.push_back("-machine-sink-split=0"); } +void Clang::AddAAPTargetArgs(const ArgList &Args, + ArgStringList &CmdArgs) const { + return; +} + // Decode AArch64 features from string like +[no]featureA+[no]featureB+... static bool DecodeAArch64Features(const Driver &D, StringRef text, std::vector &Features) { @@ -2574,8 +2579,9 @@ static bool shouldUseFramePointerForTarget(const ArgList &Args, const llvm::Triple &Triple) { - // XCore never wants frame pointers, regardless of OS. - if (Triple.getArch() == llvm::Triple::xcore) { + // XCore and AAP never want frame pointers, regardless of OS. + if ((Triple.getArch() == llvm::Triple::aap) || + (Triple.getArch() == llvm::Triple::xcore)) { return false; } @@ -3600,6 +3606,10 @@ default: break; + case llvm::Triple::aap: +AddAAPTargetArgs(Args, CmdArgs); +break; + case llvm::Triple::arm: case llvm::Triple::armeb: case llvm::Triple::thumb: @@ -9644,3 +9654,71 @@ C.addCommand(llvm::make_unique(JA, *this, Args.MakeArgString(Exec), CmdArgs, Inputs)); } + +void AAP::Assemble::ConstructJob(Compilation &C, const JobAction &JA, + const InputInfo &Output, + const InputInfoList &Inputs, + const ArgList &Args, + const char *LinkingOutput) const { + ArgStringList CmdArgs; + + // Add input assembly files to command line + for (InputInfoList::const_iterator it = Inputs.begin(), ie = Inputs.end(); + it != ie; + ++it) { +const InputInfo &II = *it; +CmdArgs.push_back(II.getFilename()); + } + + const char *Exec = +Args.MakeArgString(getToolChain().GetProgramPath("aap-as
Re: [PATCH] D12192: Add clang support for AAP
edward-jones updated this revision to Diff 51932. edward-jones added a comment. This rolls AAP forward to top-of-tree. http://reviews.llvm.org/D12192 Files: lib/Basic/Targets.cpp lib/Driver/Driver.cpp lib/Driver/ToolChains.cpp lib/Driver/ToolChains.h lib/Driver/Tools.cpp lib/Driver/Tools.h lib/Headers/float.h Index: lib/Headers/float.h === --- lib/Headers/float.h +++ lib/Headers/float.h @@ -79,7 +79,14 @@ /* Characteristics of floating point types, C99 5.2.4.2.2 */ #define FLT_EVAL_METHOD __FLT_EVAL_METHOD__ -#define FLT_ROUNDS (__builtin_flt_rounds()) + +/* __builtin_flt_rounds is not supported by AAP, and the rounding mode cannot + be changed anyway so we just default to 'to nearest' */ +#ifdef __AAP__ + #define FLT_ROUNDS 1 +#else + #define FLT_ROUNDS (__builtin_flt_rounds()) +#endif #define FLT_RADIX __FLT_RADIX__ #define FLT_MANT_DIG __FLT_MANT_DIG__ Index: lib/Driver/Tools.h === --- lib/Driver/Tools.h +++ lib/Driver/Tools.h @@ -60,6 +60,8 @@ const InputInfoList &Inputs, const ToolChain *AuxToolChain) const; + void AddAAPTargetArgs(const llvm::opt::ArgList &Args, +llvm::opt::ArgStringList &CmdArgs) const; void AddAArch64TargetArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const; void AddARMTargetArgs(const llvm::Triple &Triple, @@ -940,6 +942,34 @@ } // end namespace NVPTX +namespace AAP { + class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { + public: +Assemble(const ToolChain &TC) : Tool("AAP::Assemble", "aap-as", TC) +{} + +bool hasIntegratedCPP() const override { return false; } +void ConstructJob(Compilation &C, const JobAction &JA, + const InputInfo &Output, + const InputInfoList &Inputs, + const llvm::opt::ArgList &TCArgs, + const char *LinkingOutput) const override; + }; + class LLVM_LIBRARY_VISIBILITY Link : public Tool { + public: +Link(const ToolChain &TC) : Tool("AAP::Link", "aap-ld", TC) +{} + +bool hasIntegratedCPP() const override { return false; } +bool isLinkJob() const override { return true; } +void ConstructJob(Compilation &C, const JobAction &JA, + const InputInfo &Output, + const InputInfoList &Inputs, + const llvm::opt::ArgList &TCArgs, + const char *LinkingOutput) const override; + }; +} // end namespace AAP + } // end namespace tools } // end namespace driver } // end namespace clang Index: lib/Driver/Tools.cpp === --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -2178,6 +2178,11 @@ } } +void Clang::AddAAPTargetArgs(const ArgList &Args, + ArgStringList &CmdArgs) const { + return; +} + void Clang::AddWebAssemblyTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const { // Default to "hidden" visibility. @@ -3029,8 +3034,10 @@ case llvm::Triple::xcore: case llvm::Triple::wasm32: case llvm::Triple::wasm64: + case llvm::Triple::aap: // XCore never wants frame pointers, regardless of OS. // WebAssembly never wants frame pointers. +// AAP never wants frame pointers return false; default: break; @@ -4172,6 +4179,10 @@ default: break; + case llvm::Triple::aap: +AddAAPTargetArgs(Args, CmdArgs); +break; + case llvm::Triple::arm: case llvm::Triple::armeb: case llvm::Triple::thumb: @@ -11016,3 +11027,71 @@ const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary")); C.addCommand(llvm::make_unique(JA, *this, Exec, CmdArgs, Inputs)); } + +void AAP::Assemble::ConstructJob(Compilation &C, const JobAction &JA, + const InputInfo &Output, + const InputInfoList &Inputs, + const ArgList &Args, + const char *LinkingOutput) const { + ArgStringList CmdArgs; + + // Add input assembly files to command line + for (InputInfoList::const_iterator it = Inputs.begin(), ie = Inputs.end(); + it != ie; + ++it) { +const InputInfo &II = *it; +CmdArgs.push_back(II.getFilename()); + } + + const char *Exec = +Args.MakeArgString(getToolChain().GetProgramPath("aap-as")); + + C.addCommand(llvm::make_unique(JA, *this, Exec, CmdArgs, Inputs)); +} + +void AAP::Link::ConstructJob(Compilation &C, const JobAction &JA, + const InputInfo &Output, + const InputInfoList &Inputs, + const ArgList &Args, + const char
Re: [PATCH] D12192: Add clang support for AAP
edward-jones updated this revision to Diff 45262. edward-jones added a comment. This updates the Clang support of AAP to top of tree. http://reviews.llvm.org/D12192 Files: lib/Basic/Targets.cpp lib/Driver/Driver.cpp lib/Driver/ToolChains.cpp lib/Driver/ToolChains.h lib/Driver/Tools.cpp lib/Driver/Tools.h lib/Headers/float.h Index: lib/Headers/float.h === --- lib/Headers/float.h +++ lib/Headers/float.h @@ -74,7 +74,14 @@ /* Characteristics of floating point types, C99 5.2.4.2.2 */ #define FLT_EVAL_METHOD __FLT_EVAL_METHOD__ -#define FLT_ROUNDS (__builtin_flt_rounds()) + +/* __builtin_flt_rounds is not supported by AAP, and the rounding mode cannot + be changed anyway so we just default to 'to nearest' */ +#ifdef __AAP__ + #define FLT_ROUNDS 1 +#else + #define FLT_ROUNDS (__builtin_flt_rounds()) +#endif #define FLT_RADIX __FLT_RADIX__ #define FLT_MANT_DIG __FLT_MANT_DIG__ Index: lib/Driver/Tools.h === --- lib/Driver/Tools.h +++ lib/Driver/Tools.h @@ -60,6 +60,8 @@ const InputInfoList &Inputs, const ToolChain *AuxToolChain) const; + void AddAAPTargetArgs(const llvm::opt::ArgList &Args, +llvm::opt::ArgStringList &CmdArgs) const; void AddAArch64TargetArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const; void AddARMTargetArgs(const llvm::Triple &Triple, @@ -938,6 +940,34 @@ } // end namespace NVPTX +namespace AAP { + class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { + public: +Assemble(const ToolChain &TC) : Tool("AAP::Assemble", "aap-as", TC) +{} + +bool hasIntegratedCPP() const override { return false; } +void ConstructJob(Compilation &C, const JobAction &JA, + const InputInfo &Output, + const InputInfoList &Inputs, + const llvm::opt::ArgList &TCArgs, + const char *LinkingOutput) const override; + }; + class LLVM_LIBRARY_VISIBILITY Link : public Tool { + public: +Link(const ToolChain &TC) : Tool("AAP::Link", "aap-ld", TC) +{} + +bool hasIntegratedCPP() const override { return false; } +bool isLinkJob() const override { return true; } +void ConstructJob(Compilation &C, const JobAction &JA, + const InputInfo &Output, + const InputInfoList &Inputs, + const llvm::opt::ArgList &TCArgs, + const char *LinkingOutput) const override; + }; +} // end namespace AAP + } // end namespace tools } // end namespace driver } // end namespace clang Index: lib/Driver/Tools.cpp === --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -2069,6 +2069,11 @@ CmdArgs.push_back("-machine-sink-split=0"); } +void Clang::AddAAPTargetArgs(const ArgList &Args, + ArgStringList &CmdArgs) const { + return; +} + void Clang::AddWebAssemblyTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const { // Default to "hidden" visibility. @@ -2915,8 +2920,10 @@ case llvm::Triple::xcore: case llvm::Triple::wasm32: case llvm::Triple::wasm64: + case llvm::Triple::aap: // XCore never wants frame pointers, regardless of OS. // WebAssembly never wants frame pointers. +// AAP never wants frame pointers return false; default: break; @@ -4028,6 +4035,10 @@ default: break; + case llvm::Triple::aap: +AddAAPTargetArgs(Args, CmdArgs); +break; + case llvm::Triple::arm: case llvm::Triple::armeb: case llvm::Triple::thumb: @@ -10721,3 +10732,71 @@ const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary")); C.addCommand(llvm::make_unique(JA, *this, Exec, CmdArgs, Inputs)); } + +void AAP::Assemble::ConstructJob(Compilation &C, const JobAction &JA, + const InputInfo &Output, + const InputInfoList &Inputs, + const ArgList &Args, + const char *LinkingOutput) const { + ArgStringList CmdArgs; + + // Add input assembly files to command line + for (InputInfoList::const_iterator it = Inputs.begin(), ie = Inputs.end(); + it != ie; + ++it) { +const InputInfo &II = *it; +CmdArgs.push_back(II.getFilename()); + } + + const char *Exec = +Args.MakeArgString(getToolChain().GetProgramPath("aap-as")); + + C.addCommand(llvm::make_unique(JA, *this, Exec, CmdArgs, Inputs)); +} + +void AAP::Link::ConstructJob(Compilation &C, const JobAction &JA, + const InputInfo &Output, + const InputInfoList &Inputs, + const