Skip to content

Commit 4fdaeb6

Browse files
AndrewAndrew
Andrew
authored and
Andrew
committed
cmake: Add new compiler optimization levels definitions
Rename and add multiple kconfig compiler options. New compiler options COMPILER_OPTIMIZATION_PERF and COMPILER_OPTIMIZATION_NONE have been added. Optimize "Debug" and "Release" options to "Default" and "Size" respectively. This commit also does the following: - The COMPILER_OPTIMIZATION_PERF option introduced multiple bug. This commit fixes those bugs. - build.yml also updated to test for the new optimization options.
1 parent 5b9576e commit 4fdaeb6

File tree

15 files changed

+115
-54
lines changed

15 files changed

+115
-54
lines changed

CMakeLists.txt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,16 @@ unset(compile_definitions)
99
# Add the following build specifications here, since these seem to be dependent
1010
# on config values on the root Kconfig.
1111

12-
if(CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE)
12+
if(CONFIG_COMPILER_OPTIMIZATION_SIZE)
1313
list(APPEND compile_options "-Os")
1414
list(APPEND compile_options "-freorder-blocks")
15-
else()
15+
elseif(CONFIG_COMPILER_OPTIMIZATION_DEFAULT)
1616
list(APPEND compile_options "-Og")
17+
elseif(CONFIG_COMPILER_OPTIMIZATION_NONE)
18+
list(APPEND compile_options "-O0")
19+
elseif(CONFIG_COMPILER_OPTIMIZATION_PERF)
20+
list(APPEND compile_options "-O2")
21+
1722
endif()
1823

1924
if(CONFIG_COMPILER_CXX_EXCEPTIONS)

Kconfig

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -70,24 +70,35 @@ mainmenu "Espressif IoT Development Framework Configuration"
7070

7171
choice COMPILER_OPTIMIZATION
7272
prompt "Optimization Level"
73-
default COMPILER_OPTIMIZATION_LEVEL_DEBUG
73+
default COMPILER_OPTIMIZATION_DEFAULT
7474
help
7575
This option sets compiler optimization level (gcc -O argument).
7676

77-
- for "Release" setting, -Os flag is added to CFLAGS.
78-
- for "Debug" setting, -Og flag is added to CFLAGS.
77+
- The "Default" setting will add the -0g flag to CFLAGS.
78+
- The "Size" setting will add the -0s flag to CFLAGS.
79+
- The "Performance" setting will add the -O2 flag to CFLAGS.
80+
- The "None" setting will add the -O0 flag to CFLAGS.
7981

80-
"Release" with -Os produces smaller & faster compiled code but it
81-
may be harder to correlated code addresses to source files when debugging.
82+
The "Size" setting cause the compiled code to be smaller and faster, but
83+
may lead to difficulties of correlating code addresses to source file
84+
lines when debugging.
8285

83-
To add custom optimization settings, set CFLAGS and/or CPPFLAGS
84-
in project makefile, before including $(IDF_PATH)/make/project.mk. Note that
85-
custom optimization levels may be unsupported.
86+
The "Performance" setting causes the compiled code to be larger and faster,
87+
but will be easier to correlated code addresses to source file lines.
8688

87-
config COMPILER_OPTIMIZATION_LEVEL_DEBUG
89+
"None" with -O0 produces compiled code without optimization.
90+
91+
Note that custom optimization levels may be unsupported.
92+
93+
config COMPILER_OPTIMIZATION_DEFAULT
8894
bool "Debug (-Og)"
89-
config COMPILER_OPTIMIZATION_LEVEL_RELEASE
90-
bool "Release (-Os)"
95+
config COMPILER_OPTIMIZATION_SIZE
96+
bool "Optimize for size (-Os)"
97+
config COMPILER_OPTIMIZATION_PERF
98+
bool "Optimize for performance (-O2)"
99+
config COMPILER_OPTIMIZATION_NONE
100+
bool "Debug without optimization (-O0)"
101+
91102
endchoice
92103

93104
choice COMPILER_OPTIMIZATION_ASSERTION_LEVEL

components/esp32/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,7 @@ menu "ESP32-specific"
468468

