---
name: "dwarf_new_expr"
section: "3"
platform: "freebsd"
package: "base"
version: "16.0-CURRENT-20261027-61c70dc16a79"
release: "FreeBSD 16.0-CURRENT (2026-10-27)"
platforms: ["freebsd"]
url: "https://new.carta.tech/dwarf_new_expr"
---

# dwarf\_new\_expr(3)

create a location expression descriptor

## NAME

**dwarf\_new\_expr** – create a location expression descriptor

## LIBRARY

library “libdwarf”

## SYNOPSIS

**#include \<libdwarf.h\>**

*Dwarf\_P\_Expr*\

**dwarf\_new\_expr**(*Dwarf\_P\_Debug dbg*, *Dwarf\_Error \*err*);

## DESCRIPTION

Function **dwarf\_new\_expr**() allocates a DWARF location expression descriptor used to build up a location expression stream.

The application can use the functions [dwarf\_add\_expr\_gen(3)](/dwarf_add_expr_gen/3.md) and [dwarf\_add\_expr\_addr\_b(3)](/dwarf_add_expr_addr_b/3.md) to add location expression operators to the created descriptor. When done, the application can call the function [dwarf\_expr\_into\_block(3)](/dwarf_expr_into_block/3.md) to retrieve the generated byte stream for the location expression, or call the function [dwarf\_add\_AT\_location\_expr(3)](/dwarf_add_AT_location_expr/3.md) to create an attribute with the location expression stream as its value.

Argument *dbg* should reference a DWARF producer instance allocated using [dwarf\_producer\_init(3)](/dwarf_producer_init/3.md) or [dwarf\_producer\_init\_b(3)](/dwarf_producer_init_b/3.md).

If argument *err* is not NULL, it will be used to store error information in case of an error.

## RETURN VALUES

On success, function **dwarf\_new\_expr**() returns the created location expression descriptor. In case of an error, function **dwarf\_new\_expr**() returns DW\_DLV\_BADADDR and sets the argument *err*.

## EXAMPLES

To create a location expression descriptor, add location expression operators to it and to retrieve the generated byte stream, use:

```
Dwarf_P_Debug dbg;
Dwarf_Error de;
Dwarf_P_Expr pe;
Dwarf_Addr buf;
Dwarf_Unsigned len;
/* ...Assume that `dbg' refers to a DWARF producer instance... */
if ((pe = dwarf_new_expr(dbg, &de)) == DW_DLV_BADADDR) {
	warnx("dwarf_new_expr failed: %s", dwarf_errmsg(-1));
	return;
}
if (dwarf_add_expr_gen(pe, DW_OP_regx, 55, 0, &de) ==
    DW_DLV_NOCOUNT) {
	warnx("dwarf_add_expr_gen failed: %s", dwarf_errmsg(-1));
	return;
}
if ((buf = dwarf_expr_into_block(pe, &len, &de)) ==
    DW_DLV_BADADDR) {
	warnx("dwarf_expr_into_block failed: %s",
	    dwarf_errmsg(-1));
	return;
}
```

## ERRORS

Function **dwarf\_new\_expr**() can fail with:

- \[DW\_DLE\_ARGUMENT\]

  Argument *dbg* was NULL.

- \[DW\_DLE\_MEMORY\]

  An out of memory condition was encountered during the execution of the function.

## SEE ALSO

[dwarf(3)](/dwarf/3.md), [dwarf\_add\_AT\_location\_expr(3)](/dwarf_add_AT_location_expr/3.md), [dwarf\_add\_expr\_addr(3)](/dwarf_add_expr_addr/3.md), [dwarf\_add\_expr\_addr\_b(3)](/dwarf_add_expr_addr_b/3.md), [dwarf\_add\_expr\_gen(3)](/dwarf_add_expr_gen/3.md), [dwarf\_expr\_current\_offset(3)](/dwarf_expr_current_offset/3.md), [dwarf\_expr\_into\_block(3)](/dwarf_expr_into_block/3.md), [dwarf\_producer\_init(3)](/dwarf_producer_init/3.md), [dwarf\_producer\_init\_b(3)](/dwarf_producer_init_b/3.md)
