diff --git a/clang/lib/Driver/ToolChains/AVR.cpp b/clang/lib/Driver/ToolChains/AVR.cpp --- a/clang/lib/Driver/ToolChains/AVR.cpp +++ b/clang/lib/Driver/ToolChains/AVR.cpp @@ -497,12 +497,17 @@ D.Diag(diag::warn_drv_avr_stdlib_not_linked); } - if (SectionAddressData) { - CmdArgs.push_back(Args.MakeArgString( - "-Tdata=0x" + Twine::utohexstr(*SectionAddressData))); - } else { - // We do not have an entry for this CPU in the address mapping table yet. - D.Diag(diag::warn_drv_avr_linker_section_addresses_not_implemented) << CPU; + // If user explicitly specifies a linker script, we should follow that. + // Otherwise we must add a default '-Tdata' option to the linker, according + // to each AVR device's specific memory layout. + if (!Args.hasArg(options::OPT_T)) { + if (SectionAddressData) { + CmdArgs.push_back(Args.MakeArgString( + "-Tdata=0x" + Twine::utohexstr(*SectionAddressData))); + } else { + // We do not have an entry for this CPU in the address mapping table yet. + D.Diag(diag::warn_drv_avr_linker_section_addresses_not_implemented) << CPU; + } } // If the family name is known, we can link with the device-specific libgcc. diff --git a/clang/test/Driver/Inputs/basic_avr_tree/usr/lib/avr/lib/avr35.lds b/clang/test/Driver/Inputs/basic_avr_tree/usr/lib/avr/lib/avr35.lds new file mode 100644 diff --git a/clang/test/Driver/Inputs/basic_avr_tree/usr/lib/avr/lib/avr51.lds b/clang/test/Driver/Inputs/basic_avr_tree/usr/lib/avr/lib/avr51.lds new file mode 100644 diff --git a/clang/test/Driver/avr-ld.c b/clang/test/Driver/avr-ld.c --- a/clang/test/Driver/avr-ld.c +++ b/clang/test/Driver/avr-ld.c @@ -42,3 +42,11 @@ // RUN: %clang -### --target=avr -mmcu=atxmega128a1 --rtlib=libgcc --sysroot %S/Inputs/basic_avr_tree %s 2>&1 | FileCheck -check-prefix LINKO %s // LINKO: {{".*ld.*"}} {{.*}} {{"-L.*avrxmega7"}} {{.*}} "-Tdata=0x802000" "--start-group" {{.*}} "-latxmega128a1" {{.*}} "--end-group" "-mavrxmega7" + +// RUN: %clang -### --target=avr -mmcu=atmega8u2 --sysroot %S/Inputs/basic_avr_tree %s -T %S/Inputs/basic_avr_tree/usr/lib/avr/lib/avr35.lds 2>&1 | FileCheck -check-prefix LINKP %s +// LINKP: {{".*ld.*"}} {{.*}} {{"-L.*avr35"}} {{.*}} "--start-group" {{.*}} "-latmega8u2" {{.*}} "--end-group" "-T" {{".*avr35.lds"}} "-mavr35" +// LINKP-NOT: "-Tdata" + +// RUN: %clang -### --target=avr --sysroot %S/Inputs/basic_avr_tree %s -T %S/Inputs/basic_avr_tree/usr/lib/avr/lib/avr51.lds 2>&1 | FileCheck -check-prefix LINKQ %s +// LINKQ-NOT: "-Tdata" +// LINKQ-NOT: "warning:" {{.*}} "section address"