[clang][AVR] Add avr-libc/include to clang system include paths
authorBen Shi <powerman1st@163.com>
Sun, 30 May 2021 14:39:07 +0000 (22:39 +0800)
committerBen Shi <powerman1st@163.com>
Sun, 30 May 2021 14:39:07 +0000 (22:39 +0800)
Reviewed By: dylanmckay

Differential Revision: https://reviews.llvm.org/D97669

clang/lib/Driver/ToolChains/AVR.cpp
clang/lib/Driver/ToolChains/AVR.h
clang/test/Driver/Inputs/basic_avr_tree/usr/lib/avr/include/.keep [new file with mode: 0644]
clang/test/Driver/avr-toolchain.c

index f4f8014..ea35abb 100644 (file)
@@ -353,6 +353,23 @@ AVRToolChain::AVRToolChain(const Driver &D, const llvm::Triple &Triple,
   }
 }
 
+void AVRToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
+                                             ArgStringList &CC1Args) const {
+  if (DriverArgs.hasArg(options::OPT_nostdinc) ||
+      DriverArgs.hasArg(options::OPT_nostdlibinc))
+    return;
+
+  // Omit if there is no avr-libc installed.
+  Optional<std::string> AVRLibcRoot = findAVRLibcInstallation();
+  if (!AVRLibcRoot.hasValue())
+    return;
+
+  // Add 'avr-libc/include' to clang system include paths if applicable.
+  std::string AVRInc = AVRLibcRoot.getValue() + "/include";
+  if (llvm::sys::fs::is_directory(AVRInc))
+    addSystemInclude(DriverArgs, CC1Args, AVRInc);
+}
+
 Tool *AVRToolChain::buildLinker() const {
   return new tools::AVR::Linker(getTriple(), *this, LinkStdlib);
 }
index a3198b2..1b3b203 100644 (file)
@@ -22,6 +22,9 @@ class LLVM_LIBRARY_VISIBILITY AVRToolChain : public Generic_ELF {
 public:
   AVRToolChain(const Driver &D, const llvm::Triple &Triple,
                const llvm::opt::ArgList &Args);
+  void
+  AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
+                            llvm::opt::ArgStringList &CC1Args) const override;
 
 protected:
   Tool *buildLinker() const override;
diff --git a/clang/test/Driver/Inputs/basic_avr_tree/usr/lib/avr/include/.keep b/clang/test/Driver/Inputs/basic_avr_tree/usr/lib/avr/include/.keep
new file mode 100644 (file)
index 0000000..e69de29
index 46a3c10..b9ca177 100644 (file)
@@ -2,3 +2,12 @@
 
 // RUN: %clang %s -### -no-canonical-prefixes -target avr 2>&1 | FileCheck -check-prefix=CC1 %s
 // CC1: clang{{.*}} "-cc1" "-triple" "avr"
+
+// RUN: %clang %s -### -target avr --sysroot %S/Inputs/basic_avr_tree 2>&1 | FileCheck -check-prefix CC1A %s
+// CC1A: clang{{.*}} "-cc1" "-triple" "avr" {{.*}} "-internal-isystem" {{".*avr/include"}}
+
+// RUN: %clang %s -### -target avr --sysroot %S/Inputs/basic_avr_tree 2>&1 -nostdinc | FileCheck -check-prefix CC1B %s
+// CC1B-NOT: "-internal-isystem" {{".*avr/include"}}
+
+// RUN: %clang %s -### -target avr --sysroot %S/Inputs/basic_avr_tree 2>&1 -nostdlibinc | FileCheck -check-prefix CC1C %s
+// CC1C-NOT: "-internal-isystem" {{".*avr/include"}}