]> granicus.if.org Git - esp-idf/commitdiff
linker: When using section type attributes, create unique sections
authorAngus Gratton <angus@espressif.com>
Fri, 7 Dec 2018 04:14:58 +0000 (15:14 +1100)
committerbot <bot@espressif.com>
Wed, 19 Dec 2018 04:42:04 +0000 (04:42 +0000)
* Prevents section type conflict errors if (say) const & non-const data
  is put into the same section (ie with DRAM_ATTR)

* Allows linker --gc-sections to remove unused custom sections

components/esp32/include/esp_attr.h
components/esp32/ld/esp32_fragments.lf
components/heap/heap_trace.c
components/newlib/locks.c
tools/ldgen/samples/esp32.lf

index 6d2d5ea84d45dce799c73aca8348bf04d30f4990..e820d892ca413eecf80cfaf5c4871573c5841312 100644 (file)
 //and all variables in shared RAM. These macros can be used to redirect
 //particular functions/variables to other memory regions.
 
-// Forces code into IRAM instead of flash.
-#define IRAM_ATTR __attribute__((section(".iram1")))
+// Forces code into IRAM instead of flash
+#define IRAM_ATTR _SECTION_ATTR_IMPL(".iram1", __COUNTER__)
 
 // Forces data into DRAM instead of flash
-#define DRAM_ATTR __attribute__((section(".dram1")))
+#define DRAM_ATTR _SECTION_ATTR_IMPL(".dram1", __COUNTER__)
 
 // Forces data to be 4 bytes aligned
 #define WORD_ALIGNED_ATTR __attribute__((aligned(4)))
 #define DRAM_STR(str) (__extension__({static const DRAM_ATTR char __c[] = (str); (const char *)&__c;}))
 
 // Forces code into RTC fast memory. See "docs/deep-sleep-stub.rst"
-#define RTC_IRAM_ATTR __attribute__((section(".rtc.text")))
+#define RTC_IRAM_ATTR _SECTION_ATTR_IMPL(".rtc.text", __COUNTER__)
 
 #if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY
 // Forces bss variable into external memory. "
-#define EXT_RAM_ATTR __attribute__((section(".ext_ram.bss")))
+#define EXT_RAM_ATTR _SECTION_ATTR_IMPL(".ext_ram.bss", __COUNTER__)
 #else
 #define EXT_RAM_ATTR 
 #endif
 // Forces data into RTC slow memory. See "docs/deep-sleep-stub.rst"
 // Any variable marked with this attribute will keep its value
 // during a deep sleep / wake cycle.
-#define RTC_DATA_ATTR __attribute__((section(".rtc.data")))
+#define RTC_DATA_ATTR _SECTION_ATTR_IMPL(".rtc.data", __COUNTER__)
 
 // Forces read-only data into RTC memory. See "docs/deep-sleep-stub.rst"
-#define RTC_RODATA_ATTR __attribute__((section(".rtc.rodata")))
+#define RTC_RODATA_ATTR _SECTION_ATTR_IMPL(".rtc.rodata", __COUNTER__)
 
 // Allows to place data into RTC_SLOW memory.
-#define RTC_SLOW_ATTR __attribute__((section(".rtc.force_slow")))
+#define RTC_SLOW_ATTR _SECTION_ATTR_IMPL(".rtc.force_slow", __COUNTER__)
 
 // Allows to place data into RTC_FAST memory.
-#define RTC_FAST_ATTR __attribute__((section(".rtc.force_fast")))
+#define RTC_FAST_ATTR _SECTION_ATTR_IMPL(".rtc.force_fast", __COUNTER__)
 
 // Forces data into noinit section to avoid initialization after restart.
-#define __NOINIT_ATTR __attribute__((section(".noinit")))
+#define __NOINIT_ATTR _SECTION_ATTR_IMPL(".noinit", __COUNTER__)
 
 // Forces data into RTC slow memory of .noinit section.
 // Any variable marked with this attribute will keep its value
 // after restart or during a deep sleep / wake cycle.
