diff --git a/gdb/dwarf2/cu.h b/gdb/dwarf2/cu.h
index 23cb3d21b2e..51638e71b19 100644
--- a/gdb/dwarf2/cu.h
+++ b/gdb/dwarf2/cu.h
@@ -264,6 +264,7 @@ struct dwarf2_cu
   bool producer_is_icc : 1;
   bool producer_is_icc_lt_14 : 1;
   bool producer_is_codewarrior : 1;
+  bool producer_is_clang : 1;
 
   /* When true, the file that we're processing is known to have
      debugging info for C++ namespaces.  GCC 3.3.x did not produce
diff --git a/gdb/dwarf2/macro.c b/gdb/dwarf2/macro.c
index 38c0fdfec73..c753dc300f2 100644
--- a/gdb/dwarf2/macro.c
+++ b/gdb/dwarf2/macro.c
@@ -445,7 +445,7 @@ dwarf_decode_macro_bytes (dwarf2_per_objfile *per_objfile,
 			  struct dwarf2_section_info *str_section,
 			  struct dwarf2_section_info *str_offsets_section,
 			  gdb::optional<ULONGEST> str_offsets_base,
-			  htab_t include_hash)
+			  htab_t include_hash, struct dwarf2_cu *cu)
 {
   struct objfile *objfile = per_objfile->objfile;
   enum dwarf_macro_record_type macinfo_type;
@@ -672,6 +672,16 @@ dwarf_decode_macro_bytes (dwarf2_per_objfile *per_objfile,
 	  if (! current_file)
 	    complaint (_("macro debug info has an unmatched "
 			 "`close_file' directive"));
+	  else if (current_file->included_by == nullptr
+		   && producer_is_clang (cu))
+	    {
+	      /* Clang, until the current version, misplaces macro definitions,
+		 putting them after the last DW_MACRO_end_file instead of
+		 before the first DW_MACRO_start_file.  */
+	      /* FIXME: Since at the time of writing there is no clang version
+		 with this bug fixed, we check for any clang producer.  This
+		 should be changed to producer_is_clang_lt_XX when possible. */
+	    }
 	  else
 	    {
 	      current_file = current_file->included_by;
@@ -751,7 +761,7 @@ dwarf_decode_macro_bytes (dwarf2_per_objfile *per_objfile,
 					  current_file, lh, section,
 					  section_is_gnu, is_dwz, offset_size,
 					  str_section, str_offsets_section,
-					  str_offsets_base, include_hash);
+					  str_offsets_base, include_hash, cu);
 
 		htab_remove_elt (include_hash, (void *) new_mac_ptr);
 	      }
@@ -795,7 +805,7 @@ dwarf_decode_macros (dwarf2_per_objfile *per_objfile,
 		     unsigned int offset, struct dwarf2_section_info *str_section,
 		     struct dwarf2_section_info *str_offsets_section,
 		     gdb::optional<ULONGEST> str_offsets_base,
-		     int section_is_gnu)
+		     int section_is_gnu, struct dwarf2_cu *cu)
 {
   bfd *abfd;
   const gdb_byte *mac_ptr, *mac_end;
@@ -956,5 +966,5 @@ dwarf_decode_macros (dwarf2_per_objfile *per_objfile,
   dwarf_decode_macro_bytes (per_objfile, builder, abfd, mac_ptr, mac_end,
 			    current_file, lh, section, section_is_gnu, 0,
 			    offset_size, str_section, str_offsets_section,
-			    str_offsets_base, include_hash.get ());
+			    str_offsets_base, include_hash.get (), cu);
 }
diff --git a/gdb/dwarf2/macro.h b/gdb/dwarf2/macro.h
index e8c33a34a8d..02753ef377a 100644
--- a/gdb/dwarf2/macro.h
+++ b/gdb/dwarf2/macro.h
@@ -31,6 +31,6 @@ extern void dwarf_decode_macros (dwarf2_per_objfile *per_objfile,
 				 dwarf2_section_info *str_section,
 				 dwarf2_section_info *str_offsets_section,
 				 gdb::optional<ULONGEST> str_offsets_base,
-				 int section_is_gnu);
+				 int section_is_gnu, struct dwarf2_cu *cu);
 
 #endif /* GDB_DWARF2_MACRO_H */
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 78f4cc1f60d..a0a46de61a6 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -9484,6 +9484,15 @@ producer_is_gcc_lt_4_3 (struct dwarf2_cu *cu)
   return cu->producer_is_gcc_lt_4_3;
 }
 
+bool
+producer_is_clang (struct dwarf2_cu *cu)
+{
+  if (!cu->checked_producer)
+    check_producer (cu);
+  
+  return cu->producer_is_clang;
+}
+
 static file_and_directory &
 find_file_and_directory (struct die_info *die, struct dwarf2_cu *cu)
 {
@@ -13343,6 +13352,10 @@ check_producer (struct dwarf2_cu *cu)
     }
   else if (startswith (cu->producer, "CodeWarrior S12/L-ISA"))
     cu->producer_is_codewarrior = true;