469469
config ESP32_DEBUG_STUBS_ENABLE
470470
bool "OpenOCD debug stubs"
471-
default COMPILER_OPTIMIZATION_LEVEL_DEBUG
471+
default COMPILER_OPTIMIZATION_DEFAULT
472472
depends on !ESP32_TRAX
473473
help
474474
Debug stubs are used by OpenOCD to execute pre-compiled onboard code which does some useful debugging,

components/esp_eth/src/esp_eth_mac_dm9051.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -390,10 +390,10 @@ static esp_err_t dm9051_verify_id(emac_dm9051_t *emac)
390390
uint8_t id[2];
391391
MAC_CHECK(dm9051_register_read(emac, DM9051_VIDL, &id[0]) == ESP_OK, "read VIDL failed", err, ESP_FAIL);
392392
MAC_CHECK(dm9051_register_read(emac, DM9051_VIDH, &id[1]) == ESP_OK, "read VIDH failed", err, ESP_FAIL);
393-
MAC_CHECK(0x0A46 == *(uint16_t *)id, "wrong Vendor ID", err, ESP_ERR_INVALID_VERSION);
393+
MAC_CHECK(0x0A == id[1] && 0x46 == id[0], "wrong Vendor ID", err, ESP_ERR_INVALID_VERSION);
394394
MAC_CHECK(dm9051_register_read(emac, DM9051_PIDL, &id[0]) == ESP_OK, "read PIDL failed", err, ESP_FAIL);
395395
MAC_CHECK(dm9051_register_read(emac, DM9051_PIDH, &id[1]) == ESP_OK, "read PIDH failed", err, ESP_FAIL);
396-
MAC_CHECK(0x9051 == *(uint16_t *)id, "wrong Product ID", err, ESP_ERR_INVALID_VERSION);
396+
MAC_CHECK(0x90 == id[1] && 0x51 == id[0], "wrong Product ID", err, ESP_ERR_INVALID_VERSION);
397397
return ESP_OK;
398398
err:
399399
return ret;

components/freertos/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ menu "FreeRTOS"
410410

411411
config FREERTOS_TASK_FUNCTION_WRAPPER
412412
bool "Enclose all task functions in a wrapper function"
413-
depends on COMPILER_OPTIMIZATION_LEVEL_DEBUG
413+
depends on COMPILER_OPTIMIZATION_DEFAULT
414414
default y
415415
help
416416
If enabled, all FreeRTOS task functions will be enclosed in a wrapper function.