-#define RTC_NOINIT_ATTR  __attribute__((section(".rtc_noinit")))
+#define RTC_NOINIT_ATTR  _SECTION_ATTR_IMPL(".rtc_noinit", __COUNTER__)
 
 // Forces to not inline function
 #define NOINLINE_ATTR __attribute__((noinline))
 
+// Implementation for a unique custom section
+//
+// This prevents gcc producing "x causes a section type conflict with y"
+// errors if two variables in the same source file have different linkage (maybe const & non-const) but are placed in the same custom section
+//
+// Using unique sections also means --gc-sections can remove unused
+// data with a custom section type set
+#define _SECTION_ATTR_IMPL(SECTION, COUNTER) __attribute__((section(SECTION "." _COUNTER_STRINGIFY(COUNTER))))
+
+#define _COUNTER_STRINGIFY(COUNTER) #COUNTER
+
 #endif /* __ESP_ATTR_H__ */
index 65063f5bcb9df2b64e2140b8b52a16bce47e8120..0132a11aa4b007bdf1dd74f4ea8497dea4f4f467 100644 (file)
@@ -21,16 +21,16 @@ entries:
 
 [sections:rtc_text]
 entries:
-    .rtc.text
+    .rtc.text+
     .rtc.literal
 
 [sections:rtc_data]
 entries:
-    .rtc.data
+    .rtc.data+
 
 [sections:rtc_rodata]
 entries:
-    .rtc.rodata
+    .rtc.rodata+
 
 [sections:rtc_bss]
 entries:
index 3c9154ef726be103137e45cfb4e300a738852e91..198480859ac565fd7cbd3d3b5190223410ff1c44 100644 (file)
@@ -421,7 +421,7 @@ IRAM_ATTR void *__wrap_heap_caps_malloc(size_t size, uint32_t caps)
     return trace_malloc(size, caps, TRACE_MALLOC_CAPS);
 }
 
-IRAM_ATTR void __wrap_heap_caps_free(void *p) __attribute__((alias("__wrap_free")));
+void __wrap_heap_caps_free(void *p) __attribute__((alias("__wrap_free")));
 
 IRAM_ATTR void *__wrap_heap_caps_realloc(void *p, size_t size, uint32_t caps)
 {
index 646afd72c3bdbbc80e97dbe467604e62bbe5d3fa..708ddab3f00f7235e8df8ec3e22506589e7171c2 100644 (file)
@@ -118,7 +118,7 @@ void IRAM_ATTR _lock_close(_lock_t *lock) {
     portEXIT_CRITICAL(&lock_init_spinlock);
 }
 
-void IRAM_ATTR _lock_close_recursive(_lock_t *lock) __attribute__((alias("_lock_close")));
+void _lock_close_recursive(_lock_t *lock) __attribute__((alias("_lock_close")));
 
 /* Acquire the mutex semaphore for lock. wait up to delay ticks.
    mutex_type is queueQUEUE_TYPE_RECURSIVE_MUTEX or queueQUEUE_TYPE_MUTEX
index 03a93770111dae3fe0e2300e55ce88624336e5ce..251eb34d5cf624edd193c44562660fa19b251376 100644 (file)
@@ -21,16 +21,16 @@ entries:
 
 [sections:rtc_text]
 entries:
-    .rtc.text
+    .rtc.text+
     .rtc.literal
 
 [sections:rtc_data]
 entries:
-    .rtc.data
+    .rtc.data+
 
 [sections:rtc_rodata]
 entries:
-    .rtc.rodata
+    .rtc.rodata+
 
 [sections:rtc_bss]
 entries:
@@ -38,7 +38,7 @@ entries:
 
 [sections:extram_bss]
 entries:
-    .exram.bss
+    .ext_ram.bss+
 
 [sections:iram]
 entries: