[PATCH] D86629: [AVR][clang] Pass the address of the data section to the linker for ATmega328
Dylan McKay via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 28 10:35:35 PDT 2020
This revision was not accepted when it landed; it landed in state "Needs Review".
This revision was automatically updated to reflect the committed changes.
Closed by commit rG88b7b76a0b23: [AVR][clang] Pass the address of the data section to the linker for ATmega328 (authored by dylanmckay).
Changed prior to commit:
https://reviews.llvm.org/D86629?vs=287989&id=301327#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D86629/new/
https://reviews.llvm.org/D86629
Files:
clang/include/clang/Basic/DiagnosticDriverKinds.td
clang/lib/Driver/ToolChains/AVR.cpp
Index: clang/lib/Driver/ToolChains/AVR.cpp
===================================================================
--- clang/lib/Driver/ToolChains/AVR.cpp
+++ clang/lib/Driver/ToolChains/AVR.cpp
@@ -13,6 +13,7 @@
#include "clang/Driver/DriverDiagnostic.h"
#include "clang/Driver/Options.h"
#include "llvm/ADT/Optional.h"
+#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/MC/MCSubtargetInfo.h"
#include "llvm/MC/SubtargetFeature.h"
@@ -29,13 +30,20 @@
// TODO: Consider merging this into the AVR device table
// array in Targets/AVR.cpp.
-llvm::Optional<StringRef> GetMcuFamilyName(StringRef MCU) {
+llvm::Optional<StringRef> GetMCUFamilyName(StringRef MCU) {
return llvm::StringSwitch<llvm::Optional<StringRef>>(MCU)
.Case("atmega328", Optional<StringRef>("avr5"))
.Case("atmega328p", Optional<StringRef>("avr5"))
.Default(Optional<StringRef>());
}
+llvm::Optional<unsigned> GetMCUSectionAddressData(StringRef MCU) {
+ return llvm::StringSwitch<llvm::Optional<unsigned>>(MCU)
+ .Case("atmega328", Optional<unsigned>(0x800100))
+ .Case("atmega328p", Optional<unsigned>(0x800100))
+ .Default(Optional<unsigned>());
+}
+
const StringRef PossibleAVRLibcLocations[] = {
"/usr/avr",
"/usr/lib/avr",
@@ -59,7 +67,7 @@
// We cannot link any standard libraries without an MCU specified.
D.Diag(diag::warn_drv_avr_mcu_not_specified);
} else {
- Optional<StringRef> FamilyName = GetMcuFamilyName(CPU);
+ Optional<StringRef> FamilyName = GetMCUFamilyName(CPU);
Optional<std::string> AVRLibcRoot = findAVRLibcInstallation();
if (!FamilyName.hasValue()) {
@@ -102,7 +110,8 @@
const char *LinkingOutput) const {
// Compute information about the target AVR.
std::string CPU = getCPUName(Args, getToolChain().getTriple());
- llvm::Optional<StringRef> FamilyName = GetMcuFamilyName(CPU);
+ llvm::Optional<StringRef> FamilyName = GetMCUFamilyName(CPU);
+ llvm::Optional<unsigned> SectionAddressData = GetMCUSectionAddressData(CPU);
std::string Linker = getToolChain().GetProgramPath(getShortName());
ArgStringList CmdArgs;
@@ -118,6 +127,17 @@
Args.AddAllArgs(CmdArgs, options::OPT_L);
getToolChain().AddFilePathLibArgs(Args, CmdArgs);
+ if (SectionAddressData.hasValue()) {
+ std::string DataSectionArg = std::string("-Tdata=0x") +
+ llvm::utohexstr(SectionAddressData.getValue());
+ CmdArgs.push_back(Args.MakeArgString(DataSectionArg));
+ } else {
+ // We do not have an entry for this CPU in the address mapping table yet.
+ getToolChain().getDriver().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.
Index: clang/include/clang/Basic/DiagnosticDriverKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -44,6 +44,10 @@
def warn_drv_avr_family_linking_stdlibs_not_implemented: Warning<
"support for linking stdlibs for microcontroller '%0' is not implemented">,
InGroup<AVRRtlibLinkingQuirks>;
+def warn_drv_avr_linker_section_addresses_not_implemented: Warning<
+ "support for passing the data section address to the linker for "
+ "microcontroller '%0' is not implemented">,
+ InGroup<AVRRtlibLinkingQuirks>;
def warn_drv_avr_stdlib_not_linked: Warning<
"standard library not linked and so no interrupt vector table or "
"compiler runtime routines will be linked">,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D86629.301327.patch
Type: text/x-patch
Size: 3770 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20201028/4c15349f/attachment-0001.bin>
More information about the cfe-commits
mailing list