components/nvs_flash/src/nvs_storage.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ void Storage::populateBlobIndices(TBlobIndexList& blobIdxList)
4545
while (p.findItem(Page::NS_ANY, ItemType::BLOB_IDX, nullptr, itemIndex, item) == ESP_OK) {
4646
BlobIndexNode* entry = new BlobIndexNode;
4747

48-
item.getKey(entry->key, sizeof(entry->key) - 1);
48+
item.getKey(entry->key, sizeof(entry->key));
4949
entry->nsIndex = item.nsIndex;
5050
entry->chunkStart = item.blobIndex.chunkStart;
5151
entry->chunkCount = item.blobIndex.chunkCount;
@@ -101,7 +101,7 @@ esp_err_t Storage::init(uint32_t baseSector, uint32_t sectorCount)
101101
Item item;
102102
while (p.findItem(Page::NS_INDEX, ItemType::U8, nullptr, itemIndex, item) == ESP_OK) {
103103
NamespaceEntry* entry = new NamespaceEntry;
104-
item.getKey(entry->mName, sizeof(entry->mName) - 1);
104+
item.getKey(entry->mName, sizeof(entry->mName));
105105
item.getValue(entry->mIndex);
106106
mNamespaces.push_back(entry);
107107
mNamespaceUsage.set(entry->mIndex, true);
@@ -182,7 +182,7 @@ esp_err_t Storage::writeMultiPageBlob(uint8_t nsIndex, const char* key, const vo
182182
return err;
183183
} else if(getCurrentPage().getVarDataTailroom() == tailroom) {
184184
/* We got the same page or we are not improving.*/
185-
return ESP_ERR_NVS_NOT_ENOUGH_SPACE;
185+
return ESP_ERR_NVS_NOT_ENOUGH_SPACE;
186186
} else {
187187
continue;
188188
}
@@ -308,9 +308,9 @@ esp_err_t Storage::writeItem(uint8_t nsIndex, ItemType datatype, const char* key
308308
if (err != ESP_OK) {
309309
return err;
310310
}
311-
311+
312312
findPage = nullptr;
313-
} else {
313+
} else {
314314
/* Support for earlier versions where BLOBS were stored without index */
315315
err = findItem(nsIndex, datatype, key, findPage, item);
316316
if (err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND) {
@@ -512,14 +512,14 @@ esp_err_t Storage::readItem(uint8_t nsIndex, ItemType datatype, const char* key,
512512
if (err != ESP_ERR_NVS_NOT_FOUND) {
513513
return err;
514514
} // else check if the blob is stored with earlier version format without index
515-
}
515+
}
516516

517517
auto err = findItem(nsIndex, datatype, key, findPage, item);
518518
if (err != ESP_OK) {
519519
return err;
520520
}
521521
return findPage->readItem(nsIndex, datatype, key, data, dataSize);
522-
522+
523523
}
524524

525525
esp_err_t Storage::eraseMultiPageBlob(uint8_t nsIndex, const char* key, VerOffset chunkStart)

components/nvs_flash/src/nvs_types.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
#include <algorithm>
2222
#include "nvs.h"
2323
#include "compressed_enum_table.hpp"
24+
#include "string.h"
2425

26+
using namespace std;
2527

2628
namespace nvs
2729
{
@@ -125,7 +127,8 @@ class Item
125127

126128
void getKey(char* dst, size_t dstSize)
127129
{
128-
strncpy(dst, key, (dstSize<MAX_KEY_LENGTH)?dstSize:MAX_KEY_LENGTH);
130+
strncpy(dst, key, min(dstSize, sizeof(key)));
131+
dst[dstSize-1] = 0;
129132
}
130133

131134
template<typename T>
@@ -138,6 +141,4 @@ class Item
138141

139142
} // namespace nvs
140143

141-
142-
143144
#endif /* nvs_types_h */

components/spiffs/component.mk

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,7 @@ COMPONENT_ADD_INCLUDEDIRS := include
22
COMPONENT_PRIV_INCLUDEDIRS := . spiffs/src
33
COMPONENT_SRCDIRS := . spiffs/src
44

5+
# To avoid warning for strncpy in "spiffs_nucleus.c"
6+
CPPFLAGS += -Wno-stringop-truncation
7+
58
COMPONENT_SUBMODULES := spiffs

components/wifi_provisioning/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,9 @@ idf_component_register(SRCS "${srcs}"
2020
PRIV_INCLUDE_DIRS src proto-c ../protocomm/proto-c
2121
REQUIRES lwip protocomm
2222
PRIV_REQUIRES protobuf-c bt mdns json)
23+
24+
# To avoid warning for strncpy
25+
set_source_files_properties(src/handlers.c src/scheme_softap.c
26+
PROPERTIES COMPILE_FLAGS
27+
-Wno-stringop-truncation
28+
)

components/wifi_provisioning/component.mk

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ COMPONENT_SRCDIRS := src proto-c
22
COMPONENT_ADD_INCLUDEDIRS := include
33
COMPONENT_PRIV_INCLUDEDIRS := src proto-c ../protocomm/proto-c/
44

5+
# To avoid warning for strncpy in "handlers.c" and "scheme_softap.c"
6+
CPPFLAGS += -Wno-stringop-truncation
7+
58
ifndef CONFIG_BT_BLUEDROID_ENABLED
69
ifndef CONFIG_BT_NIMBLE_ENABLED
710
COMPONENT_OBJEXCLUDE := src/scheme_ble.o

components/wpa_supplicant/src/tls/tlsv1_cred.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ static int tlsv1_set_cert_chain(struct x509_certificate **chain,
157157

158158
if (cert) {
159159
u8 *buf = NULL;
160-
size_t len;
160+
size_t len = 0;
161161
int ret;
162162

163163
if (buf == NULL) {
@@ -328,7 +328,7 @@ int tlsv1_set_private_key(struct tlsv1_credentials *cred,
328328

329329
if (private_key) {
330330
u8 *buf = NULL;
331-
size_t len;
331+
size_t len = 0;
332332
int ret;
333333

334334
if (buf == NULL) {
@@ -484,7 +484,7 @@ int tlsv1_set_dhparams(struct tlsv1_credentials *cred, const char *dh_file,
484484

485485
if (dh_file) {
486486
u8 *buf = NULL;
487-
size_t len;
487+
size_t len = 0;
488488
int ret;
489489

490490
if (buf == NULL) {

make/project.mk

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -417,12 +417,22 @@ endif
417417
endif
418418

419419
# Optimization flags are set based on menuconfig choice
420-
ifdef CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE
420+
ifdef CONFIG_COMPILER_OPTIMIZATION_SIZE
421421
OPTIMIZATION_FLAGS = -Os -freorder-blocks
422-
else
422+
endif
423+
424+
ifdef CONFIG_COMPILER_OPTIMIZATION_DEFAULT
423425
OPTIMIZATION_FLAGS = -Og
424426
endif
425427

428+
ifdef CONFIG_COMPILER_OPTIMIZATION_NONE
429+
OPTIMIZATION_FLAGS = -O0
430+
endif
431+
432+
ifdef CONFIG_COMPILER_OPTIMIZATION_PERF
433+
OPTIMIZATION_FLAGS = -O2
434+
endif
435+
426436
ifdef CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE
427437
CPPFLAGS += -DNDEBUG
428438
endif

sdkconfig.rename

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,22 @@ CONFIG_PYTHON CONFIG_SDK_PYTHON
77
CONFIG_MAKE_WARN_UNDEFINED_VARIABLES CONFIG_SDK_MAKE_WARN_UNDEFINED_VARIABLES
88

99
# Compiler options
10-
CONFIG_OPTIMIZATION_COMPILER CONFIG_COMPILER_OPTIMIZATION
11-
CONFIG_OPTIMIZATION_LEVEL_DEBUG CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG
12-
CONFIG_OPTIMIZATION_LEVEL_RELEASE CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE
13-
CONFIG_OPTIMIZATION_ASSERTION_LEVEL CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL
14-
CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE
15-
CONFIG_OPTIMIZATION_ASSERTIONS_SILENT CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT
16-
CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE
17-
CONFIG_CXX_EXCEPTIONS CONFIG_COMPILER_CXX_EXCEPTIONS
18-
CONFIG_CXX_EXCEPTIONS_EMG_POOL_SIZE CONFIG_COMPILER_CXX_EXCEPTIONS_EMG_POOL_SIZE
19-
CONFIG_STACK_CHECK_MODE CONFIG_COMPILER_STACK_CHECK_MODE
20-
CONFIG_STACK_CHECK_NONE CONFIG_COMPILER_STACK_CHECK_MODE_NONE
21-
CONFIG_STACK_CHECK_NORM CONFIG_COMPILER_STACK_CHECK_MODE_NORM
22-
CONFIG_STACK_CHECK_STRONG CONFIG_COMPILER_STACK_CHECK_MODE_STRONG
23-
CONFIG_STACK_CHECK_ALL CONFIG_COMPILER_STACK_CHECK_MODE_ALL
24-
CONFIG_STACK_CHECK CONFIG_COMPILER_STACK_CHECK
25-
CONFIG_WARN_WRITE_STRINGS CONFIG_COMPILER_WARN_WRITE_STRINGS
26-
CONFIG_DISABLE_GCC8_WARNINGS CONFIG_COMPILER_DISABLE_GCC8_WARNINGS
10+
CONFIG_OPTIMIZATION_COMPILER CONFIG_COMPILER_OPTIMIZATION
11+
CONFIG_OPTIMIZATION_LEVEL_DEBUG CONFIG_COMPILER_OPTIMIZATION_DEFAULT
12+
CONFIG_OPTIMIZATION_LEVEL_RELEASE CONFIG_COMPILER_OPTIMIZATION_SIZE
13+
CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG CONFIG_COMPILER_OPTIMIZATION_DEFAULT
14+
CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE CONFIG_COMPILER_OPTIMIZATION_SIZE
15+
CONFIG_OPTIMIZATION_ASSERTION_LEVEL CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL
16+
CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE
17+
CONFIG_OPTIMIZATION_ASSERTIONS_SILENT CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT
18+
CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE
19+
CONFIG_CXX_EXCEPTIONS CONFIG_COMPILER_CXX_EXCEPTIONS
20+
CONFIG_CXX_EXCEPTIONS_EMG_POOL_SIZE CONFIG_COMPILER_CXX_EXCEPTIONS_EMG_POOL_SIZE
21+
CONFIG_STACK_CHECK_MODE CONFIG_COMPILER_STACK_CHECK_MODE
22+
CONFIG_STACK_CHECK_NONE CONFIG_COMPILER_STACK_CHECK_MODE_NONE
23+
CONFIG_STACK_CHECK_NORM CONFIG_COMPILER_STACK_CHECK_MODE_NORM
24+
CONFIG_STACK_CHECK_STRONG CONFIG_COMPILER_STACK_CHECK_MODE_STRONG
25+
CONFIG_STACK_CHECK_ALL CONFIG_COMPILER_STACK_CHECK_MODE_ALL
26+
CONFIG_STACK_CHECK CONFIG_COMPILER_STACK_CHECK
27+
CONFIG_WARN_WRITE_STRINGS CONFIG_COMPILER_WARN_WRITE_STRINGS
28+
CONFIG_DISABLE_GCC8_WARNINGS CONFIG_COMPILER_DISABLE_GCC8_WARNINGS

tools/ci/config/build.yml

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,31 @@ build_template_app:
4545
- export PATH="$IDF_PATH/tools:$PATH"
4646
- export EXTRA_CFLAGS=${PEDANTIC_CFLAGS}
4747
- export EXTRA_CXXFLAGS=${PEDANTIC_CXXFLAGS}
48+
49+
# CONFIG_COMPILER_OPTIMIZATION_DEFAULT with flag -Og
50+
- echo "CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y" >> sdkconfig
4851
- make defconfig
49-
# Test debug build (default)
5052
- make all V=1
51-
# Now test release build
5253
- make clean
53-
- sed -i.bak -e's/CONFIG_OPTIMIZATION_LEVEL_DEBUG\=y/CONFIG_OPTIMIZATION_LEVEL_RELEASE=y/' sdkconfig
54+
55+
# CONFIG_COMPILER_OPTIMIZATION_SIZE with flag -Os
56+
- echo "CONFIG_COMPILER_OPTIMIZATION_SIZE=y" >> sdkconfig
57+
- make defconfig
58+
- make all V=1
59+
- make clean
60+
61+
# CONFIG_COMPILER_OPTIMIZATION_PERF with flag -O2
62+
- echo "CONFIG_COMPILER_OPTIMIZATION_PERF=y" >> sdkconfig
63+
- make defconfig
5464
- make all V=1
65+
- make clean
66+
67+
# CONFIG_COMPILER_OPTIMIZATION_NONE with flag -O0
68+
- echo "CONFIG_COMPILER_OPTIMIZATION_NONE=y" >> sdkconfig
69+
- make defconfig
70+
- make all V=1
71+
- make clean
72+
5573
# Check if there are any stray printf/ets_printf references in WiFi libs
5674
- pushd ../components/esp_wifi/lib_esp32
5775
- test $(xtensa-esp32-elf-nm *.a | grep -w printf | wc -l) -eq 0

tools/ldgen/samples/sdkconfig

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,10 @@ CONFIG_PARTITION_TABLE_MD5=y
8282
#
8383
# Compiler options
8484
#
85-
CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y
86-
CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE=
85+
CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y
86+
CONFIG_COMPILER_OPTIMIZATION_SIZE=
87+
CONFIG_COMPILER_OPTIMIZATION_NONE=
88+
CONFIG_COMPILER_OPTIMIZATION_PERF=
8789
CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y
8890
CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=
8991
CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=

0 commit comments

Comments
 (0)