Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
Nodemcu Firmware
Commits
cd585ae9
Commit
cd585ae9
authored
Aug 25, 2021
by
Johny Mattsson
Browse files
Support stripping debug info in Lua 5.1 luac_cross
parent
dba57fa0
Changes
1
Hide whitespace changes
Inline
Side-by-side
components/lua/lua-5.1/host/lflashimg.c
View file @
cd585ae9
...
@@ -181,23 +181,26 @@ static void addTS(lua_State *L, TString *ts) {
...
@@ -181,23 +181,26 @@ static void addTS(lua_State *L, TString *ts) {
* Enumerate all of the Protos in the Proto hiearchy and scan contents to collect
* Enumerate all of the Protos in the Proto hiearchy and scan contents to collect
* all referenced strings in a Lua Array at ToS.
* all referenced strings in a Lua Array at ToS.
*/
*/
static
void
scanProtoStrings
(
lua_State
*
L
,
const
Proto
*
f
)
{
static
void
scanProtoStrings
(
lua_State
*
L
,
const
Proto
*
f
,
int
strip
)
{
/* Table at L->Top[-1] is used to collect the strings */
/* Table at L->Top[-1] is used to collect the strings */
int
i
;
int
i
;
if
(
f
->
source
)
if
(
f
->
source
)
addTS
(
L
,
f
->
source
);
addTS
(
L
,
f
->
source
);
if
(
f
->
packedlineinfo
)
if
(
f
->
packedlineinfo
&&
!
strip
)
addTS
(
L
,
luaS_new
(
L
,
cast
(
const
char
*
,
f
->
packedlineinfo
)));
addTS
(
L
,
luaS_new
(
L
,
cast
(
const
char
*
,
f
->
packedlineinfo
)));
for
(
i
=
0
;
i
<
f
->
sizek
;
i
++
)
{
for
(
i
=
0
;
i
<
f
->
sizek
;
i
++
)
{
if
(
ttisstring
(
f
->
k
+
i
))
if
(
ttisstring
(
f
->
k
+
i
))
addTS
(
L
,
rawtsvalue
(
f
->
k
+
i
));
addTS
(
L
,
rawtsvalue
(
f
->
k
+
i
));
}
}
for
(
i
=
0
;
i
<
f
->
sizeupvalues
;
i
++
)
addTS
(
L
,
f
->
upvalues
[
i
]);
if
(
!
strip
)
for
(
i
=
0
;
i
<
f
->
sizelocvars
;
i
++
)
addTS
(
L
,
f
->
locvars
[
i
].
varname
);
{
for
(
i
=
0
;
i
<
f
->
sizep
;
i
++
)
scanProtoStrings
(
L
,
f
->
p
[
i
]);
for
(
i
=
0
;
i
<
f
->
sizeupvalues
;
i
++
)
addTS
(
L
,
f
->
upvalues
[
i
]);
for
(
i
=
0
;
i
<
f
->
sizelocvars
;
i
++
)
addTS
(
L
,
f
->
locvars
[
i
].
varname
);
}
for
(
i
=
0
;
i
<
f
->
sizep
;
i
++
)
scanProtoStrings
(
L
,
f
->
p
[
i
],
strip
);
}
}
...
@@ -218,7 +221,10 @@ static void createROstrt(lua_State *L, FlashHeader *fh) {
...
@@ -218,7 +221,10 @@ static void createROstrt(lua_State *L, FlashHeader *fh) {
DBG_PRINT
(
"Found: %s
\n
"
,
getstr
(
rawtsvalue
(
L
->
top
-
2
)));
DBG_PRINT
(
"Found: %s
\n
"
,
getstr
(
rawtsvalue
(
L
->
top
-
2
)));
lua_pop
(
L
,
1
);
// dump the value
lua_pop
(
L
,
1
);
// dump the value
}
}
fh
->
nROsize
=
2
<<
luaO_log2
(
fh
->
nROuse
);
// Ensure at least 30% overprovisioning, to reduce pathological chaining if nROuse is just under a power of 2
fh
->
nROsize
=
2
<<
luaO_log2
((
int
)((
double
)
fh
->
nROuse
*
1
.
3
));
DBG_PRINT
(
"nROsize=%u, nROuse=%u
\n
"
,(
unsigned
)
fh
->
nROsize
,(
unsigned
)
fh
->
nROuse
);
FlashAddr
*
hashTab
=
flashAlloc
(
L
,
fh
->
nROsize
*
WORDSIZE
);
FlashAddr
*
hashTab
=
flashAlloc
(
L
,
fh
->
nROsize
*
WORDSIZE
);
toFlashAddr
(
L
,
fh
->
pROhash
,
hashTab
);
toFlashAddr
(
L
,
fh
->
pROhash
,
hashTab
);
...
@@ -354,13 +360,23 @@ static void *flashCopy(lua_State* L, int n, const char *fmt, void *src) {
...
@@ -354,13 +360,23 @@ static void *flashCopy(lua_State* L, int n, const char *fmt, void *src) {
return
dest
;
return
dest
;
}
}
static
void
stripdebug
(
Proto
*
f
)
{
// Yes, this is leaking memory. In the cross compiler, that's *host* memory, and we don't care.
// It's more hassle than it's worth to stop it from doing so.
f
->
packedlineinfo
=
NULL
;
f
->
locvars
=
NULL
;
f
->
upvalues
=
NULL
;
f
->
sizelocvars
=
0
;
f
->
sizeupvalues
=
0
;
}
/* The debug optimised version has a different Proto layout */
/* The debug optimised version has a different Proto layout */
#define PROTO_COPY_MASK "AHAAAAAASIIIIIIIAI"
#define PROTO_COPY_MASK "AHAAAAAASIIIIIIIAI"
/*
/*
* Do the actual prototype copy.
* Do the actual prototype copy.
*/
*/
static
void
*
functionToFlash
(
lua_State
*
L
,
const
Proto
*
orig
)
{
static
void
*
functionToFlash
(
lua_State
*
L
,
const
Proto
*
orig
,
int
strip
)
{
Proto
f
;
Proto
f
;
int
i
;
int
i
;
...
@@ -372,36 +388,43 @@ static void *functionToFlash(lua_State* L, const Proto* orig) {
...
@@ -372,36 +388,43 @@ static void *functionToFlash(lua_State* L, const Proto* orig) {
if
(
f
.
sizep
)
{
/* clone included Protos */
if
(
f
.
sizep
)
{
/* clone included Protos */
Proto
**
p
=
luaM_newvector
(
L
,
f
.
sizep
,
Proto
*
);
Proto
**
p
=
luaM_newvector
(
L
,
f
.
sizep
,
Proto
*
);
for
(
i
=
0
;
i
<
f
.
sizep
;
i
++
)
for
(
i
=
0
;
i
<
f
.
sizep
;
i
++
)
p
[
i
]
=
cast
(
Proto
*
,
functionToFlash
(
L
,
f
.
p
[
i
]));
p
[
i
]
=
cast
(
Proto
*
,
functionToFlash
(
L
,
f
.
p
[
i
]
,
strip
));
f
.
p
=
cast
(
Proto
**
,
flashCopy
(
L
,
f
.
sizep
,
"A"
,
p
));
f
.
p
=
cast
(
Proto
**
,
flashCopy
(
L
,
f
.
sizep
,
"A"
,
p
));
luaM_freearray
(
L
,
p
,
f
.
sizep
,
Proto
*
);
luaM_freearray
(
L
,
p
,
f
.
sizep
,
Proto
*
);
}
}
f
.
k
=
cast
(
TValue
*
,
flashCopy
(
L
,
f
.
sizek
,
"V"
,
f
.
k
));
f
.
k
=
cast
(
TValue
*
,
flashCopy
(
L
,
f
.
sizek
,
"V"
,
f
.
k
));
f
.
code
=
cast
(
Instruction
*
,
flashCopy
(
L
,
f
.
sizecode
,
"I"
,
f
.
code
));
f
.
code
=
cast
(
Instruction
*
,
flashCopy
(
L
,
f
.
sizecode
,
"I"
,
f
.
code
));
if
(
strip
)
stripdebug
(
&
f
);
if
(
f
.
packedlineinfo
)
{
if
(
f
.
packedlineinfo
)
{
TString
*
ts
=
luaS_new
(
L
,
cast
(
const
char
*
,
f
.
packedlineinfo
));
TString
*
ts
=
luaS_new
(
L
,
cast
(
const
char
*
,
f
.
packedlineinfo
));
f
.
packedlineinfo
=
cast
(
unsigned
char
*
,
resolveTString
(
L
,
ts
))
+
sizeof
(
FlashTS
);
f
.
packedlineinfo
=
cast
(
unsigned
char
*
,
resolveTString
(
L
,
ts
))
+
sizeof
(
FlashTS
);
}
}
f
.
locvars
=
cast
(
struct
LocVar
*
,
flashCopy
(
L
,
f
.
sizelocvars
,
"SII"
,
f
.
locvars
));
if
(
!
strip
)
f
.
upvalues
=
cast
(
TString
**
,
flashCopy
(
L
,
f
.
sizeupvalues
,
"S"
,
f
.
upvalues
));
{
f
.
locvars
=
cast
(
struct
LocVar
*
,
flashCopy
(
L
,
f
.
sizelocvars
,
"SII"
,
f
.
locvars
));
f
.
upvalues
=
cast
(
TString
**
,
flashCopy
(
L
,
f
.
sizeupvalues
,
"S"
,
f
.
upvalues
));
}
return
cast
(
void
*
,
flashCopy
(
L
,
1
,
PROTO_COPY_MASK
,
&
f
));
return
cast
(
void
*
,
flashCopy
(
L
,
1
,
PROTO_COPY_MASK
,
&
f
));
}
}
uint
dumpToFlashImage
(
lua_State
*
L
,
const
Proto
*
main
,
lua_Writer
w
,
uint
dumpToFlashImage
(
lua_State
*
L
,
const
Proto
*
main
,
lua_Writer
w
,
void
*
data
,
int
strip
,
void
*
data
,
int
strip
,
lu_int32
address
,
lu_int32
maxSize
)
{
lu_int32
address
,
lu_int32
maxSize
)
{
// parameter strip is ignored for now
(
void
)
strip
;
FlashHeader
*
fh
=
cast
(
FlashHeader
*
,
flashAlloc
(
L
,
sizeof
(
FlashHeader
)));
FlashHeader
*
fh
=
cast
(
FlashHeader
*
,
flashAlloc
(
L
,
sizeof
(
FlashHeader
)));
int
i
,
status
;
int
i
,
status
;
lua_newtable
(
L
);
lua_newtable
(
L
);
scanProtoStrings
(
L
,
main
);
scanProtoStrings
(
L
,
main
,
strip
);
createROstrt
(
L
,
fh
);
createROstrt
(
L
,
fh
);
toFlashAddr
(
L
,
fh
->
mainProto
,
functionToFlash
(
L
,
main
));
toFlashAddr
(
L
,
fh
->
mainProto
,
functionToFlash
(
L
,
main
,
strip
));
fh
->
flash_sig
=
FLASH_SIG
+
(
address
?
FLASH_SIG_ABSOLUTE
:
0
);
fh
->
flash_sig
=
FLASH_SIG
+
(
address
?
FLASH_SIG_ABSOLUTE
:
0
);
fh
->
flash_size
=
curOffset
*
WORDSIZE
;
fh
->
flash_size
=
curOffset
*
WORDSIZE
;
printf
(
"Flash image size: %u bytes (%.2fkiB, %.1f%% of available size of %ukiB)
\n
"
,
+
(
unsigned
)
fh
->
flash_size
,(
double
)
fh
->
flash_size
/
1024
.
0
,(
double
)
fh
->
flash_size
/
(
double
)
maxSize
*
100
.
0
,(
unsigned
)(
maxSize
>>
10
));
if
(
fh
->
flash_size
>
maxSize
)
{
if
(
fh
->
flash_size
>
maxSize
)
{
fatal
(
"The image is too large for specfied LFS size"
);
fatal
(
"The image is too large for specfied LFS size"
);
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment