Index: clang/lib/Driver/ToolChains/AVR.cpp =================================================================== --- clang/lib/Driver/ToolChains/AVR.cpp +++ clang/lib/Driver/ToolChains/AVR.cpp @@ -497,14 +497,6 @@ 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 the family name is known, we can link with the device-specific libgcc. // Without it, libgcc will simply not be linked. This matches avr-gcc // behavior. @@ -542,8 +534,23 @@ CmdArgs.push_back("--end-group"); - // Add user specified linker script. - Args.AddAllArgs(CmdArgs, options::OPT_T); + // If user explicitly specifies a linker script via '-T', we should follow. + // Otherwise we must add a default '-Tdata' option to the linker, according + // to each AVR device's specific memory layout. + // TODO: Use the default linker script provided by avr-libc, which can be + // overwritten if user specifies via '-T' or '-Wl,-T'. + 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; + } + } else { + // Add user specified linker script. + Args.AddAllArgs(CmdArgs, options::OPT_T); + } // Specify the family name as the emulation mode to use. // This is almost always required because otherwise avr-ld Index: clang/test/Driver/avr-ld.c =================================================================== --- clang/test/Driver/avr-ld.c +++ clang/test/Driver/avr-ld.c @@ -1,44 +1,52 @@ // RUN: %clang -### --target=avr -mmcu=at90s2313 --rtlib=libgcc --sysroot %S/Inputs/basic_avr_tree %s 2>&1 | FileCheck -check-prefix LINKA %s -// LINKA: {{".*ld.*"}} {{.*}} {{"-L.*tiny-stack"}} {{.*}} "-Tdata=0x800060" "--start-group" {{.*}} "-lat90s2313" {{.*}} "--end-group" "-mavr2" +// LINKA: {{".*ld.*"}} {{.*}} {{"-L.*tiny-stack"}} {{.*}} "--start-group" {{.*}} "-lat90s2313" {{.*}} "--end-group" "-Tdata=0x800060" "-mavr2" // RUN: %clang -### --target=avr -mmcu=at90s8515 --rtlib=libgcc --sysroot %S/Inputs/basic_avr_tree %s 2>&1 | FileCheck -check-prefix LINKB %s -// LINKB: {{".*ld.*"}} {{.*}} "-Tdata=0x800060" "--start-group" {{.*}} "-lat90s8515" {{.*}} "--end-group" "-mavr2" +// LINKB: {{".*ld.*"}} {{.*}} "--start-group" {{.*}} "-lat90s8515" {{.*}} "--end-group" "-Tdata=0x800060" "-mavr2" // RUN: %clang -### --target=avr -mmcu=attiny13 --rtlib=libgcc --sysroot %S/Inputs/basic_avr_tree %s 2>&1 | FileCheck -check-prefix LINKC %s -// LINKC: {{".*ld.*"}} {{.*}} {{"-L.*avr25/tiny-stack"}} {{.*}} "-Tdata=0x800060" "--start-group" {{.*}} "-lattiny13" {{.*}} "--end-group" "-mavr25" +// LINKC: {{".*ld.*"}} {{.*}} {{"-L.*avr25/tiny-stack"}} {{.*}} "--start-group" {{.*}} "-lattiny13" {{.*}} "--end-group" "-Tdata=0x800060" "-mavr25" // RUN: %clang -### --target=avr -mmcu=attiny44 --rtlib=libgcc --sysroot %S/Inputs/basic_avr_tree %s 2>&1 | FileCheck -check-prefix LINKD %s -// LINKD: {{".*ld.*"}} {{.*}} {{"-L.*avr25"}} {{.*}} "-Tdata=0x800060" "--start-group" {{.*}} "-lattiny44" {{.*}} "--end-group" "-mavr25" +// LINKD: {{".*ld.*"}} {{.*}} {{"-L.*avr25"}} {{.*}} "--start-group" {{.*}} "-lattiny44" {{.*}} "--end-group" "-Tdata=0x800060" "-mavr25" // RUN: %clang -### --target=avr -mmcu=atmega103 --rtlib=libgcc --sysroot %S/Inputs/basic_avr_tree %s 2>&1 | FileCheck -check-prefix LINKE %s -// LINKE: {{".*ld.*"}} {{.*}} {{"-L.*avr31"}} {{.*}} "-Tdata=0x800060" "--start-group" {{.*}} "-latmega103" {{.*}} "--end-group" "-mavr31" +// LINKE: {{".*ld.*"}} {{.*}} {{"-L.*avr31"}} {{.*}} "--start-group" {{.*}} "-latmega103" {{.*}} "--end-group" "-Tdata=0x800060" "-mavr31" // RUN: %clang -### --target=avr -mmcu=atmega8u2 --rtlib=libgcc --sysroot %S/Inputs/basic_avr_tree %s 2>&1 | FileCheck -check-prefix LINKF %s -// LINKF: {{".*ld.*"}} {{.*}} {{"-L.*avr35"}} {{.*}} "-Tdata=0x800100" "--start-group" {{.*}} "-latmega8u2" {{.*}} "--end-group" "-mavr35" +// LINKF: {{".*ld.*"}} {{.*}} {{"-L.*avr35"}} {{.*}} "--start-group" {{.*}} "-latmega8u2" {{.*}} "--end-group" "-Tdata=0x800100" "-mavr35" // RUN: %clang -### --target=avr -mmcu=atmega48pa --rtlib=libgcc --sysroot %S/Inputs/basic_avr_tree %s 2>&1 | FileCheck -check-prefix LINKG %s -// LINKG: {{".*ld.*"}} {{.*}} {{"-L.*avr4"}} {{.*}} "-Tdata=0x800100" "--start-group" {{.*}} "-latmega48pa" {{.*}} "--end-group" "-mavr4" +// LINKG: {{".*ld.*"}} {{.*}} {{"-L.*avr4"}} {{.*}} "--start-group" {{.*}} "-latmega48pa" {{.*}} "--end-group" "-Tdata=0x800100" "-mavr4" // RUN: %clang -### --target=avr -mmcu=atmega328 --rtlib=libgcc --sysroot %S/Inputs/basic_avr_tree %s 2>&1 | FileCheck -check-prefix LINKH %s -// LINKH: {{".*ld.*"}} {{.*}} {{"-L.*avr5"}} {{.*}} "-Tdata=0x800100" "--start-group" {{.*}} "-latmega328" {{.*}} "--end-group" "-mavr5" +// LINKH: {{".*ld.*"}} {{.*}} {{"-L.*avr5"}} {{.*}} "--start-group" {{.*}} "-latmega328" {{.*}} "--end-group" "-Tdata=0x800100" "-mavr5" // RUN: %clang -### --target=avr -mmcu=atmega1281 --rtlib=libgcc --sysroot %S/Inputs/basic_avr_tree %s 2>&1 | FileCheck -check-prefix LINKI %s -// LINKI: {{".*ld.*"}} {{.*}} {{"-L.*avr51"}} {{.*}} "-Tdata=0x800200" "--start-group" {{.*}} "-latmega1281" {{.*}} "--end-group" "-mavr51" +// LINKI: {{".*ld.*"}} {{.*}} {{"-L.*avr51"}} {{.*}} "--start-group" {{.*}} "-latmega1281" {{.*}} "--end-group" "-Tdata=0x800200" "-mavr51" // RUN: %clang -### --target=avr -mmcu=atmega2560 --rtlib=libgcc --sysroot %S/Inputs/basic_avr_tree %s 2>&1 | FileCheck -check-prefix LINKJ %s -// LINKJ: {{".*ld.*"}} {{.*}} {{"-L.*avr6"}} {{.*}} "-Tdata=0x800200" "--start-group" {{.*}} "-latmega2560" {{.*}} "--end-group" "-mavr6" +// LINKJ: {{".*ld.*"}} {{.*}} {{"-L.*avr6"}} {{.*}} "--start-group" {{.*}} "-latmega2560" {{.*}} "--end-group" "-Tdata=0x800200" "-mavr6" // RUN: %clang -### --target=avr -mmcu=attiny10 --rtlib=libgcc --sysroot %S/Inputs/basic_avr_tree %s 2>&1 | FileCheck -check-prefix LINKK %s -// LINKK: {{".*ld.*"}} {{.*}} {{"-L.*avrtiny"}} {{.*}} "-Tdata=0x800040" "--start-group" {{.*}} "-lattiny10" {{.*}} "--end-group" "-mavrtiny" +// LINKK: {{".*ld.*"}} {{.*}} {{"-L.*avrtiny"}} {{.*}} "--start-group" {{.*}} "-lattiny10" {{.*}} "--end-group" "-Tdata=0x800040" "-mavrtiny" // RUN: %clang -### --target=avr -mmcu=atxmega16a4 --rtlib=libgcc --sysroot %S/Inputs/basic_avr_tree %s 2>&1 | FileCheck -check-prefix LINKL %s -// LINKL: {{".*ld.*"}} {{.*}} {{"-L.*avrxmega2"}} {{.*}} "-Tdata=0x802000" "--start-group" {{.*}} "-latxmega16a4" {{.*}} "--end-group" "-mavrxmega2" +// LINKL: {{".*ld.*"}} {{.*}} {{"-L.*avrxmega2"}} {{.*}} "--start-group" {{.*}} "-latxmega16a4" {{.*}} "--end-group" "-Tdata=0x802000" "-mavrxmega2" // RUN: %clang -### --target=avr -mmcu=atxmega64b3 --rtlib=libgcc --sysroot %S/Inputs/basic_avr_tree %s 2>&1 | FileCheck -check-prefix LINKM %s -// LINKM: {{".*ld.*"}} {{.*}} {{"-L.*avrxmega4"}} {{.*}} "-Tdata=0x802000" "--start-group" {{.*}} "-latxmega64b3" {{.*}} "--end-group" "-mavrxmega4" +// LINKM: {{".*ld.*"}} {{.*}} {{"-L.*avrxmega4"}} {{.*}} "--start-group" {{.*}} "-latxmega64b3" {{.*}} "--end-group" "-Tdata=0x802000" "-mavrxmega4" // RUN: %clang -### --target=avr -mmcu=atxmega128a3u --rtlib=libgcc --sysroot %S/Inputs/basic_avr_tree %s 2>&1 | FileCheck -check-prefix LINKN %s -// LINKN: {{".*ld.*"}} {{.*}} {{"-L.*avrxmega6"}} {{.*}} "-Tdata=0x802000" "--start-group" {{.*}} "-latxmega128a3u" {{.*}} "--end-group" "-mavrxmega6" +// LINKN: {{".*ld.*"}} {{.*}} {{"-L.*avrxmega6"}} {{.*}} "--start-group" {{.*}} "-latxmega128a3u" {{.*}} "--end-group" "-Tdata=0x802000" "-mavrxmega6" // 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" +// LINKO: {{".*ld.*"}} {{.*}} {{"-L.*avrxmega7"}} {{.*}} "--start-group" {{.*}} "-latxmega128a1" {{.*}} "--end-group" "-Tdata=0x802000" "-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" Index: clang/test/Driver/avr-toolchain.c =================================================================== --- clang/test/Driver/avr-toolchain.c +++ clang/test/Driver/avr-toolchain.c @@ -7,8 +7,8 @@ // CHECK1-SAME: "-isysroot" "[[SYSROOT:[^"]+/basic_avr_tree]]" // CHECK1-SAME: "-internal-isystem" // CHECK1-SAME: {{^}} "[[SYSROOT]]/usr/lib/gcc/avr/5.4.0/../../../avr/include" -// CHECK1-NOT: "-L -// CHECK1: avr-ld" +// CHECK1-NOT: "-L" +// CHECK1: {{".*avr-ld"}} // CHECK1-SAME: "-o" "a.out" // CHECK1-SAME: {{^}} "--gc-sections" @@ -46,7 +46,6 @@ // RUN: %clang -### --target=avr --sysroot=%S/Inputs/basic_avr_tree %s 2>&1 | FileCheck --check-prefixes=NOMCU,LINKB %s // NOMCU: warning: no target microcontroller specified on command line, cannot link standard libraries, please pass -mmcu= // LINKB: warning: standard library not linked and so no interrupt vector table or compiler runtime routines will be linked -// LINKB: warning: support for passing the data section address to the linker for microcontroller '' is not implemented // NOMCU-NOT: warning: {{.*}} avr-gcc // NOMCU-NOT: warning: {{.*}} avr-libc // LINKA-NOT: warning: {{.*}} interrupt vector