Revert "annotations: add positions"

This reverts commit baa1d2cf78.

Turns out this introduced memory badness.  valgrind picks it up on
x86, but it straight out SEGVs on x86.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
David Gibson 2018-11-14 15:24:49 +11:00
parent 403cc79f06
commit a3143fafbf
7 changed files with 23 additions and 67 deletions

View file

@ -180,10 +180,7 @@ devicetree:
*/ */
if (!($<flags>-1 & DTSF_PLUGIN)) if (!($<flags>-1 & DTSF_PLUGIN))
ERROR(&@2, "Label or path %s not found", $1); ERROR(&@2, "Label or path %s not found", $1);
$$ = add_orphan_node( $$ = add_orphan_node(name_node(build_node(NULL, NULL), ""), $2, $1);
name_node(build_node(NULL, NULL, NULL),
""),
$2, $1);
} }
| devicetree DT_LABEL dt_ref nodedef | devicetree DT_LABEL dt_ref nodedef
{ {
@ -263,7 +260,7 @@ devicetree:
nodedef: nodedef:
'{' proplist subnodes '}' ';' '{' proplist subnodes '}' ';'
{ {
$$ = build_node($2, $3, &@$); $$ = build_node($2, $3);
} }
; ;
@ -281,11 +278,11 @@ proplist:
propdef: propdef:
DT_PROPNODENAME '=' propdata ';' DT_PROPNODENAME '=' propdata ';'
{ {
$$ = build_property($1, $3, &@$); $$ = build_property($1, $3);
} }
| DT_PROPNODENAME ';' | DT_PROPNODENAME ';'
{ {
$$ = build_property($1, empty_data, &@$); $$ = build_property($1, empty_data);
} }
| DT_DEL_PROP DT_PROPNODENAME ';' | DT_DEL_PROP DT_PROPNODENAME ';'
{ {
@ -566,7 +563,7 @@ subnode:
} }
| DT_DEL_NODE DT_PROPNODENAME ';' | DT_DEL_NODE DT_PROPNODENAME ';'
{ {
$$ = name_node(build_node_delete(&@$), $2); $$ = name_node(build_node_delete(), $2);
} }
| DT_OMIT_NO_REF subnode | DT_OMIT_NO_REF subnode
{ {

10
dtc.h
View file

@ -158,7 +158,6 @@ struct property {
struct property *next; struct property *next;
struct label *labels; struct label *labels;
struct srcpos *srcpos;
}; };
struct node { struct node {
@ -178,7 +177,6 @@ struct node {
struct label *labels; struct label *labels;
const struct bus_type *bus; const struct bus_type *bus;
struct srcpos *srcpos;
bool omit_if_unused, is_referenced; bool omit_if_unused, is_referenced;
}; };
@ -207,15 +205,13 @@ struct node {
void add_label(struct label **labels, char *label); void add_label(struct label **labels, char *label);
void delete_labels(struct label **labels); void delete_labels(struct label **labels);
struct property *build_property(char *name, struct data val, struct property *build_property(char *name, struct data val);
struct srcpos *srcpos);
struct property *build_property_delete(char *name); struct property *build_property_delete(char *name);
struct property *chain_property(struct property *first, struct property *list); struct property *chain_property(struct property *first, struct property *list);
struct property *reverse_properties(struct property *first); struct property *reverse_properties(struct property *first);
struct node *build_node(struct property *proplist, struct node *children, struct node *build_node(struct property *proplist, struct node *children);
struct srcpos *srcpos); struct node *build_node_delete(void);
struct node *build_node_delete(struct srcpos *srcpos);
struct node *name_node(struct node *node, char *name); struct node *name_node(struct node *node, char *name);
struct node *omit_node_if_unused(struct node *node); struct node *omit_node_if_unused(struct node *node);
struct node *reference_node(struct node *node); struct node *reference_node(struct node *node);

View file

@ -692,7 +692,7 @@ static struct property *flat_read_property(struct inbuf *dtbuf,
val = flat_read_data(dtbuf, proplen); val = flat_read_data(dtbuf, proplen);
return build_property(name, val, NULL); return build_property(name, val);
} }
@ -750,7 +750,7 @@ static struct node *unflatten_tree(struct inbuf *dtbuf,
char *flatname; char *flatname;
uint32_t val; uint32_t val;
node = build_node(NULL, NULL, NULL); node = build_node(NULL, NULL);
flatname = flat_read_string(dtbuf); flatname = flat_read_string(dtbuf);

View file

@ -34,7 +34,7 @@ static struct node *read_fstree(const char *dirname)
if (!d) if (!d)
die("Couldn't opendir() \"%s\": %s\n", dirname, strerror(errno)); die("Couldn't opendir() \"%s\": %s\n", dirname, strerror(errno));
tree = build_node(NULL, NULL, NULL); tree = build_node(NULL, NULL);
while ((de = readdir(d)) != NULL) { while ((de = readdir(d)) != NULL) {
char *tmpname; char *tmpname;
@ -60,8 +60,7 @@ static struct node *read_fstree(const char *dirname)
} else { } else {
prop = build_property(xstrdup(de->d_name), prop = build_property(xstrdup(de->d_name),
data_copy_file(pfile, data_copy_file(pfile,
st.st_size), st.st_size));
NULL);
add_property(tree, prop); add_property(tree, prop);
fclose(pfile); fclose(pfile);
} }

View file

@ -19,7 +19,6 @@
*/ */
#include "dtc.h" #include "dtc.h"
#include "srcpos.h"
/* /*
* Tree building functions * Tree building functions
@ -51,8 +50,7 @@ void delete_labels(struct label **labels)
label->deleted = 1; label->deleted = 1;
} }
struct property *build_property(char *name, struct data val, struct property *build_property(char *name, struct data val)
struct srcpos *srcpos)
{ {
struct property *new = xmalloc(sizeof(*new)); struct property *new = xmalloc(sizeof(*new));
@ -60,7 +58,6 @@ struct property *build_property(char *name, struct data val,
new->name = name; new->name = name;
new->val = val; new->val = val;
new->srcpos = srcpos_copy(srcpos);
return new; return new;
} }
@ -100,8 +97,7 @@ struct property *reverse_properties(struct property *first)
return head; return head;
} }
struct node *build_node(struct property *proplist, struct node *children, struct node *build_node(struct property *proplist, struct node *children)
struct srcpos *srcpos)
{ {
struct node *new = xmalloc(sizeof(*new)); struct node *new = xmalloc(sizeof(*new));
struct node *child; struct node *child;
@ -110,7 +106,6 @@ struct node *build_node(struct property *proplist, struct node *children,
new->proplist = reverse_properties(proplist); new->proplist = reverse_properties(proplist);
new->children = children; new->children = children;
new->srcpos = srcpos_copy(srcpos);
for_each_child(new, child) { for_each_child(new, child) {
child->parent = new; child->parent = new;
@ -119,14 +114,13 @@ struct node *build_node(struct property *proplist, struct node *children,
return new; return new;
} }
struct node *build_node_delete(struct srcpos *srcpos) struct node *build_node_delete(void)
{ {
struct node *new = xmalloc(sizeof(*new)); struct node *new = xmalloc(sizeof(*new));
memset(new, 0, sizeof(*new)); memset(new, 0, sizeof(*new));
new->deleted = 1; new->deleted = 1;
new->srcpos = srcpos_copy(srcpos);
return new; return new;
} }
@ -189,8 +183,6 @@ struct node *merge_nodes(struct node *old_node, struct node *new_node)
old_prop->val = new_prop->val; old_prop->val = new_prop->val;
old_prop->deleted = 0; old_prop->deleted = 0;
free(old_prop->srcpos);
old_prop->srcpos = new_prop->srcpos;
free(new_prop); free(new_prop);
new_prop = NULL; new_prop = NULL;
break; break;
@ -231,8 +223,6 @@ struct node *merge_nodes(struct node *old_node, struct node *new_node)
add_child(old_node, new_child); add_child(old_node, new_child);
} }
old_node->srcpos = srcpos_extend(old_node->srcpos, new_node->srcpos);
/* The new node contents are now merged into the old node. Free /* The new node contents are now merged into the old node. Free
* the new node. */ * the new node. */
free(new_node); free(new_node);
@ -251,18 +241,18 @@ struct node * add_orphan_node(struct node *dt, struct node *new_node, char *ref)
if (ref[0] == '/') { if (ref[0] == '/') {
d = data_append_data(d, ref, strlen(ref) + 1); d = data_append_data(d, ref, strlen(ref) + 1);
p = build_property("target-path", d, NULL); p = build_property("target-path", d);
} else { } else {
d = data_add_marker(d, REF_PHANDLE, ref); d = data_add_marker(d, REF_PHANDLE, ref);
d = data_append_integer(d, 0xffffffff, 32); d = data_append_integer(d, 0xffffffff, 32);
p = build_property("target", d, NULL); p = build_property("target", d);
} }
xasprintf(&name, "fragment@%u", xasprintf(&name, "fragment@%u",
next_orphan_fragment++); next_orphan_fragment++);
name_node(new_node, "__overlay__"); name_node(new_node, "__overlay__");
node = build_node(p, new_node, NULL); node = build_node(p, new_node);
name_node(node, name); name_node(node, name);
add_child(dt, node); add_child(dt, node);
@ -361,7 +351,7 @@ void append_to_property(struct node *node,
p->val = d; p->val = d;
} else { } else {
d = data_append_data(empty_data, data, len); d = data_append_data(empty_data, data, len);
p = build_property(name, d, NULL); p = build_property(name, d);
add_property(node, p); add_property(node, p);
} }
} }
@ -619,11 +609,11 @@ cell_t get_node_phandle(struct node *root, struct node *node)
if (!get_property(node, "linux,phandle") if (!get_property(node, "linux,phandle")
&& (phandle_format & PHANDLE_LEGACY)) && (phandle_format & PHANDLE_LEGACY))
add_property(node, build_property("linux,phandle", d, NULL)); add_property(node, build_property("linux,phandle", d));
if (!get_property(node, "phandle") if (!get_property(node, "phandle")
&& (phandle_format & PHANDLE_EPAPR)) && (phandle_format & PHANDLE_EPAPR))
add_property(node, build_property("phandle", d, NULL)); add_property(node, build_property("phandle", d));
/* If the node *does* have a phandle property, we must /* If the node *does* have a phandle property, we must
* be dealing with a self-referencing phandle, which will be * be dealing with a self-referencing phandle, which will be
@ -797,7 +787,7 @@ static struct node *build_and_name_child_node(struct node *parent, char *name)
{ {
struct node *node; struct node *node;
node = build_node(NULL, NULL, NULL); node = build_node(NULL, NULL);
name_node(node, xstrdup(name)); name_node(node, xstrdup(name));
add_child(parent, node); add_child(parent, node);
@ -859,8 +849,7 @@ static void generate_label_tree_internal(struct dt_info *dti,
/* insert it */ /* insert it */
p = build_property(l->label, p = build_property(l->label,
data_copy_mem(node->fullpath, data_copy_mem(node->fullpath,
strlen(node->fullpath) + 1), strlen(node->fullpath) + 1));
NULL);
add_property(an, p); add_property(an, p);
} }