+  else if (producer_is_clang (cu->producer, &major, &minor))
+    {
+      cu->producer_is_clang = true;
+    }
   else
     {
       /* For other non-GCC compilers, expect their behavior is DWARF version
@@ -23363,7 +23376,7 @@ dwarf_decode_macros (struct dwarf2_cu *cu, unsigned int offset,
 
   dwarf_decode_macros (per_objfile, builder, section, lh,
 		       offset_size, offset, str_section, str_offsets_section,
-		       str_offsets_base, section_is_gnu);
+		       str_offsets_base, section_is_gnu, cu);
 }
 
 /* Return the .debug_loc section to use for CU.
diff --git a/gdb/dwarf2/read.h b/gdb/dwarf2/read.h
index 5f01fbc1025..a47e6bf5144 100644
--- a/gdb/dwarf2/read.h
+++ b/gdb/dwarf2/read.h
@@ -761,4 +761,6 @@ extern void dwarf2_get_section_info (struct objfile *,
 				     asection **, const gdb_byte **,
 				     bfd_size_type *);
 
+extern bool producer_is_clang (struct dwarf2_cu *cu);
+
 #endif /* DWARF2READ_H */
diff --git a/gdb/producer.c b/gdb/producer.c
index ef1dd93afbc..a9fb7dd8245 100644
--- a/gdb/producer.c
+++ b/gdb/producer.c
@@ -127,6 +127,32 @@ producer_is_llvm (const char *producer)
 				 || startswith (producer, " F90 Flang ")));
 }
 
+/* see producer.h */
+
+bool
+producer_is_clang (const char* producer, int *major, int* minor)
+{
+  const char *cs;
+
+  if (producer != nullptr && startswith (producer, "clang "))
+    {
+      int maj, min;
+      if (major == nullptr)
+	major = &maj;
+      if (minor == nullptr)
+	minor = &min;
+
+      /* The full producer sting will look something like
+	 "clang version XX.X.X ..."
+	 So we can safely ignore all characters before the first digit.  */
+      cs = producer + strlen("clang version ");
+
+      if (sscanf (cs, "%d.%d", major, minor) == 2)
+	  return true;
+    }
+  return false;
+}
+
 #if defined GDB_SELF_TEST
 namespace selftests {
 namespace producer {
diff --git a/gdb/producer.h b/gdb/producer.h
index f7c19368bc6..b75cfae6569 100644
--- a/gdb/producer.h
+++ b/gdb/producer.h
@@ -41,4 +41,8 @@ extern bool producer_is_icc (const char *producer, int *major, int *minor);
    false otherwise.*/
 extern bool producer_is_llvm (const char *producer);
 
+/* Returns true if the given PRODUCER string is clang, false otherwise.
+   Sets MAJOR and MINOR accordingly, if not NULL.  */
+extern bool producer_is_clang (const char *producer, int *major, int *minor);
+
 #endif
diff --git a/gdb/testsuite/gdb.dwarf2/clang_cli_macros.exp b/gdb/testsuite/gdb.dwarf2/clang_cli_macros.exp
new file mode 100644
index 00000000000..f056d8ad832
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/clang_cli_macros.exp
@@ -0,0 +1,101 @@
+# This testcase is part of GDB, the GNU debugger.
+
+# Copyright 2022 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Test that GDB is able to print macros defined in the command line invocaion
+# of clang. It has to be explicitly tested because of:
+# https://github.com/llvm/llvm-project/issues/54506
+
+load_lib dwarf.exp
+
+if {![dwarf2_support]} {
+    return 0
+}
+if {![test_compiler_info gcc-*-*]} {
+    untested "dwarf assembler needs GCC"
+}
+
+standard_testfile .S
+
+set srcfile macro-source-path.c
+set asm_file [standard_output_file clang_cli_macros.S]
+
+lassign [function_range main $srcdir/$subdir/$srcfile] \
+    main_start main_len
+
+Dwarf::assemble $asm_file {
+    global srcfile
+    declare_labels L cu_macros
+
+    cu {} {
+	DW_TAG_compile_unit {
+	    {DW_AT_producer "clang version 15.0.0"}
+	    {DW_AT_language @DW_LANG_C11}
+	    {DW_AT_name $srcfile}
+	    {DW_AT_macros $cu_macros DW_FORM_sec_offset}
+	    {DW_AT_stmt_list $L DW_FORM_sec_offset}
+	} {
+	    declare_labels int_type
+
+	    int_type: DW_TAG_base_type {
+	        {DW_AT_byte_size 4 DW_FORM_sdata}
+	        {DW_AT_encoding  @DW_ATE_signed}
+	        {DW_AT_name int}
+	    }
+	    DW_TAG_subprogram {
+	        {MACRO_AT_func {main}}
+	        {type :$int_type}
+	    }
+	}
+    }
+    lines {version 2} L {
+	file_name $srcfile 1
+	program {
+	    DW_LNE_set_address $::main_start
+	    line 10
+	    DW_LNS_copy
+	    DW_LNE_set_address "$::main_start + $::main_len"
+	    DW_LNE_end_sequence
+	}
+    }
+
+    # Define the .debug_macro section.
+    macro {
+	cu_macros: unit {
+	    "debug-line-offset-label" $L
+        } {
+	    # Clang has this bug where it puts the macros defined on
+	    # the command-line after the main file portion (see
+	    # PR 29034).
+	    start_file 0 1
+		# A macro defined at line 1 of the main file.
+		define 1 "TWO 2"
+	    end_file
+	    define 0 "ONE 1"
+	}
+    }
+}
+
+if {[prepare_for_testing "failed to prepare" $testfile [list $srcfile $asm_file] {nodebug}]} {
+    return
+}
+
+if {![runto_main]} {
+    return
+}
+
+gdb_test "print TWO" "= 2" "printing simple macro"
+gdb_test "print ONE" "= 1" "printing defined from CLI"