View file

@ -207,7 +207,6 @@ struct srcpos srcpos_empty = {
.last_line = 0, .last_line = 0,
.last_column = 0, .last_column = 0,
.file = NULL, .file = NULL,
.next = NULL,
}; };
void srcpos_update(struct srcpos *pos, const char *text, int len) void srcpos_update(struct srcpos *pos, const char *text, int len)
@ -235,34 +234,13 @@ struct srcpos *
srcpos_copy(struct srcpos *pos) srcpos_copy(struct srcpos *pos)
{ {
struct srcpos *pos_new; struct srcpos *pos_new;
struct srcfile_state *srcfile_state;
if (!pos)
return NULL;
pos_new = xmalloc(sizeof(struct srcpos)); pos_new = xmalloc(sizeof(struct srcpos));
memcpy(pos_new, pos, sizeof(struct srcpos)); memcpy(pos_new, pos, sizeof(struct srcpos));
/* allocate without free */
srcfile_state = xmalloc(sizeof(struct srcfile_state));
memcpy(srcfile_state, pos->file, sizeof(struct srcfile_state));
pos_new->file = srcfile_state;
return pos_new; return pos_new;
} }
struct srcpos *srcpos_extend(struct srcpos *pos, struct srcpos *newtail)
{
struct srcpos *p;
if (!pos)
return newtail;
for (p = pos; p->next != NULL; p = p->next);
p->next = newtail;
return pos;
}
char * char *
srcpos_string(struct srcpos *pos) srcpos_string(struct srcpos *pos)
{ {

View file

@ -74,7 +74,6 @@ struct srcpos {
int last_line; int last_line;
int last_column; int last_column;
struct srcfile_state *file; struct srcfile_state *file;
struct srcpos *next;
}; };
#define YYLTYPE struct srcpos #define YYLTYPE struct srcpos
@ -106,8 +105,6 @@ extern struct srcpos srcpos_empty;
extern void srcpos_update(struct srcpos *pos, const char *text, int len); extern void srcpos_update(struct srcpos *pos, const char *text, int len);
extern struct srcpos *srcpos_copy(struct srcpos *pos); extern struct srcpos *srcpos_copy(struct srcpos *pos);
extern struct srcpos *srcpos_extend(struct srcpos *new_srcpos,
struct srcpos *old_srcpos);
extern char *srcpos_string(struct srcpos *pos); extern char *srcpos_string(struct srcpos *pos);
extern void PRINTF(3, 0) srcpos_verror(struct srcpos *pos, const char *prefix, extern void PRINTF(3, 0) srcpos_verror(struct srcpos *pos, const char *prefix,